@kenyaemr/esm-patient-registration-app 4.6.0 → 5.2.2

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 (108) hide show
  1. package/dist/130.js +1 -1
  2. package/dist/130.js.LICENSE.txt +0 -2
  3. package/dist/130.js.map +1 -1
  4. package/dist/152.js +1 -0
  5. package/dist/152.js.map +1 -0
  6. package/dist/255.js +2 -0
  7. package/dist/255.js.map +1 -0
  8. package/dist/303.js +1 -0
  9. package/dist/303.js.map +1 -0
  10. package/dist/319.js +1 -1
  11. package/dist/330.js +1 -1
  12. package/dist/388.js +2 -0
  13. package/dist/388.js.LICENSE.txt +34 -0
  14. package/dist/388.js.map +1 -0
  15. package/dist/460.js +1 -1
  16. package/dist/537.js +1 -1
  17. package/dist/537.js.map +1 -1
  18. package/dist/574.js +1 -1
  19. package/dist/59.js +1 -0
  20. package/dist/59.js.map +1 -0
  21. package/dist/598.js +1 -0
  22. package/dist/598.js.map +1 -0
  23. package/dist/62.js +1 -1
  24. package/dist/62.js.map +1 -1
  25. package/dist/729.js +1 -0
  26. package/dist/729.js.map +1 -0
  27. package/dist/735.js +1 -1
  28. package/dist/757.js +1 -1
  29. package/dist/788.js +1 -1
  30. package/dist/807.js +1 -1
  31. package/dist/833.js +1 -1
  32. package/dist/840.js +1 -0
  33. package/dist/840.js.map +1 -0
  34. package/dist/main.js +1 -1
  35. package/dist/main.js.LICENSE.txt +35 -0
  36. package/dist/main.js.map +1 -1
  37. package/dist/openmrs-esm-patient-registration-app.js +1 -1
  38. package/dist/openmrs-esm-patient-registration-app.js.buildmanifest.json +114 -221
  39. package/dist/openmrs-esm-patient-registration-app.js.map +1 -1
  40. package/dist/routes.json +1 -1
  41. package/package.json +4 -3
  42. package/src/declarations.d.ts +2 -0
  43. package/src/index.ts +23 -14
  44. package/src/patient-registration/field/address/address-field.component.tsx +2 -2
  45. package/src/patient-registration/field/address/custom-address-field.component.tsx +3 -2
  46. package/src/patient-registration/field/dob/dob.component.tsx +51 -42
  47. package/src/patient-registration/field/dob/dob.test.tsx +1 -14
  48. package/src/patient-registration/field/field.resource.ts +5 -5
  49. package/src/patient-registration/field/id/id-field.component.tsx +8 -6
  50. package/src/patient-registration/field/id/{identifier-selection-overlay.tsx → identifier-selection-overlay.component.tsx} +27 -23
  51. package/src/patient-registration/field/obs/obs-field.component.tsx +4 -3
  52. package/src/patient-registration/field/person-attributes/coded-attributes.component.tsx +2 -1
  53. package/src/patient-registration/field/person-attributes/coded-person-attribute-field.component.tsx +4 -3
  54. package/src/patient-registration/field/person-attributes/person-attribute-field.component.tsx +8 -2
  55. package/src/patient-registration/field/person-attributes/person-attributes.resource.tsx +1 -1
  56. package/src/patient-registration/field/person-attributes/text-person-attribute-field.component.tsx +3 -2
  57. package/src/patient-registration/input/basic-input/input/input.component.tsx +122 -2
  58. package/src/patient-registration/input/combo-input/combo-input.component.tsx +7 -6
  59. package/src/patient-registration/input/custom-input/autosuggest/autosuggest.component.tsx +109 -6
  60. package/src/patient-registration/input/custom-input/autosuggest/autosuggest.scss +9 -0
  61. package/src/patient-registration/input/custom-input/autosuggest/autosuggest.test.tsx +2 -2
  62. package/src/patient-registration/input/dummy-data/dummy-data-input.component.tsx +2 -1
  63. package/src/patient-registration/patient-registration.component.tsx +49 -44
  64. package/src/patient-registration/patient-registration.resource.tsx +18 -7
  65. package/src/patient-registration/patient-registration.scss +6 -0
  66. package/src/patient-registration/patient-registration.test.tsx +19 -21
  67. package/src/patient-registration/section/death-info/death-info-section.component.tsx +2 -1
  68. package/src/patient-registration/section/demographics/demographics-section.test.tsx +1 -14
  69. package/src/patient-registration/section/patient-relationships/relationships-section.component.tsx +27 -20
  70. package/src/patient-registration/section/patient-relationships/relationships.resource.tsx +1 -1
  71. package/src/patient-registration/validation/patient-registration-validation.tsx +6 -0
  72. package/src/root.component.tsx +3 -2
  73. package/src/routes.json +7 -0
  74. package/translations/am.json +18 -7
  75. package/translations/ar.json +17 -6
  76. package/translations/en.json +16 -5
  77. package/translations/es.json +17 -6
  78. package/translations/fr.json +18 -7
  79. package/translations/he.json +28 -17
  80. package/translations/km.json +30 -19
  81. package/dist/117.js +0 -2
  82. package/dist/117.js.map +0 -1
  83. package/dist/218.js +0 -1
  84. package/dist/218.js.map +0 -1
  85. package/dist/275.js +0 -1
  86. package/dist/275.js.map +0 -1
  87. package/dist/317.js +0 -2
  88. package/dist/317.js.LICENSE.txt +0 -6
  89. package/dist/317.js.map +0 -1
  90. package/dist/348.js +0 -1
  91. package/dist/348.js.map +0 -1
  92. package/dist/520.js +0 -2
  93. package/dist/520.js.LICENSE.txt +0 -14
  94. package/dist/520.js.map +0 -1
  95. package/dist/635.js +0 -1
  96. package/dist/635.js.map +0 -1
  97. package/dist/68.js +0 -1
  98. package/dist/68.js.map +0 -1
  99. package/dist/693.js +0 -1
  100. package/dist/693.js.map +0 -1
  101. package/dist/742.js +0 -1
  102. package/dist/742.js.map +0 -1
  103. package/dist/857.js +0 -1
  104. package/dist/857.js.map +0 -1
  105. package/dist/975.js +0 -1
  106. package/dist/975.js.map +0 -1
  107. /package/dist/{117.js.LICENSE.txt → 255.js.LICENSE.txt} +0 -0
  108. /package/src/patient-registration/ui-components/overlay/{index.tsx → overlay.component.tsx} +0 -0
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { BrowserRouter as Router, useParams } from 'react-router-dom';
3
3
  import { render, screen, waitFor, within } from '@testing-library/react';
