@olaboot/esm-patient-registration-app 9.2.1 → 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 (342) 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 +507 -507
  137. package/src/constants.ts +1 -1
  138. package/src/index.ts +2 -24
  139. package/src/nav-link.test.tsx +1 -0
  140. package/src/offline.resources.ts +97 -31
  141. package/src/patient-registration/before-save-prompt.test.tsx +199 -0
  142. package/src/patient-registration/field/__mocks__/field.resource.ts +8 -7
  143. package/src/patient-registration/field/address/address-field.component.tsx +183 -186
  144. package/src/patient-registration/field/address/address-hierarchy-levels.component.tsx +6 -1
  145. package/src/patient-registration/field/address/address-hierarchy.test.tsx +289 -296
  146. package/src/patient-registration/field/address/address-search.component.tsx +20 -8
  147. package/src/patient-registration/field/address/address-search.scss +19 -2
  148. package/src/patient-registration/field/address/address-search.test.tsx +333 -141
  149. package/src/patient-registration/field/address/custom-address-field.component.tsx +1 -1
  150. package/src/patient-registration/field/cause-of-death/cause-of-death.component.tsx +1 -1
  151. package/src/patient-registration/field/cause-of-death/cause-of-death.test.tsx +251 -0
  152. package/src/patient-registration/field/custom-field.component.tsx +1 -1
  153. package/src/patient-registration/field/date-and-time-of-death/date-and-time-of-death.component.tsx +1 -1
  154. package/src/patient-registration/field/date-and-time-of-death/date-and-time-of-death.test.tsx +144 -0
  155. package/src/patient-registration/field/dob/dob.component.tsx +2 -2
  156. package/src/patient-registration/field/dob/dob.test.tsx +370 -54
  157. package/src/patient-registration/field/field.component.tsx +1 -1
  158. package/src/patient-registration/field/field.resource.ts +2 -2
  159. package/src/patient-registration/field/field.test.tsx +333 -330
  160. package/src/patient-registration/field/gender/gender-field.test.tsx +240 -54
  161. package/src/patient-registration/field/id/id-field.component.tsx +146 -144
  162. package/src/patient-registration/field/id/id-field.test.tsx +177 -121
  163. package/src/patient-registration/field/id/identifier-selection-overlay.component.tsx +200 -200
  164. package/src/patient-registration/field/id/identifier-selection-overlay.test.tsx +346 -0
  165. package/src/patient-registration/field/name/name-field.component.tsx +2 -2
  166. package/src/patient-registration/field/name/name-field.test.tsx +282 -0
  167. package/src/patient-registration/field/obs/obs-field.test.tsx +294 -118
  168. package/src/patient-registration/field/person-attributes/coded-person-attribute-field.test.tsx +172 -108
  169. package/src/patient-registration/field/person-attributes/location-person-attribute-field.component.tsx +3 -3
  170. package/src/patient-registration/field/person-attributes/location-person-attribute-field.resource.tsx +2 -5
  171. package/src/patient-registration/field/person-attributes/person-attribute-field.component.tsx +2 -2
  172. package/src/patient-registration/field/person-attributes/person-attribute-field.test.tsx +249 -131
  173. package/src/patient-registration/field/person-attributes/person-attributes.resource.ts +1 -1
  174. package/src/patient-registration/field/person-attributes/text-person-attribute-field.test.tsx +98 -70
  175. package/src/patient-registration/field/phone/phone-field.test.tsx +100 -0
  176. package/src/patient-registration/form-manager.test.ts +6 -5
  177. package/src/patient-registration/form-manager.ts +5 -2
  178. package/src/patient-registration/input/basic-input/input/input.component.tsx +3 -121
  179. package/src/patient-registration/input/basic-input/input/input.test.tsx +151 -51
  180. package/src/patient-registration/input/basic-input/select/select-input.test.tsx +113 -33
  181. package/src/patient-registration/input/combo-input/combo-input.component.tsx +60 -24
  182. package/src/patient-registration/input/custom-input/autosuggest/autosuggest.component.tsx +10 -101
  183. package/src/patient-registration/input/custom-input/autosuggest/autosuggest.test.tsx +144 -108
  184. package/src/patient-registration/input/custom-input/identifier/identifier-input.test.tsx +241 -177
  185. package/src/patient-registration/input/custom-input/identifier/utils.test.ts +47 -8
  186. package/src/patient-registration/input/dummy-data/dummy-data-input.component.tsx +12 -12
  187. package/src/patient-registration/input/dummy-data/dummy-data-input.test.tsx +52 -20
  188. package/src/patient-registration/input/input.scss +1 -2
  189. package/src/patient-registration/patient-registration-context.ts +5 -3
  190. package/src/patient-registration/patient-registration-hooks.ts +4 -12
  191. package/src/patient-registration/patient-registration-utils.test.ts +2 -1
  192. package/src/patient-registration/patient-registration-utils.ts +2 -98
  193. package/src/patient-registration/patient-registration.component.tsx +50 -46
  194. package/src/patient-registration/patient-registration.resource.test.tsx +4 -7
  195. package/src/patient-registration/patient-registration.resource.ts +1 -4
  196. package/src/patient-registration/patient-registration.scss +16 -3
  197. package/src/patient-registration/patient-registration.test.tsx +614 -580
  198. package/src/patient-registration/patient-registration.types.ts +17 -28
  199. package/src/patient-registration/section/death-info/death-info-section.test.tsx +130 -34
  200. package/src/patient-registration/section/demographics/demographics-section.test.tsx +122 -68
  201. package/src/patient-registration/section/patient-relationships/relationships-section.component.tsx +15 -15
  202. package/src/patient-registration/section/patient-relationships/relationships-section.test.tsx +278 -84
  203. package/src/patient-registration/section/section-wrapper.component.tsx +1 -1
  204. package/src/patient-registration/ui-components/overlay/overlay.test.tsx +104 -0
  205. package/src/patient-registration/validation/patient-registration-validation.test.ts +2 -1
  206. package/src/patient-registration/validation/patient-registration-validation.ts +9 -3
  207. package/src/root.component.tsx +2 -5
  208. package/src/widgets/cancel-patient-edit.test.tsx +48 -11
  209. package/src/widgets/delete-identifier-confirmation.test.tsx +77 -24
  210. package/src/widgets/edit-patient-details-button.component.tsx +14 -18
  211. package/src/widgets/edit-patient-details-button.scss +2 -2
  212. package/src/widgets/edit-patient-details-button.test.tsx +11 -13
  213. package/translations/am.json +9 -4
  214. package/translations/ar.json +9 -4
  215. package/translations/ar_SY.json +9 -4
  216. package/translations/bn.json +9 -4
  217. package/translations/cs.json +9 -4
  218. package/translations/de.json +120 -115
  219. package/translations/en.json +10 -4
  220. package/translations/en_US.json +9 -4
  221. package/translations/es.json +9 -4
  222. package/translations/es_MX.json +9 -4
  223. package/translations/fr.json +9 -4
  224. package/translations/he.json +9 -4
  225. package/translations/hi.json +9 -4
  226. package/translations/hi_IN.json +9 -4
  227. package/translations/id.json +9 -4
  228. package/translations/it.json +9 -4
  229. package/translations/ka.json +9 -4
  230. package/translations/km.json +9 -4
  231. package/translations/ku.json +9 -4
  232. package/translations/ky.json +9 -4
  233. package/translations/lg.json +9 -4
  234. package/translations/ne.json +9 -4
  235. package/translations/pl.json +9 -4
  236. package/translations/pt.json +9 -4
  237. package/translations/pt_BR.json +10 -5
  238. package/translations/qu.json +9 -4
  239. package/translations/ro_RO.json +9 -4
  240. package/translations/ru_RU.json +9 -4
  241. package/translations/si.json +9 -4
  242. package/translations/sq.json +9 -4
  243. package/translations/sw.json +9 -4
  244. package/translations/sw_KE.json +9 -4
  245. package/translations/tr.json +9 -4
  246. package/translations/tr_TR.json +9 -4
  247. package/translations/uk.json +9 -4
  248. package/translations/uz.json +9 -4
  249. package/translations/uz@Latn.json +9 -4
  250. package/translations/uz_UZ.json +9 -4
  251. package/translations/vi.json +9 -4
  252. package/translations/zh.json +50 -45
  253. package/translations/zh_CN.json +9 -4
  254. package/translations/zh_TW.json +9 -4
  255. package/vitest.config.ts +4 -0
  256. package/dist/126.js +0 -1
  257. package/dist/15.js +0 -1
  258. package/dist/1564.js +0 -1
  259. package/dist/1567.js +0 -1
  260. package/dist/1845.js +0 -1
  261. package/dist/1953.js +0 -1
  262. package/dist/200.js +0 -1
  263. package/dist/200.js.map +0 -1
  264. package/dist/215.js +0 -1
  265. package/dist/2178.js +0 -1
  266. package/dist/250.js +0 -1
  267. package/dist/250.js.map +0 -1
  268. package/dist/2523.js +0 -1
  269. package/dist/2523.js.map +0 -1
  270. package/dist/2566.js +0 -1
  271. package/dist/2586.js +0 -1
  272. package/dist/2586.js.map +0 -1
  273. package/dist/2716.js +0 -1
  274. package/dist/2716.js.map +0 -1
  275. package/dist/2759.js +0 -1
  276. package/dist/2821.js +0 -6
  277. package/dist/2821.js.map +0 -1
  278. package/dist/3089.js +0 -1
  279. package/dist/3089.js.map +0 -1
  280. package/dist/3230.js +0 -1
  281. package/dist/3441.js +0 -1
  282. package/dist/3565.js +0 -1
  283. package/dist/3571.js +0 -1
  284. package/dist/3571.js.map +0 -1
  285. package/dist/3746.js +0 -1
  286. package/dist/3925.js +0 -1
  287. package/dist/3946.js +0 -1
  288. package/dist/4024.js +0 -1
  289. package/dist/4744.js +0 -1
  290. package/dist/4744.js.map +0 -1
  291. package/dist/4809.js +0 -1
  292. package/dist/4894.js +0 -1
  293. package/dist/4970.js +0 -1
  294. package/dist/4970.js.map +0 -1
  295. package/dist/5130.js +0 -1
  296. package/dist/5187.js +0 -1
  297. package/dist/5491.js +0 -1
  298. package/dist/5491.js.map +0 -1
  299. package/dist/5595.js +0 -1
  300. package/dist/5961.js +0 -1
  301. package/dist/6133.js +0 -1
  302. package/dist/634.js +0 -1
  303. package/dist/634.js.map +0 -1
  304. package/dist/6456.js +0 -1
  305. package/dist/6466.js +0 -1
  306. package/dist/6613.js +0 -1
  307. package/dist/6783.js +0 -1
  308. package/dist/7073.js +0 -38
  309. package/dist/7073.js.map +0 -1
  310. package/dist/7154.js +0 -1
  311. package/dist/7154.js.map +0 -1
  312. package/dist/7348.js +0 -1
  313. package/dist/7439.js +0 -1
  314. package/dist/7439.js.map +0 -1
  315. package/dist/7543.js +0 -1
  316. package/dist/7607.js +0 -1
  317. package/dist/772.js +0 -1
  318. package/dist/7984.js +0 -1
  319. package/dist/7984.js.map +0 -1
  320. package/dist/8538.js +0 -1
  321. package/dist/8538.js.map +0 -1
  322. package/dist/8599.js +0 -1
  323. package/dist/8727.js +0 -1
  324. package/dist/8847.js +0 -1
  325. package/dist/9015.js +0 -1
  326. package/dist/906.js +0 -1
  327. package/dist/9065.js +0 -1
  328. package/dist/9182.js +0 -1
  329. package/dist/9339.js +0 -1
  330. package/dist/9453.js +0 -1
  331. package/dist/9833.js +0 -1
  332. package/dist/9833.js.map +0 -1
  333. package/dist/9856.js +0 -1
  334. package/dist/9856.js.map +0 -1
  335. package/dist/9920.js +0 -1
  336. package/dist/9938.js +0 -1
  337. package/dist/9943.js +0 -1
  338. package/dist/9943.js.map +0 -1
  339. package/dist/olaboot-esm-patient-registration-app.js +0 -5
  340. package/dist/olaboot-esm-patient-registration-app.js.map +0 -1
  341. package/jest.config.js +0 -3
  342. package/src/resource.ts +0 -12
@@ -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",
@@ -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": "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": "পরিবর্তন",
46
46
  "editPatientDetails": "রোগীর তথ্য পরিবর্তন",
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": "পুরুষ",
72
75
  "middleNameLabelText": "Middle Name",
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": "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": "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",