@olaboot/esm-patient-registration-app 9.2.0 → 10.0.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 (346) hide show
  1. package/dist/1339.js +1 -0
  2. package/dist/1339.js.map +1 -0
  3. package/dist/1480.js +1 -0
  4. package/dist/1480.js.map +1 -0
  5. package/dist/1646.js +1 -0
  6. package/dist/1646.js.map +1 -0
  7. package/dist/1789.js +1 -0
  8. package/dist/1789.js.map +1 -0
  9. package/dist/1869.js +1 -0
  10. package/dist/1869.js.map +1 -0
  11. package/dist/1877.js +1 -0
  12. package/dist/1877.js.map +1 -0
  13. package/dist/2317.js +1 -0
  14. package/dist/2317.js.map +1 -0
  15. package/dist/2416.js +1 -0
  16. package/dist/2416.js.map +1 -0
  17. package/dist/2747.js +1 -0
  18. package/dist/2747.js.map +1 -0
  19. package/dist/282.js +1 -0
  20. package/dist/282.js.map +1 -0
  21. package/dist/2881.js +1 -0
  22. package/dist/2881.js.map +1 -0
  23. package/dist/3378.js +1 -0
  24. package/dist/3378.js.map +1 -0
  25. package/dist/3720.js +1 -0
  26. package/dist/3720.js.map +1 -0
  27. package/dist/3906.js +1 -0
  28. package/dist/3906.js.map +1 -0
  29. package/dist/3963.js +1 -0
  30. package/dist/3963.js.map +1 -0
  31. package/dist/3989.js +1 -0
  32. package/dist/3989.js.map +1 -0
  33. package/dist/4106.js +1 -0
  34. package/dist/4106.js.map +1 -0
  35. package/dist/4111.js +1 -0
  36. package/dist/4111.js.map +1 -0
  37. package/dist/434.js +1 -0
  38. package/dist/434.js.map +1 -0
  39. package/dist/4348.js +1 -0
  40. package/dist/4348.js.map +1 -0
  41. package/dist/4383.js +1 -0
  42. package/dist/4383.js.map +1 -0
  43. package/dist/4658.js +1 -0
  44. package/dist/4658.js.map +1 -0
  45. package/dist/466.js +1 -0
  46. package/dist/466.js.map +1 -0
  47. package/dist/4928.js +1 -0
  48. package/dist/4928.js.map +1 -0
  49. package/dist/5117.js +1 -0
  50. package/dist/5117.js.map +1 -0
  51. package/dist/5132.js +1 -0
  52. package/dist/5132.js.map +1 -0
  53. package/dist/5145.js +1 -0
  54. package/dist/5145.js.map +1 -0
  55. package/dist/5208.js +43 -0
  56. package/dist/5208.js.map +1 -0
  57. package/dist/527.js +1 -0
  58. package/dist/527.js.map +1 -0
  59. package/dist/5280.js +1 -0
  60. package/dist/5280.js.map +1 -0
  61. package/dist/5338.js +6 -0
  62. package/dist/5338.js.map +1 -0
  63. package/dist/5503.js +1 -0
  64. package/dist/5503.js.map +1 -0
  65. package/dist/555.js +1 -0
  66. package/dist/555.js.map +1 -0
  67. package/dist/556.js +1 -0
  68. package/dist/556.js.map +1 -0
  69. package/dist/5644.js +1 -0
  70. package/dist/5644.js.map +1 -0
  71. package/dist/5697.js +1 -0
  72. package/dist/{4024.js.map → 5697.js.map} +1 -1
  73. package/dist/5940.js +1 -0
  74. package/dist/5940.js.map +1 -0
  75. package/dist/6047.js +1 -0
  76. package/dist/6047.js.map +1 -0
  77. package/dist/6371.js +1 -0
  78. package/dist/6371.js.map +1 -0
  79. package/dist/6377.js +1 -0
  80. package/dist/6377.js.map +1 -0
  81. package/dist/6388.js +1 -0
  82. package/dist/6388.js.map +1 -0
  83. package/dist/6444.js +1 -0
  84. package/dist/6444.js.map +1 -0
  85. package/dist/6508.js +1 -0
  86. package/dist/6508.js.map +1 -0
  87. package/dist/6724.js +1 -0
  88. package/dist/6724.js.map +1 -0
  89. package/dist/689.js +1 -0
  90. package/dist/689.js.map +1 -0
  91. package/dist/6904.js +1 -0
  92. package/dist/6904.js.map +1 -0
  93. package/dist/7045.js +1 -0
  94. package/dist/7045.js.map +1 -0
  95. package/dist/7175.js +1 -0
  96. package/dist/7175.js.map +1 -0
  97. package/dist/7182.js +1 -0
  98. package/dist/7182.js.map +1 -0
  99. package/dist/7649.js +1 -0
  100. package/dist/7649.js.map +1 -0
  101. package/dist/7742.js +1 -0
  102. package/dist/7742.js.map +1 -0
  103. package/dist/7912.js +1 -0
  104. package/dist/7912.js.map +1 -0
  105. package/dist/8358.js +1 -0
  106. package/dist/8358.js.map +1 -0
  107. package/dist/8359.js +1 -0
  108. package/dist/8359.js.map +1 -0
  109. package/dist/8695.js +1 -0
  110. package/dist/8695.js.map +1 -0
  111. package/dist/903.js +1 -0
  112. package/dist/903.js.map +1 -0
  113. package/dist/9061.js +1 -0
  114. package/dist/9061.js.map +1 -0
  115. package/dist/9072.js +1 -0
  116. package/dist/9072.js.map +1 -0
  117. package/dist/9397.js +1 -0
  118. package/dist/9397.js.map +1 -0
  119. package/dist/9712.js +1 -0
  120. package/dist/9712.js.map +1 -0
  121. package/dist/9771.js +1 -0
  122. package/dist/9771.js.map +1 -0
  123. package/dist/9806.js +1 -0
  124. package/dist/9806.js.map +1 -0
  125. package/dist/9816.js +1 -0
  126. package/dist/9816.js.map +1 -0
  127. package/dist/main.js +7 -6
  128. package/dist/main.js.map +1 -1
  129. package/dist/openmrs-esm-patient-registration-app.js +6 -0
  130. package/dist/{olaboot-esm-patient-registration-app.js.buildmanifest.json → openmrs-esm-patient-registration-app.js.buildmanifest.json} +540 -455
  131. package/dist/openmrs-esm-patient-registration-app.js.map +1 -0
  132. package/dist/routes.json +1 -1
  133. package/package.json +8 -9
  134. package/src/add-patient-link.extension.tsx +3 -2
  135. package/src/add-patient-link.test.tsx +2 -1
  136. package/src/config-schema.ts +1 -1
  137. package/src/index.ts +2 -24
  138. package/src/nav-link.test.tsx +1 -0
  139. package/src/offline.resources.ts +97 -31
  140. package/src/patient-registration/before-save-prompt.test.tsx +199 -0
  141. package/src/patient-registration/field/__mocks__/field.resource.ts +8 -7
  142. package/src/patient-registration/field/address/address-field.component.tsx +10 -13
  143. package/src/patient-registration/field/address/address-hierarchy-levels.component.tsx +6 -1
  144. package/src/patient-registration/field/address/address-hierarchy.test.tsx +191 -198
  145. package/src/patient-registration/field/address/address-search.component.tsx +20 -8
  146. package/src/patient-registration/field/address/address-search.scss +19 -2
  147. package/src/patient-registration/field/address/address-search.test.tsx +249 -57
  148. package/src/patient-registration/field/address/custom-address-field.component.tsx +1 -1
  149. package/src/patient-registration/field/cause-of-death/cause-of-death.component.tsx +1 -1
  150. package/src/patient-registration/field/cause-of-death/cause-of-death.test.tsx +251 -0
  151. package/src/patient-registration/field/custom-field.component.tsx +1 -1
  152. package/src/patient-registration/field/date-and-time-of-death/date-and-time-of-death.component.tsx +1 -1
  153. package/src/patient-registration/field/date-and-time-of-death/date-and-time-of-death.test.tsx +144 -0
  154. package/src/patient-registration/field/dob/dob.component.tsx +2 -2
  155. package/src/patient-registration/field/dob/dob.test.tsx +370 -54
  156. package/src/patient-registration/field/field.component.tsx +1 -1
  157. package/src/patient-registration/field/field.resource.ts +2 -2
  158. package/src/patient-registration/field/field.test.tsx +25 -22
  159. package/src/patient-registration/field/gender/gender-field.test.tsx +240 -54
  160. package/src/patient-registration/field/id/id-field.component.tsx +15 -5
  161. package/src/patient-registration/field/id/id-field.test.tsx +103 -47
  162. package/src/patient-registration/field/id/identifier-selection-overlay.test.tsx +346 -0
  163. package/src/patient-registration/field/name/name-field.component.tsx +2 -2
  164. package/src/patient-registration/field/name/name-field.test.tsx +282 -0
  165. package/src/patient-registration/field/obs/obs-field.test.tsx +294 -118
  166. package/src/patient-registration/field/person-attributes/coded-person-attribute-field.test.tsx +172 -108
  167. package/src/patient-registration/field/person-attributes/location-person-attribute-field.component.tsx +3 -3
  168. package/src/patient-registration/field/person-attributes/location-person-attribute-field.resource.tsx +2 -5
  169. package/src/patient-registration/field/person-attributes/person-attribute-field.component.tsx +2 -2
  170. package/src/patient-registration/field/person-attributes/person-attribute-field.test.tsx +249 -131
  171. package/src/patient-registration/field/person-attributes/person-attributes.resource.ts +1 -1
  172. package/src/patient-registration/field/person-attributes/text-person-attribute-field.test.tsx +98 -70
  173. package/src/patient-registration/field/phone/phone-field.test.tsx +100 -0
  174. package/src/patient-registration/form-manager.test.ts +6 -5
  175. package/src/patient-registration/form-manager.ts +5 -2
  176. package/src/patient-registration/input/basic-input/input/input.component.tsx +3 -121
  177. package/src/patient-registration/input/basic-input/input/input.test.tsx +151 -51
  178. package/src/patient-registration/input/basic-input/select/select-input.test.tsx +113 -33
  179. package/src/patient-registration/input/combo-input/combo-input.component.tsx +60 -24
  180. package/src/patient-registration/input/custom-input/autosuggest/autosuggest.component.tsx +10 -101
  181. package/src/patient-registration/input/custom-input/autosuggest/autosuggest.test.tsx +144 -108
  182. package/src/patient-registration/input/custom-input/identifier/identifier-input.test.tsx +241 -177
  183. package/src/patient-registration/input/custom-input/identifier/utils.test.ts +47 -8
  184. package/src/patient-registration/input/dummy-data/dummy-data-input.component.tsx +12 -12
  185. package/src/patient-registration/input/dummy-data/dummy-data-input.test.tsx +52 -20
  186. package/src/patient-registration/input/input.scss +1 -2
  187. package/src/patient-registration/patient-registration-context.ts +5 -3
  188. package/src/patient-registration/patient-registration-hooks.ts +4 -12
  189. package/src/patient-registration/patient-registration-utils.test.ts +2 -1
  190. package/src/patient-registration/patient-registration-utils.ts +2 -98
  191. package/src/patient-registration/patient-registration.component.tsx +50 -46
  192. package/src/patient-registration/patient-registration.resource.test.tsx +4 -7
  193. package/src/patient-registration/patient-registration.resource.ts +1 -4
  194. package/src/patient-registration/patient-registration.scss +16 -3
  195. package/src/patient-registration/patient-registration.test.tsx +99 -65
  196. package/src/patient-registration/patient-registration.types.ts +17 -28
  197. package/src/patient-registration/section/death-info/death-info-section.test.tsx +130 -34
  198. package/src/patient-registration/section/demographics/demographics-section.test.tsx +122 -68
  199. package/src/patient-registration/section/patient-relationships/relationships-section.component.tsx +15 -15
  200. package/src/patient-registration/section/patient-relationships/relationships-section.test.tsx +278 -84
  201. package/src/patient-registration/section/section-wrapper.component.tsx +1 -1
  202. package/src/patient-registration/ui-components/overlay/overlay.test.tsx +104 -0
  203. package/src/patient-registration/validation/patient-registration-validation.test.ts +2 -1
  204. package/src/patient-registration/validation/patient-registration-validation.ts +9 -3
  205. package/src/root.component.tsx +2 -5
  206. package/src/widgets/cancel-patient-edit.test.tsx +48 -11
  207. package/src/widgets/delete-identifier-confirmation.test.tsx +77 -24
  208. package/src/widgets/edit-patient-details-button.component.tsx +14 -18
  209. package/src/widgets/edit-patient-details-button.scss +2 -2
  210. package/src/widgets/edit-patient-details-button.test.tsx +11 -13
  211. package/translations/am.json +9 -4
  212. package/translations/ar.json +9 -4
  213. package/translations/ar_SY.json +9 -4
  214. package/translations/bn.json +9 -4
  215. package/translations/cs.json +9 -4
  216. package/translations/de.json +120 -115
  217. package/translations/en.json +9 -4
  218. package/translations/en_US.json +9 -4
  219. package/translations/es.json +9 -4
  220. package/translations/es_MX.json +9 -4
  221. package/translations/fr.json +9 -4
  222. package/translations/he.json +9 -4
  223. package/translations/hi.json +9 -4
  224. package/translations/hi_IN.json +9 -4
  225. package/translations/id.json +9 -4
  226. package/translations/it.json +9 -4
  227. package/translations/ka.json +9 -4
  228. package/translations/km.json +9 -4
  229. package/translations/ku.json +9 -4
  230. package/translations/ky.json +9 -4
  231. package/translations/lg.json +9 -4
  232. package/translations/ne.json +9 -4
  233. package/translations/pl.json +9 -4
  234. package/translations/pt.json +9 -4
  235. package/translations/pt_BR.json +10 -5
  236. package/translations/qu.json +9 -4
  237. package/translations/ro_RO.json +9 -4
  238. package/translations/ru_RU.json +9 -4
  239. package/translations/si.json +9 -4
  240. package/translations/sq.json +9 -4
  241. package/translations/sw.json +9 -4
  242. package/translations/sw_KE.json +9 -4
  243. package/translations/tr.json +9 -4
  244. package/translations/tr_TR.json +9 -4
  245. package/translations/uk.json +9 -4
  246. package/translations/uz.json +9 -4
  247. package/translations/uz@Latn.json +9 -4
  248. package/translations/uz_UZ.json +9 -4
  249. package/translations/vi.json +9 -4
  250. package/translations/zh.json +50 -45
  251. package/translations/zh_CN.json +9 -4
  252. package/translations/zh_TW.json +9 -4
  253. package/vitest.config.ts +4 -0
  254. package/ADDRESS_CONFIGURATION.md +0 -152
  255. package/IDENTIFIER_CONFIGURATION.md +0 -142
  256. package/IMPLEMENTATION_SUMMARY.md +0 -111
  257. package/QUICK_START.md +0 -95
  258. package/address-required-fields-config.json +0 -26
  259. package/dist/126.js +0 -1
  260. package/dist/15.js +0 -1
  261. package/dist/1564.js +0 -1
  262. package/dist/1567.js +0 -1
  263. package/dist/1845.js +0 -1
  264. package/dist/1953.js +0 -1
  265. package/dist/200.js +0 -1
  266. package/dist/200.js.map +0 -1
  267. package/dist/215.js +0 -1
  268. package/dist/2178.js +0 -1
  269. package/dist/250.js +0 -1
  270. package/dist/250.js.map +0 -1
  271. package/dist/2523.js +0 -1
  272. package/dist/2523.js.map +0 -1
  273. package/dist/2566.js +0 -1
  274. package/dist/2586.js +0 -1
  275. package/dist/2586.js.map +0 -1
  276. package/dist/2716.js +0 -1
  277. package/dist/2716.js.map +0 -1
  278. package/dist/2759.js +0 -1
  279. package/dist/2821.js +0 -6
  280. package/dist/2821.js.map +0 -1
  281. package/dist/3089.js +0 -1
  282. package/dist/3089.js.map +0 -1
  283. package/dist/3230.js +0 -1
  284. package/dist/3441.js +0 -1
  285. package/dist/3565.js +0 -1
  286. package/dist/3571.js +0 -1
  287. package/dist/3571.js.map +0 -1
  288. package/dist/3746.js +0 -1
  289. package/dist/3925.js +0 -1
  290. package/dist/3946.js +0 -1
  291. package/dist/4024.js +0 -1
  292. package/dist/4744.js +0 -1
  293. package/dist/4744.js.map +0 -1
  294. package/dist/4809.js +0 -1
  295. package/dist/4894.js +0 -1
  296. package/dist/4970.js +0 -1
  297. package/dist/4970.js.map +0 -1
  298. package/dist/5130.js +0 -1
  299. package/dist/5187.js +0 -1
  300. package/dist/5491.js +0 -1
  301. package/dist/5491.js.map +0 -1
  302. package/dist/5595.js +0 -1
  303. package/dist/5961.js +0 -1
  304. package/dist/6133.js +0 -1
  305. package/dist/634.js +0 -1
  306. package/dist/634.js.map +0 -1
  307. package/dist/6456.js +0 -1
  308. package/dist/6466.js +0 -1
  309. package/dist/6613.js +0 -1
  310. package/dist/6783.js +0 -1
  311. package/dist/7073.js +0 -38
  312. package/dist/7073.js.map +0 -1
  313. package/dist/7154.js +0 -1
  314. package/dist/7154.js.map +0 -1
  315. package/dist/7348.js +0 -1
  316. package/dist/7439.js +0 -1
  317. package/dist/7439.js.map +0 -1
  318. package/dist/7543.js +0 -1
  319. package/dist/7607.js +0 -1
  320. package/dist/772.js +0 -1
  321. package/dist/7984.js +0 -1
  322. package/dist/7984.js.map +0 -1
  323. package/dist/8538.js +0 -1
  324. package/dist/8538.js.map +0 -1
  325. package/dist/8599.js +0 -1
  326. package/dist/8727.js +0 -1
  327. package/dist/8847.js +0 -1
  328. package/dist/9015.js +0 -1
  329. package/dist/906.js +0 -1
  330. package/dist/9065.js +0 -1
  331. package/dist/9182.js +0 -1
  332. package/dist/9339.js +0 -1
  333. package/dist/9453.js +0 -1
  334. package/dist/9833.js +0 -1
  335. package/dist/9833.js.map +0 -1
  336. package/dist/9856.js +0 -1
  337. package/dist/9856.js.map +0 -1
  338. package/dist/9920.js +0 -1
  339. package/dist/9938.js +0 -1
  340. package/dist/9943.js +0 -1
  341. package/dist/9943.js.map +0 -1
  342. package/dist/olaboot-esm-patient-registration-app.js +0 -5
  343. package/dist/olaboot-esm-patient-registration-app.js.map +0 -1
  344. package/example-config.json +0 -14
  345. package/jest.config.js +0 -3
  346. package/src/resource.ts +0 -12