4
4
  import userEvent from '@testing-library/user-event';
5
- import { showToast, useConfig, usePatient } from '@openmrs/esm-framework';
5
+ import { showSnackbar, useConfig, usePatient } from '@openmrs/esm-framework';
6
6
  import { FormManager } from './form-manager';
7
7
  import { saveEncounter, savePatient } from './patient-registration.resource';
8
8
  import type { Encounter } from './patient-registration.types';
@@ -11,13 +11,12 @@ import { PatientRegistration } from './patient-registration.component';
11
11
  import { RegistrationConfig } from '../config-schema';
12
12
  import { mockedAddressTemplate } from './field/address/tests/mocks';
13
13
  import { mockPatient } from '../../../../tools/test-helpers';
14
- import { OpenmrsDatePicker } from '@openmrs/esm-styleguide/src/public';
15
14
 
16
15
  const mockedUseConfig = useConfig as jest.Mock;
17
16
  const mockedUsePatient = usePatient as jest.Mock;
18
17
  const mockedSaveEncounter = saveEncounter as jest.Mock;
19
18
  const mockedSavePatient = savePatient as jest.Mock;
20
- const mockedShowToast = showToast as jest.Mock;
19
+ const mockedShowSnackbar = showSnackbar as jest.Mock;
21
20
 
22
21
  jest.setTimeout(10000);
23
22
 
@@ -59,17 +58,6 @@ jest.mock('@openmrs/esm-framework', () => {
59
58
  ...originalModule,
60
59
  validator: jest.fn(),
61
60
  getLocale: jest.fn().mockReturnValue('en'),
62
- OpenmrsDatePicker: (datePickerProps) => (
63
- <OpenmrsDatePicker
64
- id={datePickerProps.id}
65
- dateFormat={datePickerProps.dateFormat}
66
- onChange={datePickerProps.onChange}
67
- maxDate={datePickerProps.maxDate}
68
- labelText={datePickerProps.labelText}
69
- value={datePickerProps.value}
70
- carbonOptions={datePickerProps.carbonOptions}
71
- />
72
- ),
73
61
  };
74
62
  });
75
63
 
@@ -93,6 +81,14 @@ let mockOpenmrsConfig: RegistrationConfig = {
93
81
  ],
94
82
  fieldDefinitions: [],
95
83
  fieldConfigurations: {
84
+ dateOfBirth: {
85
+ allowEstimatedDateOfBirth: true,
86
+ useEstimatedDateOfBirth: {
87
+ enabled: true,
88
+ dayOfMonth: new Date().getDay(),
89
+ month: new Date().getMonth(),
90
+ },
91
+ },
96
92
  name: {
97
93
  displayMiddleName: true,
98
94
  allowUnidentifiedPatients: true,
@@ -192,7 +188,7 @@ describe('patient registration component', () => {
192
188
  mockedUseConfig.mockReturnValue(mockOpenmrsConfig);
193
189
  mockedSavePatient.mockReturnValue({ data: { uuid: 'new-pt-uuid' }, ok: true });
194
190
  mockedSaveEncounter.mockClear();
195
- mockedShowToast.mockClear();
191
+ mockedShowSnackbar.mockClear();
196
192
  jest.clearAllMocks();
197
193
  });
198
194
 
@@ -339,15 +335,17 @@ describe('patient registration component', () => {
339
335
  await waitFor(() => expect(mockedSavePatient).toHaveBeenCalledTimes(1));
340
336
  await waitFor(() => expect(mockedSaveEncounter).toHaveBeenCalledTimes(1));
341
337
  await waitFor(() =>
342
- expect(mockedShowToast).toHaveBeenCalledWith(expect.objectContaining({ description: 'an error message' })),
338
+ expect(mockedShowSnackbar).toHaveBeenCalledWith(expect.objectContaining({ subtitle: 'an error message' })),
343
339
  );
344
340
 
345
341
  mockedSaveEncounter.mockResolvedValue({});
346
342
 
347
- await user.click(screen.getByText('Register Patient'));
343
+ await waitFor(() => user.click(screen.getByText('Register Patient')));
348
344
  await waitFor(() => expect(mockedSavePatient).toHaveBeenCalledTimes(2));
349
345
  await waitFor(() => expect(mockedSaveEncounter).toHaveBeenCalledTimes(2));
350
- await waitFor(() => expect(mockedShowToast).toHaveBeenCalledWith(expect.objectContaining({ kind: 'success' })));
346
+ await waitFor(() =>
347
+ expect(mockedShowSnackbar).toHaveBeenCalledWith(expect.objectContaining({ kind: 'success' })),
348
+ );
351
349
  });
352
350
  });
353
351
 
@@ -356,11 +354,11 @@ describe('patient registration component', () => {
356
354
  mockedUseConfig.mockReturnValue(mockOpenmrsConfig);
357
355
  mockedSavePatient.mockReturnValue({ data: { uuid: 'new-pt-uuid' }, ok: true });
358
356
  mockedSaveEncounter.mockClear();
359
- mockedShowToast.mockClear();
357
+ mockedShowSnackbar.mockClear();
360
358
  jest.clearAllMocks();
361
359
  });
362
360
 