@@ -0,0 +1,104 @@
1
+ import React from 'react';
2
+ import { vi, describe, it, expect, beforeEach } from 'vitest';
3
+ import userEvent from '@testing-library/user-event';
4
+ import { render, screen } from '@testing-library/react';
5
+ import { useLayoutType, isDesktop } from '@openmrs/esm-framework';
6
+ import Overlay from './overlay.component';
7
+
8
+ const mockUseLayoutType = vi.mocked(useLayoutType);
9
+ const mockIsDesktop = vi.mocked(isDesktop);
10
+ /**
11
+ * Helper to render Overlay component.
12
+ */
13
+ function renderOverlay(
14
+ close = vi.fn(),
15
+ header = 'Test Header',
16
+ buttonsGroup?: React.ReactElement,
17
+ children?: React.ReactNode,
18
+ ) {
19
+ return render(<Overlay close={close} header={header} buttonsGroup={buttonsGroup} children={children} />);
20
+ }
21
+
22
+ describe('Overlay component', () => {
23
+ const mockClose = vi.fn();
24
+
25
+ beforeEach(() => {
26
+ mockIsDesktop.mockReturnValue(true);
27
+ mockUseLayoutType.mockReturnValue('desktop' as any);
28
+ });
29
+
30
+ describe('Desktop layout', () => {
31
+ it('renders header text', () => {
32
+ renderOverlay(mockClose, 'Test Header');
33
+
34
+ expect(screen.getByText('Test Header')).toBeInTheDocument();
35
+ });
36
+
37
+ it('renders close button with icon', () => {
38
+ renderOverlay(mockClose, 'Test Header');
39
+
40
+ const closeButton = screen.getByRole('button', { name: /close overlay/i });
41
+ expect(closeButton).toBeInTheDocument();
42
+ });
43
+
44
+ it('calls close when close button is clicked', async () => {
45
+ const user = userEvent.setup();
46
+ renderOverlay(mockClose, 'Test Header');
47
+
48
+ const closeButton = screen.getByRole('button', { name: /close overlay/i });
49
+ await user.click(closeButton);
50
+
51
+ expect(mockClose).toHaveBeenCalledTimes(1);
52
+ });
53
+
54
+ it('renders children content', () => {
55
+ renderOverlay(mockClose, 'Test Header', undefined, <div>Test Content</div>);
56
+
57
+ expect(screen.getByText('Test Content')).toBeInTheDocument();
58
+ });
59
+
60
+ it('renders buttonsGroup when provided', () => {
61
+ const buttonsGroup = (
62
+ <div>
63
+ <button>Save</button>
64
+ <button>Cancel</button>
65
+ </div>
66
+ );
67
+ renderOverlay(mockClose, 'Test Header', buttonsGroup);
68
+
69
+ expect(screen.getByRole('button', { name: /save/i })).toBeInTheDocument();
70
+ expect(screen.getByRole('button', { name: /cancel/i })).toBeInTheDocument();
71
+ });
72
+ });
73
+
74
+ describe('Tablet layout', () => {
75
+ beforeEach(() => {
76
+ mockIsDesktop.mockReturnValue(false);
77
+ mockUseLayoutType.mockReturnValue('tablet' as any);
78
+ });
79
+
80
+ it('renders header with back arrow button', () => {
81
+ renderOverlay(mockClose, 'Test Header');
82
+
83
+ const backButton = screen.getByRole('button', { name: /close overlay/i });
84
+ expect(backButton).toBeInTheDocument();
85
+ expect(screen.getByText('Test Header')).toBeInTheDocument();
86
+ });
87
+
88
+ it('calls close when back button is clicked', async () => {
89
+ const user = userEvent.setup();
90
+ renderOverlay(mockClose, 'Test Header');
91
+
92
+ const backButton = screen.getByRole('button', { name: /close overlay/i });
93
+ await user.click(backButton);
94
+
95
+ expect(mockClose).toHaveBeenCalledTimes(1);
96
+ });
97
+
98
+ it('renders children content in tablet layout', () => {
99
+ renderOverlay(mockClose, 'Test Header', undefined, <div>Tablet Content</div>);
100
+
101
+ expect(screen.getByText('Tablet Content')).toBeInTheDocument();
102
+ });
103
+ });
104
+ });
@@ -1,9 +1,10 @@
1
1
  import dayjs from 'dayjs';