363
- fit('edits patient demographics', async () => {
361
+ it('edits patient demographics', async () => {
364
362
  const user = userEvent.setup();
365
363
 
366
364
  mockedSavePatient.mockResolvedValue({});
@@ -394,7 +392,7 @@ describe('patient registration component', () => {
394
392
  expect(givenNameInput.value).toBe('John');
395
393
  expect(familyNameInput.value).toBe('Wilson');
396
394
  expect(middleNameInput.value).toBeFalsy();
397
- expect(dateOfBirthInput.value).toBe('04/04/1972');
395
+ expect(dateOfBirthInput.value).toBe('4/4/1972');
398
396
  expect(genderInput.value).toBe('Male');
399
397
 
400
398
  // do some edits
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
+ import classNames from 'classnames';
2
3
  import { useTranslation } from 'react-i18next';
3
4
  import { Input } from '../../input/basic-input/input/input.component';
4
5
  import { SelectInput } from '../../input/basic-input/select/select-input.component';
@@ -11,7 +12,7 @@ export const DeathInfoSection = () => {
11
12
 
12
13
  return (
13
14
  <section className={styles.formSection} aria-label="Death Info Section">
14
- <h5 className={`omrs-type-title-5 ${styles.formSectionTitle}`}>Death Info</h5>
15
+ <h5 className={classNames('omrs-type-title-5', styles.formSectionTitle)}>Death Info</h5>
15
16
  <section className={styles.fieldGroup}>
16
17
  <Input labelText={t('isDeadInputLabel', 'Is Dead')} name="isDead" id="isDead" />
17
18
  {values.isDead && (
@@ -4,8 +4,7 @@ import { Formik, Form } from 'formik';
4
4
  import { initialFormValues } from '../../patient-registration.component';
5
5
  import { DemographicsSection } from './demographics-section.component';
6
6
  import { PatientRegistrationContext } from '../../patient-registration-context';
7
- import { FormValues } from '../../patient-registration-types';
8
- import { OpenmrsDatePicker } from '@openmrs/esm-styleguide/src/public';
7
+ import { FormValues } from '../../patient-registration.types';
9
8
 
10
9
  jest.mock('@openmrs/esm-framework', () => {
11
10
  const originalModule = jest.requireActual('@openmrs/esm-framework');
@@ -16,18 +15,6 @@ jest.mock('@openmrs/esm-framework', () => {
16
15
  useConfig: jest.fn().mockImplementation(() => ({
17
16
  fieldConfigurations: { dateOfBirth: { useEstimatedDateOfBirth: { enabled: true, dayOfMonth: 0, month: 0 } } },
18
17
  })),
19
- getLocale: jest.fn().mockReturnValue('en'),
20
- OpenmrsDatePicker: (datePickerProps) => (
21
- <OpenmrsDatePicker
22
- id={datePickerProps.id}
23
- dateFormat={datePickerProps.dateFormat}
24
- onChange={datePickerProps.onChange}
25
- maxDate={datePickerProps.maxDate}
26
- labelText={datePickerProps.labelText}
27
- value={datePickerProps.value}
28
- carbonOptions={datePickerProps.carbonOptions}
29
- />
30
- ),
31
18
  };
32
19
  });
33
20
 
@@ -40,27 +40,33 @@ const RelationshipView: React.FC<RelationshipViewProps> = ({
40
40
  }) => {
41
41
  const { t } = useTranslation();
42
42
  const { setFieldValue } = React.useContext(PatientRegistrationContext);
43
-
43
+ const [isInvalid, setIsInvalid] = useState<boolean>(false);
44
44
  const newRelationship = !relationship.uuid;
45
45
 
46
- const handleRelationshipTypeChange = useCallback((event) => {
47
- const { target } = event;
48
- const field = target.name;
49
- const value = target.options[target.selectedIndex].value;
50
- setFieldValue(field, value);
51
- if (!relationship?.action) {
52
- setFieldValue(`relationships[${index}].action`, 'UPDATE');
53
- }
54
- }, []);
46
+ const handleRelationshipTypeChange = useCallback(
47
+ (event) => {
48
+ const { target } = event;
49
+ const field = target.name;
50
+ const value = target.options[target.selectedIndex].value;
51
+ setFieldValue(field, value);
52
+ if (!relationship?.action) {
53
+ setFieldValue(`relationships[${index}].action`, 'UPDATE');
54
+ }
55
+ },
56
+ [index, relationship?.action, setFieldValue],
57
+ );
55
58
 
56
- const handleSuggestionSelected = useCallback((field: string, selectedSuggestion: string) => {
57
- setFieldValue(field, selectedSuggestion);
58
- }, []);
59
+ const handleSuggestionSelected = useCallback(
60
+ (field: string, selectedSuggestion: string) => {
61
+ setIsInvalid(!selectedSuggestion);
62
+ setFieldValue(field, selectedSuggestion);
63
+ },
64
+ [setFieldValue],
65
+ );
59
66
 
60
67
  const searchPerson = async (query: string) => {
61
68
  const abortController = new AbortController();
62
- const searchResults = await fetchPerson(query);
63
- return searchResults.data.results;
69
+ return await fetchPerson(query, abortController);
64
70
  };
65
71
 
66
72
  const deleteRelationship = useCallback(() => {
@@ -69,7 +75,7 @@ const RelationshipView: React.FC<RelationshipViewProps> = ({
69
75
  } else {
70
76
  setFieldValue(`relationships[${index}].action`, 'DELETE');
71
77
  }
72
- }, [relationship, index]);
78
+ }, [relationship, index, remove, setFieldValue]);
73
79
 
74
80
  const restoreRelationship = useCallback(() => {
75
81
  setFieldValue(`relationships[${index}]`, {
@@ -77,7 +83,7 @@ const RelationshipView: React.FC<RelationshipViewProps> = ({
77
83
  action: undefined,
78
84
  relationshipType: relationship.initialrelationshipTypeValue,
79
85
  });
80
- }, [index]);
86
+ }, [index, setFieldValue, relationship]);
81
87
 
82
88
  return relationship.action !== 'DELETE' ? (
83
89
  <div className={styles.relationship}>
@@ -95,15 +101,16 @@ const RelationshipView: React.FC<RelationshipViewProps> = ({
95
101
  <div>
96
102
  {newRelationship ? (
97
103
  <Autosuggest
98
- name={`relationships[${index}].relatedPersonUuid`}
104
+ id={`relationships[${index}].relatedPersonUuid`}
99
105
  labelText={t('relativeFullNameLabelText', 'Full name')}
100
106
  placeholder={t('relativeNamePlaceholder', 'Firstname Familyname')}
101
107
  defaultValue={relationship.relatedPersonName}
102
108
  onSuggestionSelected={handleSuggestionSelected}
109
+ invalid={isInvalid}
110
+ invalidText={t('relationshipPersonMustExist', 'Related person must be an existing person')}
103
111
  getSearchResults={searchPerson}
104
112
  getDisplayValue={(item) => item.display}
105
113
  getFieldValue={(item) => item.uuid}
106
- required
107
114
  />
108
115
  ) : (
109
116
  <>
@@ -113,7 +120,7 @@ const RelationshipView: React.FC<RelationshipViewProps> = ({
113
120
  )}
114
121
  </div>
115
122
  </div>
116
- <div className={`${styles.selectRelationshipType}`} style={{ marginBottom: '1rem' }}>
123
+ <div className={styles.selectRelationshipType} style={{ marginBottom: '1rem' }}>
117
124
  <Layer>
118
125
  <Select
119
126
  id="select"
@@ -1,4 +1,4 @@
1
- import { FetchResponse, openmrsFetch, showToast } from '@openmrs/esm-framework';
1
+ import { FetchResponse, openmrsFetch } from '@openmrs/esm-framework';
2
2
  import { RelationshipValue } from '../../patient-registration.types';
3
3
  import useSWR from 'swr';
4
4
  import { useMemo } from 'react';
@@ -43,4 +43,10 @@ export const validationSchema = Yup.object({
43
43
  ),
44
44
  ),
45
45
  ),
46
+ relationships: Yup.array().of(
47
+ Yup.object().shape({
48
+ relatedPersonUuid: Yup.string().required(),
49
+ relationshipType: Yup.string().required(),
50
+ }),
51
+ ),
46
52
  });
@@ -1,4 +1,6 @@
1
1
  import React, { useMemo } from 'react';
2
+ import classNames from 'classnames';
3
+ import useSWRImmutable from 'swr/immutable';
2
4
  import { BrowserRouter, Route, Routes } from 'react-router-dom';
3
5
  import { Grid, Row } from '@carbon/react';
4
6
  import { ExtensionSlot, useConnectivity, useSession } from '@openmrs/esm-framework';
@@ -10,7 +12,6 @@ import {
10
12
  } from './offline.resources';
11
13
  import { FormManager } from './patient-registration/form-manager';
12
14
  import { PatientRegistration } from './patient-registration/patient-registration.component';
13
- import useSWRImmutable from 'swr/immutable';
14
15
  import styles from './root.scss';
15
16
 
16
17
  export default function Root() {
@@ -31,7 +32,7 @@ export default function Root() {
31
32
  );
32
33
 
33
34
  return (
34
- <main className={`omrs-main-content ${styles.root}`}>
35
+ <main className={classNames('omrs-main-content', styles.root)}>
35
36
  <Grid className={styles.grid}>
36
37
  <Row>
37
38
  <ExtensionSlot name="breadcrumbs-slot" />
package/src/routes.json CHANGED
@@ -45,6 +45,13 @@
45
45
  "online": true,
46
46
  "offline": true
47
47
  },
48
+ {
49
+ "component": "editPatientDetailsButton",
50
+ "name": "edit-patient-details-button",
51
+ "slot": "patient-search-actions-slot",
52
+ "online": true,
53
+ "offline": true
54
+ },
48
55
  {
49
56
  "component": "deleteIdentifierConfirmationModal",
50
57
  "name": "delete-identifier-confirmation-modal",
@@ -8,7 +8,9 @@
8
8
  "birthFieldLabelText": "Birth",
9
9
  "cancel": "Cancel",
10
10
  "causeOfDeathInputLabel": "Cause of Death",
11
+ "closeOverlay": "Close overlay",
11
12
  "configure": "Configure",
13
+ "configureIdentifiers": "Configure identifiers",
12
14
  "contactSection": "Contact Details",
13
15
  "createNew": "Create New",
14
16
  "dateOfBirthLabelText": "Date of Birth",
@@ -25,6 +27,7 @@
25
27
  "edit": "Edit",
26
28
  "editIdentifierTooltip": "Edit",
27
29
  "editPatientDetails": "Edit patient details",
30
+ "editPatientDetailsBreadcrumb": "Edit patient details",
28
31
  "error": "Error",
29
32
  "errorFetchingOrderedFields": "Error occured fetching ordered fields for address hierarchy",
30
33
  "estimatedAgeInMonthsLabelText": "Estimated age in months",
@@ -32,7 +35,6 @@
32
35
  "familyNameLabelText": "Family Name",
33
36
  "familyNameRequired": "",
34
37
  "female": "Female",
35
- "fieldErrorTitleMessage": "The following fields have errors:",
36
38
  "fullNameLabelText": "Full Name",
37
39
  "genderLabelText": "Sex",
38
40
  "genderRequired": "",
@@ -41,6 +43,7 @@
41
43
  "givenNameRequired": "",
42
44
  "identifierValueRequired": "Identifier value is required",
43
45
  "idFieldLabelText": "Identifiers",
46
+ "IDInstructions": "Select the identifiers you'd like to add for this patient:",
44
47
  "incompleteForm": "Incomplete form",
45
48
  "invalidEmail": "",
46
49
  "invalidInput": "Invalid Input",
@@ -58,27 +61,35 @@
58
61
  "other": "Other",
59
62
  "patient": "Patient",
60
63
  "patientNameKnown": "Patient's Name is Known?",
64
+ "patientRegistrationBreadcrumb": "Patient Registration",
61
65
  "registerPatient": "Register Patient",
62
- "registrationSuccessToastDescription": "The patient can now be found by searching for them using their name or ID number",
63
- "registrationSuccessToastTitle": "New Patient Created",
66
+ "registerPatientSuccessSnackbarSubtitle": "The patient can now be found by searching for them using their name or ID number",
67
+ "registerPatientSuccessSnackbarTitle": "New Patient Created",
68
+ "registrationErrorSnackbarTitle": "Patient Registration Failed",
64
69
  "relationship": "Relationship",
70
+ "relationshipPersonMustExist": "Related person must be an existing person",
65
71
  "relationshipPlaceholder": "Relationship",
66
72
  "relationshipRemovedText": "Relationship removed",
67
73
  "relationshipsSection": "Relationships",
68
74
  "relationshipToPatient": "Relationship to patient",
69
- "relativeFullNameLabelText": "Full name",
75
+ "relativeFullNameLabelText": "Related person",
70
76
  "relativeNamePlaceholder": "Firstname Familyname",
71
77
  "resetIdentifierTooltip": "Reset",
72
78
  "restoreRelationshipActionButton": "Undo",
73
79
  "searchAddress": "Search address",
80
+ "searchIdentifierPlaceholder": "Search identifier",
74
81
  "selectAnOption": "Select an option",
75
82
  "sexFieldLabelText": "Sex",
83
+ "source": "Source",
76
84
  "stroke": "Stroke",
77
- "unableToFetch": "Unable to fetch person attribute type - {personattributetype}",
85
+ "submitting": "Submitting",
86
+ "unableToFetch": "Unable to fetch person attribute type - {{personattributetype}}",
78
87
  "unknown": "Unknown",
88
+ "unknownPatientAttributeType": "Patient attribute type has unknown format {{personAttributeTypeFormat}}",
79
89
  "updatePatient": "Update Patient",
80
- "updationSuccessToastDescription": "The patient's information has been successfully updated",
81
- "updationSuccessToastTitle": "Patient Details Updated",
90
+ "updatePatientErrorSnackbarTitle": "Patient Details Update Failed",
91
+ "updatePatientSuccessSnackbarSubtitle": "The patient's information has been successfully updated",
92
+ "updatePatientSuccessSnackbarTitle": "Patient Details Updated",
82
93
  "yearsEstimateRequired": "",
83
94
  "yes": "Yes"
84
95
  }
@@ -8,7 +8,9 @@
8
8
  "birthFieldLabelText": "الميلاد",
9
9
  "cancel": "إلغاء",
10
10
  "causeOfDeathInputLabel": "سبب الوفاة",
11
+ "closeOverlay": "Close overlay",
11
12
  "configure": "تكوين",
13
+ "configureIdentifiers": "Configure identifiers",
12
14
  "contactSection": "تفاصيل الاتصال",
13
15
  "createNew": "أنشئ جديد",
14
16
  "dateOfBirthLabelText": "تاريخ الميلاد",
@@ -25,6 +27,7 @@
25
27
  "edit": "تعديل",
26
28
  "editIdentifierTooltip": "تعديل",
27
29
  "editPatientDetails": "تعديل تفاصيل المريض",
30
+ "editPatientDetailsBreadcrumb": "Edit patient details",
28
31
  "error": "خطأ",
29
32
  "errorFetchingOrderedFields": "حدث خطأ أثناء جلب الحقول المرتبة لتسلسل العنوان",
30
33
  "estimatedAgeInMonthsLabelText": "العمر المقدر بالشهور",
@@ -32,7 +35,6 @@
32
35
  "familyNameLabelText": "اسم العائلة",
33
36
  "familyNameRequired": "",
34
37
  "female": "أنثى",
35
- "fieldErrorTitleMessage": "الحقول التالية بها أخطاء:",
36
38
  "fullNameLabelText": "الاسم الكامل",
37
39
  "genderLabelText": "الجنس",
38
40
  "genderRequired": "",
@@ -41,6 +43,7 @@
41
43
  "givenNameRequired": "",
42
44
  "identifierValueRequired": "قيمة المعرف مطلوبة",
43
45
  "idFieldLabelText": "المعرفات",
46
+ "IDInstructions": "Select the identifiers you'd like to add for this patient:",
44
47
  "incompleteForm": "نموذج غير مكتمل",
45
48
  "invalidEmail": "",
46
49
  "invalidInput": "إدخال غير صالح",
@@ -58,10 +61,13 @@
58
61
  "other": "آخر",
59
62
  "patient": "المريض",
60
63
  "patientNameKnown": "هل اسم المريض معروف؟",
64
+ "patientRegistrationBreadcrumb": "Patient Registration",
61
65
  "registerPatient": "تسجيل المريض",
62
- "registrationSuccessToastDescription": "يمكن الآن العثور على المريض عن طريق البحث عنه باستخدام اسمه أو رقم هويته",
63
- "registrationSuccessToastTitle": "تم إنشاء مريض جديد",
66
+ "registerPatientSuccessSnackbarSubtitle": "The patient can now be found by searching for them using their name or ID number",
67
+ "registerPatientSuccessSnackbarTitle": "New Patient Created",
68
+ "registrationErrorSnackbarTitle": "Patient Registration Failed",
64
69
  "relationship": "العلاقة",
70
+ "relationshipPersonMustExist": "Related person must be an existing person",
65
71
  "relationshipPlaceholder": "العلاقة",
66
72
  "relationshipRemovedText": "تمت إزالة العلاقة",
67
73
  "relationshipsSection": "العلاقات",
@@ -71,14 +77,19 @@
71
77
  "resetIdentifierTooltip": "إعادة تعيين",
72
78
  "restoreRelationshipActionButton": "تراجع",
73
79
  "searchAddress": "ابحث عن العنوان",
80
+ "searchIdentifierPlaceholder": "Search identifier",
74
81
  "selectAnOption": "اختر خيارًا",
75
82
  "sexFieldLabelText": "الجنس",
83
+ "source": "Source",
76
84
  "stroke": "جلطة",
77
- "unableToFetch": "تعذر الجلب نوع السمة الشخصية - {personattributetype}",
85
+ "submitting": "Submitting",
86
+ "unableToFetch": "تعذر الجلب نوع السمة الشخصية - {{personattributetype}}",
78
87
  "unknown": "غير معروف",
88
+ "unknownPatientAttributeType": "Patient attribute type has unknown format {{personAttributeTypeFormat}}",
79
89
  "updatePatient": "تحديث المريض",
80
- "updationSuccessToastDescription": "تم تحديث معلومات المريض بنجاح",
81
- "updationSuccessToastTitle": "تم تحديث تفاصيل المريض",
90
+ "updatePatientErrorSnackbarTitle": "Patient Details Update Failed",
91
+ "updatePatientSuccessSnackbarSubtitle": "The patient's information has been successfully updated",
92
+ "updatePatientSuccessSnackbarTitle": "Patient Details Updated",
82
93
  "yearsEstimateRequired": "",
83
94
  "yes": "نعم"
84
95
  }
@@ -9,7 +9,9 @@
9
9
  "birthFieldLabelText": "Birth",
10
10
  "cancel": "Cancel",
11
11
  "causeOfDeathInputLabel": "Cause of Death",
12
+ "closeOverlay": "Close overlay",
12
13
  "configure": "Configure",
14
+ "configureIdentifiers": "Configure identifiers",
13
15
  "contactSection": "Contact Details",
14
16
  "cityVillage": "City",
15
17
  "clientRegistryEmpty": "Create & Post Patient",
@@ -33,6 +35,7 @@
33
35
  "edit": "Edit",
34
36
  "editIdentifierTooltip": "Edit",
35
37
  "editPatientDetails": "Edit patient details",
38
+ "editPatientDetailsBreadcrumb": "Edit patient details",
36
39
  "error": "Error",
37
40
  "errorFetchingOrderedFields": "Error occured fetching ordered fields for address hierarchy",
38
41
  "estimatedAgeInMonthsLabelText": "Estimated age in months",
@@ -40,7 +43,6 @@
40
43
  "familyNameLabelText": "Family Name",
41
44
  "familyNameRequired": "Family name is required",
42
45
  "female": "Female",
43
- "fieldErrorTitleMessage": "The following fields have errors:",
44
46
  "fullNameLabelText": "Full Name",
45
47
  "gender": "Gender",
46
48
  "genderLabelText": "Sex",
@@ -50,6 +52,7 @@
50
52
  "givenNameRequired": "Given name is required",
51
53
  "identifierValueRequired": "Identifier value is required",
52
54
  "idFieldLabelText": "Identifiers",
55
+ "IDInstructions": "Select the identifiers you'd like to add for this patient:",
53
56
  "incompleteForm": "Incomplete form",
54
57
  "invalidEmail": "A valid email has to be given",
55
58
  "invalidInput": "Invalid Input",
@@ -75,14 +78,16 @@
75
78
  "postalCode": "Postcode",
76
79
  "postToRegistry": "Post to registry",
77
80
  "registerPatient": "Register Patient",
78
- "registrationSuccessToastDescription": "The patient can now be found by searching for them using their name or ID number",
79
- "registrationSuccessToastTitle": "New Patient Created",
81
+ "registerPatientSuccessSnackbarSubtitle": "The patient can now be found by searching for them using their name or ID number",
82
+ "registerPatientSuccessSnackbarTitle": "New Patient Created",
83
+ "registrationErrorSnackbarTitle": "Patient Registration Failed",
80
84
  "relationship": "Relationship",
85
+ "relationshipPersonMustExist": "Related person must be an existing person",
81
86
  "relationshipPlaceholder": "Relationship",
82
87
  "relationshipRemovedText": "Relationship removed",
83
88
  "relationshipsSection": "Relationships",
84
89
  "relationshipToPatient": "Relationship to patient",
85
- "relativeFullNameLabelText": "Full name",
90
+ "relativeFullNameLabelText": "Related person",
86
91
  "relativeNamePlaceholder": "Firstname Familyname",
87
92
  "resetIdentifierTooltip": "Reset",
88
93
  "restoreRelationshipActionButton": "Undo",
@@ -91,10 +96,16 @@
91
96
  "selectCountry": "Select country",
92
97
  "selectIdentifierType": "Select identifier type",
93
98
  "sexFieldLabelText": "Sex",
99
+ "source": "Source",
94
100
  "stroke": "Stroke",
95
- "unableToFetch": "Unable to fetch person attribute type {personattributetype}",
101
+ "submitting": "Submitting",
102
+ "unableToFetch": "Unable to fetch person attribute type {{personattributetype}}",
96
103
  "unknown": "Unknown",
104
+ "unknownPatientAttributeType": "Patient attribute type has unknown format {{personAttributeTypeFormat}}",
97
105
  "updatePatient": "Update Patient",
106
+ "updatePatientErrorSnackbarTitle": "Patient Details Update Failed",
107
+ "updatePatientSuccessSnackbarSubtitle": "The patient's information has been successfully updated",
108
+ "updatePatientSuccessSnackbarTitle": "Patient Details Updated",
98
109
  "updationSuccessToastDescription": "The patient's information has been successfully updated",
99
110
  "updationSuccessToastTitle": "Patient Details Updated",
100
111
  "useValues": "Use values",
@@ -8,7 +8,9 @@
8
8
  "birthFieldLabelText": "Nacimiento",
9
9
  "cancel": "Cancelar",
10
10
  "causeOfDeathInputLabel": "Causa de defunción",
11
+ "closeOverlay": "Close overlay",
11
12
  "configure": "Configurar",
13
+ "configureIdentifiers": "Configure identifiers",
12
14
  "contactSection": "Detalles de Contacto",
13
15
  "createNew": "Crear Nuevo/a",
14
16
  "dateOfBirthLabelText": "Fecha de Nacimiento",
@@ -25,6 +27,7 @@
25
27
  "edit": "Editar",
26
28
  "editIdentifierTooltip": "Editar",
27
29
  "editPatientDetails": "Modificar los datos del paciente",
30
+ "editPatientDetailsBreadcrumb": "Edit patient details",
28
31
  "error": "Error",
29
32
  "errorFetchingOrderedFields": "Error ocurrió al obtener campos ordenados para la jerarquía de direcciones",
30
33
  "estimatedAgeInMonthsLabelText": "Edad estimada en meses",
@@ -32,7 +35,6 @@
32
35
  "familyNameLabelText": "Apellidos",
33
36
  "familyNameRequired": "Apellidos es obligatorio",
34
37
  "female": "Femenino",
35
- "fieldErrorTitleMessage": "Los siguientes campos tienen errores:",
36
38
  "fullNameLabelText": "Nombre y Apellidos",
37
39
  "genderLabelText": "Sexo",
38
40
  "genderRequired": "El sexo es obligatorio",
@@ -41,6 +43,7 @@
41
43
  "givenNameRequired": "El nombre es obligatorio",
42
44
  "identifierValueRequired": "El valor del identificador es obligatorio",
43
45
  "idFieldLabelText": "Identificadores",
46
+ "IDInstructions": "Select the identifiers you'd like to add for this patient:",
44
47
  "incompleteForm": "Formulario incompleto",
45
48
  "invalidEmail": "Debe indicar un email válido",
46
49
  "invalidInput": "Entrada no válida",
@@ -58,10 +61,13 @@
58
61
  "other": "Otro",
59
62
  "patient": "Paciente",
60
63
  "patientNameKnown": "¿Se sabe el nombre del paciente?",
64
+ "patientRegistrationBreadcrumb": "Patient Registration",
61
65
  "registerPatient": "Registrar paciente",
62
- "registrationSuccessToastDescription": "Ahora se puede encontrar al paciente buscándolo por su nombre o número de identificación",
63
- "registrationSuccessToastTitle": "Nuevo paciente creado",
66
+ "registerPatientSuccessSnackbarSubtitle": "The patient can now be found by searching for them using their name or ID number",
67
+ "registerPatientSuccessSnackbarTitle": "New Patient Created",
68
+ "registrationErrorSnackbarTitle": "Patient Registration Failed",
64
69
  "relationship": "Relación",
70
+ "relationshipPersonMustExist": "Related person must be an existing person",
65
71
  "relationshipPlaceholder": "Relación",
66
72
  "relationshipRemovedText": "Relación eliminada",
67
73
  "relationshipsSection": "Relaciones",
@@ -71,14 +77,19 @@
71
77
  "resetIdentifierTooltip": "resetear",
72
78
  "restoreRelationshipActionButton": "Deshacer",
73
79
  "searchAddress": "Buscar dirección",
80
+ "searchIdentifierPlaceholder": "Search identifier",
74
81
  "selectAnOption": "Seleccionar una opción",
75
82
  "sexFieldLabelText": "Sexo",
83
+ "source": "Source",
76
84
  "stroke": "Ictus",
77
- "unableToFetch": "No se puede obtener el tipo de atributo de persona {personattributetype}",
85
+ "submitting": "Submitting",
86
+ "unableToFetch": "No se puede obtener el tipo de atributo de persona {{personattributetype}}",
78
87
  "unknown": "Desconocido",
88
+ "unknownPatientAttributeType": "Patient attribute type has unknown format {{personAttributeTypeFormat}}",
79
89
  "updatePatient": "Paciente Actualizado",
80
- "updationSuccessToastDescription": "La información del paciente se ha actualizado correctamente",
81
- "updationSuccessToastTitle": "Datos del paciente actualizados",
90
+ "updatePatientErrorSnackbarTitle": "Patient Details Update Failed",
91
+ "updatePatientSuccessSnackbarSubtitle": "The patient's information has been successfully updated",
92
+ "updatePatientSuccessSnackbarTitle": "Patient Details Updated",
82
93
  "yearsEstimateRequired": "Estimación de años obligatoria",
83
94
  "yes": "Sí"
84
95
  }