2
+ import { vi, describe, it, expect, beforeEach } from 'vitest';
2
3
  import { getConfig } from '@openmrs/esm-framework';
3
4
  import { type RegistrationConfig } from '../../config-schema';
4
5
  import { getValidationSchema } from './patient-registration-validation';
5
6
 
6
- const mockGetConfig = jest.mocked(getConfig);
7
+ const mockGetConfig = vi.mocked(getConfig);
7
8
 
8
9
  describe('Patient registration validation', () => {
9
10
  beforeEach(() => {
@@ -1,11 +1,15 @@
1
1
  import dayjs from 'dayjs';
2
2
  import * as Yup from 'yup';
3
+ import type { ObjectSchema } from 'yup';
3
4
  import mapValues from 'lodash/mapValues';
4
5
  import { type RegistrationConfig } from '../../config-schema';
5
6
  import { type FormValues } from '../patient-registration.types';
6
7
  import { getDatetime } from '../patient-registration.resource';
7
8
 
8
- export function getValidationSchema(config: RegistrationConfig, t: (key: string, defaultValue: string) => string) {
9
+ export function getValidationSchema(
10
+ config: RegistrationConfig,
11
+ t: (key: string, defaultValue: string) => string,
12
+ ): ObjectSchema<any> {
9
13
  return Yup.object({
10
14
  givenName: Yup.string().required(t('givenNameRequired', 'Given name is required')),
11
15
  familyName: Yup.string().required(t('familyNameRequired', 'Family name is required')),
@@ -56,7 +60,7 @@ export function getValidationSchema(config: RegistrationConfig, t: (key: string,
56
60
  .max(new Date(), t('deathDateInFuture', 'Death date cannot be in future'))
57
61
  .test(
58
62
  'deathDate-after-birthdate',
59
- t('deathdayInvalidDate', 'Death date and time cannot be before the birthday'),
63
+ t('deathdayBeforeBirthday', 'Death date and time cannot be before the birthday'),
60
64
  function (value) {
61
65
  const { birthdate } = this.parent;
62
66
  if (birthdate && value) {
@@ -95,7 +99,9 @@ export function getValidationSchema(config: RegistrationConfig, t: (key: string,
95
99
  }),
96
100
  nonCodedCauseOfDeath: Yup.string().when(['isDead', 'deathCause'], {
97
101
  is: (isDead, deathCause) => isDead && deathCause === config.freeTextFieldConceptUuid,
98
- then: Yup.string().required(t('nonCodedCauseOfDeathRequired', 'Cause of death is required')),
102
+ then: Yup.string().required(
103
+ t('nonCodedCauseOfDeathRequiredWhenSelected', 'Non-coded cause of death is required'),
104
+ ),
99
105
  otherwise: Yup.string().nullable(),
100
106
  }),
101
107
  email: Yup.string().optional().email(t('invalidEmail', 'Invalid email')),
@@ -2,8 +2,8 @@ import React, { useMemo } from 'react';
2
2
  import classNames from 'classnames';
3
3
  import useSWRImmutable from 'swr/immutable';
4
4
  import { BrowserRouter, Route, Routes } from 'react-router-dom';
5
- import { Grid, Row } from '@carbon/react';
6
- import { ExtensionSlot, useConnectivity, useSession } from '@openmrs/esm-framework';
5
+ import { Grid } from '@carbon/react';
6
+ import { useConnectivity, useSession } from '@openmrs/esm-framework';
7
7
  import {
8
8
  fetchAddressTemplate,
9
9
  fetchAllRelationshipTypes,
@@ -34,9 +34,6 @@ export default function Root() {
34
34
  return (
35
35
  <main className={classNames('omrs-main-content', styles.root)}>
36
36
  <Grid className={styles.grid}>
37
- <Row>
38
- <ExtensionSlot name="breadcrumbs-slot" />
39
- </Row>
40
37
  <ResourcesContextProvider
41
38
  value={{
42
39
  addressTemplate,
@@ -1,22 +1,59 @@
1
1
  import React from 'react';
2
+ import { vi, describe, it, expect } from 'vitest';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { screen, render } from '@testing-library/react';
4
5
  import CancelPatientEdit from './cancel-patient-edit.modal';
5
6
 
7
+ /**
8
+ * Helper to render CancelPatientEdit modal.
9
+ */
10
+ function renderCancelPatientEditModal(close = vi.fn(), onConfirm = vi.fn()) {
11
+ return render(<CancelPatientEdit close={close} onConfirm={onConfirm} />);
12
+ }
13
+
6
14
  describe('CancelPatientEdit modal', () => {
7
- const mockClose = jest.fn();
8
- const mockOnConfirm = jest.fn();
15
+ const mockClose = vi.fn();
16
+ const mockOnConfirm = vi.fn();
17
+
18
+ describe('Rendering', () => {
19
+ it('renders modal with title and message', () => {
20
+ renderCancelPatientEditModal(mockClose, mockOnConfirm);
21
+
22
+ expect(screen.getByText(/are you sure you want to discard these changes\?/i)).toBeInTheDocument();
23
+ expect(
24
+ screen.getByText(/your unsaved changes will be lost if you proceed to discard the form/i),
25
+ ).toBeInTheDocument();
26
+ });
27
+
28
+ it('renders Cancel and Discard buttons', () => {
29
+ renderCancelPatientEditModal(mockClose, mockOnConfirm);
30
+
31
+ expect(screen.getByRole('button', { name: /cancel/i })).toBeInTheDocument();
32
+ expect(screen.getByRole('button', { name: /discard/i })).toBeInTheDocument();
33
+ });
34
+ });
35
+
36
+ describe('User interaction', () => {
37
+ it('calls close when Cancel button is clicked', async () => {
38
+ const user = userEvent.setup();
39
+ renderCancelPatientEditModal(mockClose, mockOnConfirm);
40
+
41
+ const cancelButton = screen.getByRole('button', { name: /cancel/i });
42
+ await user.click(cancelButton);
43
+
44
+ expect(mockClose).toHaveBeenCalledTimes(1);
45
+ expect(mockOnConfirm).not.toHaveBeenCalled();
46
+ });
9
47
 
10
- it('renders the modal and triggers close and onConfirm functions', async () => {
11
- const user = userEvent.setup();
12
- render(<CancelPatientEdit close={mockClose} onConfirm={mockOnConfirm} />);
48
+ it('calls onConfirm when Discard button is clicked', async () => {
49
+ const user = userEvent.setup();
50
+ renderCancelPatientEditModal(mockClose, mockOnConfirm);
13
51
 
14
- const cancelButton = screen.getByRole('button', { name: /Cancel/i });
15
- await user.click(cancelButton);
16
- expect(mockClose).toHaveBeenCalledTimes(1);
52
+ const discardButton = screen.getByRole('button', { name: /discard/i });
53
+ await user.click(discardButton);
17
54
 
18
- const discardButton = screen.getByRole('button', { name: /discard/i });
19
- await user.click(discardButton);
20
- expect(mockOnConfirm).toHaveBeenCalledTimes(1);
55
+ expect(mockOnConfirm).toHaveBeenCalledTimes(1);
56
+ expect(mockClose).not.toHaveBeenCalled();
57
+ });
21
58
  });
22
59
  });
@@ -1,32 +1,85 @@
1
1
  import React from 'react';
2
+ import { vi, describe, it, expect } from 'vitest';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { render, screen } from '@testing-library/react';
4
5
  import DeleteIdentifierConfirmationModal from './delete-identifier-confirmation.modal';
5
6
 
7
+ /**
8
+ * Helper to render DeleteIdentifierConfirmationModal.
9
+ */
10
+ function renderDeleteIdentifierModal(
11
+ closeModal = vi.fn(),
12
+ deleteIdentifier = vi.fn(),
13
+ identifierName = 'Identifier Name',
14
+ identifierValue = 'Identifier Value',
15
+ ) {
16
+ return render(
17
+ <DeleteIdentifierConfirmationModal
18
+ closeModal={closeModal}
19
+ deleteIdentifier={deleteIdentifier}
20
+ identifierName={identifierName}
21
+ identifierValue={identifierValue}
22
+ />,
23
+ );
24
+ }
25
+
6
26
  describe('DeleteIdentifierConfirmationModal', () => {
7
- const mockDeleteIdentifier = jest.fn();
8
- const closeModal = jest.fn();
9
- const mockIdentifierName = 'Identifier Name';
10
- const mockIdentifierValue = 'Identifier Value';
11
-
12
- it('renders the modal and triggers deleteIdentifier function', async () => {
13
- const user = userEvent.setup();
14
-
15
- render(
16
- <DeleteIdentifierConfirmationModal
17
- closeModal={closeModal}
18
- deleteIdentifier={mockDeleteIdentifier}
19
- identifierName={mockIdentifierName}
20
- identifierValue={mockIdentifierValue}
21
- />,
22
- );
23
-
24
- const cancelButton = screen.getByRole('button', { name: /cancel/i });
25
- await user.click(cancelButton);
26
- expect(closeModal).toHaveBeenCalledTimes(1);
27
-
28
- const removeButton = screen.getByRole('button', { name: /remove identifier/i });
29
- await user.click(removeButton);
30
- expect(mockDeleteIdentifier).toHaveBeenCalledWith(true);
27
+ const mockDeleteIdentifier = vi.fn();
28
+ const mockCloseModal = vi.fn();
29
+ const mockIdentifierName = 'OpenMRS ID';
30
+ const mockIdentifierValue = '10001V';
31
+
32
+ describe('Rendering', () => {
33
+ it('renders modal with title', () => {
34
+ renderDeleteIdentifierModal(mockCloseModal, mockDeleteIdentifier, mockIdentifierName, mockIdentifierValue);
35
+
36
+ expect(screen.getByText(/delete identifier\?/i)).toBeInTheDocument();
37
+ });
38
+
39
+ it('displays identifier name and value in the message', () => {
40
+ renderDeleteIdentifierModal(mockCloseModal, mockDeleteIdentifier, mockIdentifierName, mockIdentifierValue);
41
+
42
+ expect(screen.getByText(mockIdentifierName, { exact: false })).toBeInTheDocument();
43
+ expect(screen.getByText(mockIdentifierValue, { exact: false })).toBeInTheDocument();
44
+ expect(screen.getByText(/are you sure you want to delete this identifier\?/i)).toBeInTheDocument();
45
+ });
46
+
47
+ it('renders Cancel and Remove identifier buttons', () => {
48
+ renderDeleteIdentifierModal(mockCloseModal, mockDeleteIdentifier, mockIdentifierName, mockIdentifierValue);
49
+
50
+ expect(screen.getByRole('button', { name: /cancel/i })).toBeInTheDocument();
51
+ expect(screen.getByRole('button', { name: /remove identifier/i })).toBeInTheDocument();
52
+ });
53
+
54
+ it('handles missing identifier name and value gracefully', () => {
55
+ renderDeleteIdentifierModal(mockCloseModal, mockDeleteIdentifier, '', '');
56
+
57
+ expect(screen.getByText(/are you sure you want to delete this identifier\?/i)).toBeInTheDocument();
58
+ });
59
+ });
60
+
61
+ describe('User interaction', () => {
62
+ it('calls closeModal when Cancel button is clicked', async () => {
63
+ const user = userEvent.setup();
64
+ renderDeleteIdentifierModal(mockCloseModal, mockDeleteIdentifier, mockIdentifierName, mockIdentifierValue);
65
+
66
+ const cancelButton = screen.getByRole('button', { name: /cancel/i });
67
+ await user.click(cancelButton);
68
+
69
+ expect(mockCloseModal).toHaveBeenCalledTimes(1);
70
+ expect(mockDeleteIdentifier).not.toHaveBeenCalled();
71
+ });
72
+
73
+ it('calls deleteIdentifier with true when Remove identifier button is clicked', async () => {
74
+ const user = userEvent.setup();
75
+ renderDeleteIdentifierModal(mockCloseModal, mockDeleteIdentifier, mockIdentifierName, mockIdentifierValue);
76
+
77
+ const removeButton = screen.getByRole('button', { name: /remove identifier/i });
78
+ await user.click(removeButton);
79
+
80
+ expect(mockDeleteIdentifier).toHaveBeenCalledWith(true);
81
+ expect(mockDeleteIdentifier).toHaveBeenCalledTimes(1);
82
+ expect(mockCloseModal).not.toHaveBeenCalled();
83
+ });
31
84
  });
32
85
  });
@@ -1,32 +1,28 @@
1
- import React from 'react';
2
- import { navigate } from '@openmrs/esm-framework';
1
+ import React, { useCallback } from 'react';
3
2
  import { useTranslation } from 'react-i18next';
3
+ import { OverflowMenuItem } from '@carbon/react';
4
+ import { navigate } from '@openmrs/esm-framework';
4
5
  import styles from './edit-patient-details-button.scss';
5
6
 
6
7
  interface EditPatientDetailsButtonProps {
7
- onTransition?: () => void;
8
8
  patientUuid: string;
9
+ closeMenu?: () => void;
9
10
  }
10
11
 
11
- const EditPatientDetailsButton: React.FC<EditPatientDetailsButtonProps> = ({ patientUuid, onTransition }) => {
12
+ const EditPatientDetailsButton: React.FC<EditPatientDetailsButtonProps> = ({ patientUuid, closeMenu }) => {
12
13
  const { t } = useTranslation();
13
- const handleClick = React.useCallback(() => {
14
+
15
+ const handleClick = useCallback(() => {
14
16
  navigate({ to: `\${openmrsSpaBase}/patient/${patientUuid}/edit` });
15
- onTransition?.();
16
- }, [onTransition, patientUuid]);
17
+ }, [patientUuid]);
17
18
 
18
19
  return (
19
- <li className="cds--overflow-menu-options__option">
20
- <button
21
- className="cds--overflow-menu-options__btn"
22
- role="menuitem"
23
- data-floating-menu-primary-focus
24
- onClick={handleClick}>
25
- <span className="cds--overflow-menu-options__option-content">
26
- {t('editPatientDetails', 'Edit patient details')}
27
- </span>
28
- </button>
29
- </li>
20
+ <OverflowMenuItem
21
+ className={styles.menuitem}
22
+ closeMenu={closeMenu}
23
+ itemText={t('editPatientDetails', 'Edit patient details')}
24
+ onClick={handleClick}
25
+ />
30
26
  );
31
27
  };
32
28
 
@@ -1,3 +1,3 @@
1
- .link {
2
- text-decoration: none;
1
+ .menuitem {
2
+ max-width: none;
3
3
  }
@@ -1,35 +1,33 @@
1
1
  import React from 'react';
2
+ import { vi, describe, it, expect } from 'vitest';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { render, screen } from '@testing-library/react';
4
5
  import { navigate } from '@openmrs/esm-framework';
5
6
  import { mockPatient } from '__mocks__';
6
7
  import EditPatientDetailsButton from './edit-patient-details-button.component';
7
8
 
8
- const mockNavigate = jest.mocked(navigate);
9
+ const mockNavigate = vi.mocked(navigate);
9
10
 
10
11
  describe('EditPatientDetailsButton', () => {
11
12
  const patientUuid = mockPatient.uuid;
12
13
 
13
- it('should navigate to the edit page when clicked', async () => {
14
- const user = userEvent.setup();
15
-
14
+ it('renders button with correct text', () => {
16
15
  render(<EditPatientDetailsButton patientUuid={patientUuid} />);
17
16
 
18
- const button = screen.getByRole('menuitem');
19
- await user.click(button);
20
-
21
- expect(mockNavigate).toHaveBeenCalledWith({ to: expect.stringContaining(`/patient/${patientUuid}/edit`) });
17
+ expect(screen.getByRole('menuitem')).toBeInTheDocument();
18
+ expect(screen.getByText(/edit patient details/i)).toBeInTheDocument();
22
19
  });
23
20
 
24
- it('should call the onTransition function when provided', async () => {
21
+ it('navigates to edit page when clicked', async () => {
25
22
  const user = userEvent.setup();
26
-
27
- const onTransitionMock = jest.fn();
28
- render(<EditPatientDetailsButton patientUuid={patientUuid} onTransition={onTransitionMock} />);
23
+ render(<EditPatientDetailsButton patientUuid={patientUuid} />);
29
24
 
30
25
  const button = screen.getByRole('menuitem');
31
26
  await user.click(button);
32
27
 
33
- expect(onTransitionMock).toHaveBeenCalled();
28
+ expect(mockNavigate).toHaveBeenCalledWith({
29
+ to: expect.stringContaining(`/patient/${patientUuid}/edit`),
30
+ });
31
+ expect(mockNavigate).toHaveBeenCalledTimes(1);
34
32
  });
35
33
  });
@@ -26,7 +26,7 @@
26
26
  "deathDateInFuture": "Death date cannot be in future",
27
27
  "deathDateInputLabel": "Date of death",
28
28
  "deathDateRequired": "Death date is required",
29
- "deathdayInvalidDate": "Death date and time cannot be before the birthday",
29
+ "deathdayBeforeBirthday": "Death date and time cannot be before the birthday",
30
30
  "deathdayIsRequired": "Death date is required when the patient is marked as deceased.",
31
31
  "deathdayNotInTheFuture": "",
32
32
  "deathSection": "Death Info",
@@ -44,11 +44,12 @@
44
44
  "dobToggleLabelText": "Date of Birth Known?",
45
45
  "editIdentifierTooltip": "Edit",
46
46
  "editPatientDetails": "Edit patient details",
47
- "editPatientDetailsBreadcrumb": "Edit patient details",
48
47
  "enterNonCodedCauseOfDeath": "Enter non-coded cause of death",
49
48
  "error": "Error",
49
+ "errorFetchingAddresses": "Error fetching address results",
50
50
  "errorFetchingCodedCausesOfDeath": "Error fetching coded causes of death",
51
51
  "errorFetchingOrderedFields": "Error occured fetching ordered fields for address hierarchy",
52
+ "errorFetchingResults": "Error fetching results",
52
53
  "estimatedAgeInMonthsLabelText": "Estimated age in months",
53
54
  "estimatedAgeInYearsLabelText": "Estimated age in years",
54
55
  "familyNameLabelText": "Family Name",
@@ -64,17 +65,21 @@
64
65
  "identifierValueRequired": "Identifier value is required",
65
66
  "idFieldLabelText": "Identifiers",
66
67
  "IDInstructions": "Select the identifiers you'd like to add for this patient:",
68
+ "inputDummyData": "Input Dummy Data",
67
69
  "invalidEmail": "Invalid email",
68
70
  "invalidInput": "Invalid Input",
69
71
  "isDeadInputLabel": "Is dead",
70
72
  "jumpTo": "Jump to",
73
+ "loading": "Loading",
71
74
  "male": "Male",
72
75
  "middleNameLabelText": "Middle Name",
73
76
  "negativeMonths": "Estimated months cannot be negative",
74
77
  "negativeYears": "Estimated years cannot be negative",
75
78
  "no": "No",
79
+ "noAddressResults": "No matching addresses found",
80
+ "noMatchingResults": "No matching results",
76
81
  "nonCodedCauseOfDeath": "Non-coded cause of death",
77
- "nonCodedCauseOfDeathRequired": "Cause of death is required",
82
+ "nonCodedCauseOfDeathRequiredWhenSelected": "Non-coded cause of death is required",
78
83
  "nonsensicalYears": "Estimated years cannot be more than 140",
79
84
  "numberInNameDubious": "Number in name is dubious",
80
85
  "obsFieldUnknownDatatype": "Concept for obs field '{{fieldDefinitionId}}' has unknown datatype '{{datatypeName}}'",
@@ -82,7 +87,6 @@
82
87
  "optionalIdentifierLabel": "{{identifierName}} (optional)",
83
88
  "other": "Other",
84
89
  "patientNameKnown": "Patient's Name is Known?",
85
- "patientRegistrationBreadcrumb": "Patient Registration",
86
90
  "refreshOrContactAdmin": "Try refreshing the page or contact your system administrator",
87
91
  "registerPatient": "Register patient",
88
92
  "registerPatientSuccessSnackbarSubtitle": "The patient can now be found by searching for them using their name or ID number",
@@ -101,6 +105,7 @@
101
105
  "restoreRelationshipActionButton": "Undo",
102
106
  "searchAddress": "Search address",
103
107
  "searchIdentifierPlaceholder": "Search identifier",
108
+ "searching": "Searching...",
104
109
  "searchLocationPersonAttribute": "Search location",
105
110
  "selectAnOption": "Select an option",
106
111
  "sexFieldLabelText": "Sex",
@@ -26,7 +26,7 @@
26
26
  "deathDateInFuture": "Death date cannot be in future",
27
27
  "deathDateInputLabel": "تاريخ الوفاة",
28
28
  "deathDateRequired": "Death date is required",
29
- "deathdayInvalidDate": "لا يمكن أن يكون تاريخ ووقت الوفاة قبل عيد الميلاد",
29
+ "deathdayBeforeBirthday": "Death date and time cannot be before the birthday",
30
30
  "deathdayIsRequired": "Death date is required when the patient is marked as deceased.",
31
31
  "deathdayNotInTheFuture": "",
32
32
  "deathSection": "معلومات الوفاة",
@@ -44,11 +44,12 @@
44
44
  "dobToggleLabelText": "هل تاريخ الميلاد معروف؟",
45
45
  "editIdentifierTooltip": "تعديل",
46
46
  "editPatientDetails": "تعديل تفاصيل المريض",
47
- "editPatientDetailsBreadcrumb": "Edit patient details",
48
47
  "enterNonCodedCauseOfDeath": "Enter non-coded cause of death",
49
48
  "error": "خطأ",
49
+ "errorFetchingAddresses": "Error fetching address results",
50
50
  "errorFetchingCodedCausesOfDeath": "Error fetching coded causes of death",
51
51
  "errorFetchingOrderedFields": "حدث خطأ أثناء جلب الحقول المرتبة لتسلسل العنوان",
52
+ "errorFetchingResults": "Error fetching results",
52
53
  "estimatedAgeInMonthsLabelText": "العمر المقدر بالشهور",
53
54
  "estimatedAgeInYearsLabelText": "العمر المقدر بالسنوات",
54
55
  "familyNameLabelText": "اسم العائلة",
@@ -64,17 +65,21 @@
64
65
  "identifierValueRequired": "قيمة المعرف مطلوبة",
65
66
  "idFieldLabelText": "المعرفات",
66
67
  "IDInstructions": "Select the identifiers you'd like to add for this patient:",
68
+ "inputDummyData": "Input Dummy Data",
67
69
  "invalidEmail": "Invalid email",
68
70
  "invalidInput": "إدخال غير صالح",
69
71
  "isDeadInputLabel": "Is dead",
70
72
  "jumpTo": "اذهب إلى",
73
+ "loading": "Loading",
71
74
  "male": "ذكر",
72
75
  "middleNameLabelText": "الاسم الأوسط",
73
76
  "negativeMonths": "Estimated months cannot be negative",
74
77
  "negativeYears": "Estimated years cannot be negative",
75
78
  "no": "لا",
79
+ "noAddressResults": "No matching addresses found",
80
+ "noMatchingResults": "No matching results",
76
81
  "nonCodedCauseOfDeath": "Non-coded cause of death",
77
- "nonCodedCauseOfDeathRequired": "Cause of death is required",
82
+ "nonCodedCauseOfDeathRequiredWhenSelected": "Non-coded cause of death is required",
78
83
  "nonsensicalYears": "Estimated years cannot be more than 140",
79
84
  "numberInNameDubious": "Number in name is dubious",
80
85
  "obsFieldUnknownDatatype": "Concept for obs field '{{fieldDefinitionId}}' has unknown datatype '{{datatypeName}}'",
@@ -82,7 +87,6 @@
82
87
  "optionalIdentifierLabel": "{{identifierName}} (optional)",
83
88
  "other": "آخر",
84
89
  "patientNameKnown": "هل اسم المريض معروف؟",
85
- "patientRegistrationBreadcrumb": "Patient Registration",
86
90
  "refreshOrContactAdmin": "Try refreshing the page or contact your system administrator",
87
91
  "registerPatient": "تسجيل المريض",
88
92
  "registerPatientSuccessSnackbarSubtitle": "The patient can now be found by searching for them using their name or ID number",
@@ -101,6 +105,7 @@
101
105
  "restoreRelationshipActionButton": "تراجع",
102
106
  "searchAddress": "ابحث عن العنوان",
103
107
  "searchIdentifierPlaceholder": "Search identifier",
108
+ "searching": "Searching...",
104
109
  "searchLocationPersonAttribute": "موقع البحث",
105
110
  "selectAnOption": "اختر خيارًا",
106
111
  "sexFieldLabelText": "الجنس",
@@ -26,7 +26,7 @@
26
26
  "deathDateInFuture": "Death date cannot be in future",
27
27
  "deathDateInputLabel": "Date of death",
28
28
  "deathDateRequired": "Death date is required",
29
- "deathdayInvalidDate": "Death date and time cannot be before the birthday",
29
+ "deathdayBeforeBirthday": "Death date and time cannot be before the birthday",
30
30
  "deathdayIsRequired": "Death date is required when the patient is marked as deceased.",
31
31
  "deathdayNotInTheFuture": "",
32
32
  "deathSection": "Death Info",
@@ -44,11 +44,12 @@
44
44
  "dobToggleLabelText": "Date of Birth Known?",
45
45
  "editIdentifierTooltip": "Edit",
46
46
  "editPatientDetails": "Edit patient details",
47
- "editPatientDetailsBreadcrumb": "Edit patient details",
48
47
  "enterNonCodedCauseOfDeath": "Enter non-coded cause of death",
49
48
  "error": "Error",
49
+ "errorFetchingAddresses": "Error fetching address results",
50
50
  "errorFetchingCodedCausesOfDeath": "Error fetching coded causes of death",
51
51
  "errorFetchingOrderedFields": "Error occured fetching ordered fields for address hierarchy",
52
+ "errorFetchingResults": "Error fetching results",
52
53
  "estimatedAgeInMonthsLabelText": "Estimated age in months",
53
54
  "estimatedAgeInYearsLabelText": "Estimated age in years",
54
55
  "familyNameLabelText": "Family Name",
@@ -64,17 +65,21 @@
64
65
  "identifierValueRequired": "Identifier value is required",
65
66
  "idFieldLabelText": "Identifiers",
66
67
  "IDInstructions": "Select the identifiers you'd like to add for this patient:",
68
+ "inputDummyData": "Input Dummy Data",
67
69
  "invalidEmail": "Invalid email",
68
70
  "invalidInput": "Invalid Input",
69
71
  "isDeadInputLabel": "Is dead",
70
72
  "jumpTo": "Jump to",
73
+ "loading": "Loading",
71
74
  "male": "Male",
72
75
  "middleNameLabelText": "Middle Name",
73
76
  "negativeMonths": "Estimated months cannot be negative",
74
77
  "negativeYears": "Estimated years cannot be negative",
75
78
  "no": "No",
79
+ "noAddressResults": "No matching addresses found",
80
+ "noMatchingResults": "No matching results",
76
81
  "nonCodedCauseOfDeath": "Non-coded cause of death",
77
- "nonCodedCauseOfDeathRequired": "Cause of death is required",
82
+ "nonCodedCauseOfDeathRequiredWhenSelected": "Non-coded cause of death is required",
78
83
  "nonsensicalYears": "Estimated years cannot be more than 140",
79
84
  "numberInNameDubious": "Number in name is dubious",
80
85
  "obsFieldUnknownDatatype": "Concept for obs field '{{fieldDefinitionId}}' has unknown datatype '{{datatypeName}}'",
@@ -82,7 +87,6 @@
82
87
  "optionalIdentifierLabel": "{{identifierName}} (optional)",
83
88
  "other": "Other",
84
89
  "patientNameKnown": "Patient's Name is Known?",
85
- "patientRegistrationBreadcrumb": "Patient Registration",
86
90
  "refreshOrContactAdmin": "Try refreshing the page or contact your system administrator",
87
91
  "registerPatient": "Register patient",
88
92
  "registerPatientSuccessSnackbarSubtitle": "The patient can now be found by searching for them using their name or ID number",
@@ -101,6 +105,7 @@
101
105
  "restoreRelationshipActionButton": "Undo",
102
106
  "searchAddress": "Search address",
103
107
  "searchIdentifierPlaceholder": "Search identifier",
108
+ "searching": "Searching...",
104
109
  "searchLocationPersonAttribute": "Search location",
105
110
  "selectAnOption": "Select an option",
106
111
  "sexFieldLabelText": "Sex",