@kenyaemr/esm-admin-app 5.4.4-pre.28 → 5.4.4-pre.281

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 (310) hide show
  1. package/.turbo/turbo-build.log +5 -12
  2. package/dist/1074.js +1 -0
  3. package/dist/1074.js.map +1 -0
  4. package/dist/12.js +17 -0
  5. package/dist/12.js.map +1 -0
  6. package/dist/1201.js +1 -0
  7. package/dist/1201.js.map +1 -0
  8. package/dist/1242.js +1 -0
  9. package/dist/1242.js.map +1 -0
  10. package/dist/1311.js +1 -0
  11. package/dist/1311.js.map +1 -0
  12. package/dist/1462.js +1 -0
  13. package/dist/1462.js.map +1 -0
  14. package/dist/1469.js +1 -0
  15. package/dist/1469.js.map +1 -0
  16. package/dist/1506.js +13 -0
  17. package/dist/1506.js.map +1 -0
  18. package/dist/1718.js +1 -0
  19. package/dist/1718.js.map +1 -0
  20. package/dist/1722.js +1 -0
  21. package/dist/1722.js.map +1 -0
  22. package/dist/1772.js +1 -0
  23. package/dist/1772.js.map +1 -0
  24. package/dist/1889.js +1 -0
  25. package/dist/1889.js.map +1 -0
  26. package/dist/1972.js +1 -0
  27. package/dist/1972.js.map +1 -0
  28. package/dist/1990.js +1 -0
  29. package/dist/1990.js.map +1 -0
  30. package/dist/2016.js +1 -0
  31. package/dist/2016.js.map +1 -0
  32. package/dist/2080.js +1 -0
  33. package/dist/2080.js.map +1 -0
  34. package/dist/2096.js +1 -0
  35. package/dist/2096.js.map +1 -0
  36. package/dist/2153.js +1 -0
  37. package/dist/2153.js.map +1 -0
  38. package/dist/216.js +1 -0
  39. package/dist/216.js.map +1 -0
  40. package/dist/2270.js +1 -0
  41. package/dist/2270.js.map +1 -0
  42. package/dist/2294.js +1 -0
  43. package/dist/2294.js.map +1 -0
  44. package/dist/2345.js +1 -0
  45. package/dist/2345.js.map +1 -0
  46. package/dist/2402.js +1 -0
  47. package/dist/2402.js.map +1 -0
  48. package/dist/2500.js +1 -0
  49. package/dist/2500.js.map +1 -0
  50. package/dist/251.js +1 -0
  51. package/dist/251.js.map +1 -0
  52. package/dist/257.js +1 -0
  53. package/dist/257.js.map +1 -0
  54. package/dist/2586.js +1 -0
  55. package/dist/2586.js.map +1 -0
  56. package/dist/2625.js +1 -0
  57. package/dist/2625.js.map +1 -0
  58. package/dist/2652.js +1 -0
  59. package/dist/2652.js.map +1 -0
  60. package/dist/2685.js +1 -0
  61. package/dist/2685.js.map +1 -0
  62. package/dist/2948.js +1 -0
  63. package/dist/2948.js.map +1 -0
  64. package/dist/3089.js +1 -0
  65. package/dist/3089.js.map +1 -0
  66. package/dist/3190.js +1 -0
  67. package/dist/3190.js.map +1 -0
  68. package/dist/3224.js +1 -0
  69. package/dist/3224.js.map +1 -0
  70. package/dist/3366.js +1 -0
  71. package/dist/3366.js.map +1 -0
  72. package/dist/3548.js +1 -0
  73. package/dist/3548.js.map +1 -0
  74. package/dist/3571.js +1 -0
  75. package/dist/3571.js.map +1 -0
  76. package/dist/3691.js +1 -0
  77. package/dist/3691.js.map +1 -0
  78. package/dist/3775.js +1 -0
  79. package/dist/3775.js.map +1 -0
  80. package/dist/3816.js +1 -0
  81. package/dist/3816.js.map +1 -0
  82. package/dist/3852.js +1 -0
  83. package/dist/3852.js.map +1 -0
  84. package/dist/3906.js +1 -0
  85. package/dist/3906.js.map +1 -0
  86. package/dist/3963.js +1 -0
  87. package/dist/3963.js.map +1 -0
  88. package/dist/4047.js +1 -0
  89. package/dist/4047.js.map +1 -0
  90. package/dist/405.js +1 -0
  91. package/dist/405.js.map +1 -0
  92. package/dist/4296.js +1 -0
  93. package/dist/4296.js.map +1 -0
  94. package/dist/4337.js +1 -0
  95. package/dist/4337.js.map +1 -0
  96. package/dist/4584.js +1 -0
  97. package/dist/4584.js.map +1 -0
  98. package/dist/4735.js +1 -0
  99. package/dist/4735.js.map +1 -0
  100. package/dist/4744.js +1 -0
  101. package/dist/4744.js.map +1 -0
  102. package/dist/4813.js +2 -0
  103. package/dist/4813.js.map +1 -0
  104. package/dist/4858.js +1 -0
  105. package/dist/4858.js.map +1 -0
  106. package/dist/487.js +1 -0
  107. package/dist/487.js.map +1 -0
  108. package/dist/4970.js +1 -0
  109. package/dist/4970.js.map +1 -0
  110. package/dist/5202.js +1 -0
  111. package/dist/5202.js.map +1 -0
  112. package/dist/5294.js +1 -0
  113. package/dist/5294.js.map +1 -0
  114. package/dist/545.js +1 -0
  115. package/dist/545.js.map +1 -0
  116. package/dist/552.js +1 -0
  117. package/dist/552.js.map +1 -0
  118. package/dist/5592.js +1 -0
  119. package/dist/5592.js.map +1 -0
  120. package/dist/5669.js +1 -0
  121. package/dist/5669.js.map +1 -0
  122. package/dist/5884.js +1 -0
  123. package/dist/5884.js.map +1 -0
  124. package/dist/5940.js +1 -0
  125. package/dist/5940.js.map +1 -0
  126. package/dist/6092.js +1 -0
  127. package/dist/6092.js.map +1 -0
  128. package/dist/6155.js +1 -0
  129. package/dist/6155.js.map +1 -0
  130. package/dist/6178.js +1 -0
  131. package/dist/6178.js.map +1 -0
  132. package/dist/6399.js +1 -0
  133. package/dist/6399.js.map +1 -0
  134. package/dist/6456.js +1 -0
  135. package/dist/6466.js +3 -0
  136. package/dist/6466.js.map +1 -0
  137. package/dist/6492.js +1 -0
  138. package/dist/6492.js.map +1 -0
  139. package/dist/6676.js +1 -0
  140. package/dist/6676.js.map +1 -0
  141. package/dist/6800.js +1 -0
  142. package/dist/6800.js.map +1 -0
  143. package/dist/6976.js +1 -0
  144. package/dist/6976.js.map +1 -0
  145. package/dist/7005.js +1 -0
  146. package/dist/7005.js.map +1 -0
  147. package/dist/7201.js +1 -0
  148. package/dist/7201.js.map +1 -0
  149. package/dist/7210.js +1 -0
  150. package/dist/7210.js.map +1 -0
  151. package/dist/7234.js +1 -0
  152. package/dist/7234.js.map +1 -0
  153. package/dist/7261.js +1 -0
  154. package/dist/7261.js.map +1 -0
  155. package/dist/7326.js +1 -0
  156. package/dist/7463.js +1 -0
  157. package/dist/7463.js.map +1 -0
  158. package/dist/7528.js +1 -0
  159. package/dist/7528.js.map +1 -0
  160. package/dist/7607.js +1 -0
  161. package/dist/7717.js +1 -0
  162. package/dist/7717.js.map +1 -0
  163. package/dist/7737.js +1 -0
  164. package/dist/7737.js.map +1 -0
  165. package/dist/7739.js +1 -0
  166. package/dist/7739.js.map +1 -0
  167. package/dist/7765.js +1 -0
  168. package/dist/7765.js.map +1 -0
  169. package/dist/7820.js +1 -0
  170. package/dist/7820.js.map +1 -0
  171. package/dist/7844.js +1 -0
  172. package/dist/7844.js.map +1 -0
  173. package/dist/7866.js +1 -0
  174. package/dist/7866.js.map +1 -0
  175. package/dist/7916.js +1 -0
  176. package/dist/7916.js.map +1 -0
  177. package/dist/7971.js +1 -0
  178. package/dist/7971.js.map +1 -0
  179. package/dist/8159.js +7 -0
  180. package/dist/8159.js.map +1 -0
  181. package/dist/8244.js +1 -0
  182. package/dist/8244.js.map +1 -0
  183. package/dist/8262.js +1 -0
  184. package/dist/8262.js.map +1 -0
  185. package/dist/8376.js +1 -0
  186. package/dist/8376.js.map +1 -0
  187. package/dist/845.js +1 -0
  188. package/dist/845.js.map +1 -0
  189. package/dist/8570.js +1 -0
  190. package/dist/8570.js.map +1 -0
  191. package/dist/87.js +1 -0
  192. package/dist/87.js.map +1 -0
  193. package/dist/8727.js +1 -0
  194. package/dist/8828.js +1 -0
  195. package/dist/8828.js.map +1 -0
  196. package/dist/8860.js +1 -0
  197. package/dist/8860.js.map +1 -0
  198. package/dist/9036.js +1 -0
  199. package/dist/9036.js.map +1 -0
  200. package/dist/9124.js +1 -0
  201. package/dist/9124.js.map +1 -0
  202. package/dist/9182.js +1 -0
  203. package/dist/921.js +1 -0
  204. package/dist/921.js.map +1 -0
  205. package/dist/9404.js +1 -0
  206. package/dist/9404.js.map +1 -0
  207. package/dist/9406.js +1 -0
  208. package/dist/9406.js.map +1 -0
  209. package/dist/9446.js +1 -0
  210. package/dist/9446.js.map +1 -0
  211. package/dist/9449.js +1 -0
  212. package/dist/9449.js.map +1 -0
  213. package/dist/9566.js +5 -0
  214. package/dist/9566.js.map +1 -0
  215. package/dist/9641.js +1 -0
  216. package/dist/9641.js.map +1 -0
  217. package/dist/9711.js +1 -0
  218. package/dist/9711.js.map +1 -0
  219. package/dist/9801.js +1 -0
  220. package/dist/9801.js.map +1 -0
  221. package/dist/9835.js +11 -0
  222. package/dist/9835.js.map +1 -0
  223. package/dist/kenyaemr-esm-admin-app.js +5 -5
  224. package/dist/kenyaemr-esm-admin-app.js.buildmanifest.json +2649 -154
  225. package/dist/kenyaemr-esm-admin-app.js.map +1 -1
  226. package/dist/main.js +5 -31
  227. package/dist/main.js.map +1 -1
  228. package/dist/routes.json +1 -1
  229. package/package.json +5 -7
  230. package/rspack.config.js +1 -1
  231. package/src/components/facility-setup/constant/index.ts +3 -0
  232. package/src/components/facility-setup/facility-info.component.tsx +247 -108
  233. package/src/components/facility-setup/facility-info.scss +136 -55
  234. package/src/components/facility-setup/facility-setup.component.tsx +2 -2
  235. package/src/components/facility-setup/header/header.component.tsx +4 -10
  236. package/src/components/facility-setup/header/header.scss +3 -9
  237. package/src/components/facility-setup/shared/custom-info.component.tsx +9 -0
  238. package/src/components/facility-setup/shared/custom-section-card.component.tsx +10 -0
  239. package/src/components/facility-setup/shared/custom-status-tag.component.tsx +22 -0
  240. package/src/components/facility-setup/type/index.ts +61 -0
  241. package/src/components/facility-setup/useFacilityRegistry.ts +29 -0
  242. package/src/components/hook/healthWorkerRegistry.ts +78 -0
  243. package/src/components/hook/useProfessionalRegistryEnums.ts +59 -0
  244. package/src/components/locations/forms/add-location/add-location.workspace.tsx +96 -95
  245. package/src/components/locations/forms/search-location/search-location.workspace.tsx +90 -85
  246. package/src/components/locations/tables/locations-table.component.tsx +117 -121
  247. package/src/components/modal/hwr-confirmation.modal.scss +80 -4
  248. package/src/components/modal/hwr-confirmation.modal.tsx +118 -128
  249. package/src/components/modal/hwr-sync.modal.tsx +194 -106
  250. package/src/components/users/manage-users/manage-user-role-scope/user-role-scope-workspace/user-role-scope.workspace.tsx +13 -13
  251. package/src/components/users/manage-users/user-details/user-detail.scss +168 -39
  252. package/src/components/users/manage-users/user-details/user-details.component.tsx +130 -122
  253. package/src/components/users/manage-users/user-list/user-list.component.tsx +22 -9
  254. package/src/components/users/manage-users/user-management.workspace.scss +233 -95
  255. package/src/components/users/manage-users/user-management.workspace.tsx +800 -687
  256. package/src/components/users/userManagementFormSchema.tsx +17 -8
  257. package/src/config-schema.ts +48 -68
  258. package/src/index.ts +55 -30
  259. package/src/left-pannel-link.component.tsx +5 -3
  260. package/src/root.component.tsx +11 -13
  261. package/src/routes.json +40 -40
  262. package/src/types/index.ts +29 -1
  263. package/translations/am.json +158 -13
  264. package/translations/en.json +158 -13
  265. package/translations/fr.json +193 -47
  266. package/translations/sw.json +158 -13
  267. package/tsconfig.json +1 -1
  268. package/dist/127.js +0 -1
  269. package/dist/267.js +0 -1
  270. package/dist/267.js.map +0 -1
  271. package/dist/281.js +0 -15
  272. package/dist/281.js.map +0 -1
  273. package/dist/329.js +0 -1
  274. package/dist/329.js.map +0 -1
  275. package/dist/40.js +0 -1
  276. package/dist/466.js +0 -1
  277. package/dist/466.js.map +0 -1
  278. package/dist/472.js +0 -1
  279. package/dist/472.js.map +0 -1
  280. package/dist/478.js +0 -1
  281. package/dist/478.js.map +0 -1
  282. package/dist/585.js +0 -1
  283. package/dist/585.js.map +0 -1
  284. package/dist/630.js +0 -1
  285. package/dist/630.js.map +0 -1
  286. package/dist/675.js +0 -1
  287. package/dist/675.js.map +0 -1
  288. package/dist/689.js +0 -1
  289. package/dist/689.js.map +0 -1
  290. package/dist/706.js +0 -27
  291. package/dist/706.js.map +0 -1
  292. package/dist/729.js +0 -17
  293. package/dist/729.js.map +0 -1
  294. package/dist/774.js +0 -1
  295. package/dist/774.js.map +0 -1
  296. package/dist/847.js +0 -1
  297. package/dist/847.js.map +0 -1
  298. package/dist/85.js +0 -1
  299. package/dist/85.js.map +0 -1
  300. package/dist/882.js +0 -1
  301. package/dist/91.js +0 -1
  302. package/dist/91.js.map +0 -1
  303. package/dist/916.js +0 -1
  304. package/dist/998.js +0 -1
  305. package/dist/998.js.map +0 -1
  306. package/jest.config.js +0 -8
  307. package/src/components/facility-setup/card.component.tsx +0 -16
  308. package/src/components/facility-setup/facility-setup.resource.tsx +0 -7
  309. package/src/components/hook/healthWorkerAdapter.ts +0 -213
  310. package/src/components/hook/useFacilityInfo.tsx +0 -37
@@ -1,162 +1,152 @@
1
- import { Button, Tag } from '@carbon/react';
1
+ import { Button, Tag, SkeletonText } from '@carbon/react';
2
2
  import { ExtensionSlot } from '@openmrs/esm-framework';
3
- import capitalize from 'lodash-es/capitalize';
4
- import React from 'react';
3
+ import React, { useMemo } from 'react';
5
4
  import { useTranslation } from 'react-i18next';
6
- import { CustomHIEPractitionerResponse, type PractitionerResponse } from '../../types';
7
- import { NormalizedPractitioner } from '../hook/healthWorkerAdapter';
8
- import styles from './hwr-confirmation.modal.scss';
5
+ import { ProfessionalRegistryResponse } from '../hook/healthWorkerRegistry';
9
6
  import { formatDateTime } from '../../utils/utils';
10
-
11
- interface HealthWorkerInfoProps {
12
- label: string;
13
- value: string | boolean | React.ReactNode;
14
- }
15
-
16
- const HealthWorkerInfo: React.FC<HealthWorkerInfoProps> = ({ label, value }) => {
17
- return (
18
- <div className={styles.healthWorkerInfoContainer}>
19
- <span className={styles.healthWorkerInfoLabel}>{label}</span>
20
- <span>{value}</span>
21
- </div>
22
- );
23
- };
7
+ import styles from './hwr-confirmation.modal.scss';
24
8
 
25
9
  interface HWRConfirmModalProps {
26
10
  onConfirm: () => void;
27
11
  close: () => void;
28
- healthWorker: CustomHIEPractitionerResponse | PractitionerResponse;
29
- normalizedData: NormalizedPractitioner;
30
- fhirFormat: boolean;
12
+ healthWorker: ProfessionalRegistryResponse;
31
13
  }
32
14
 
33
- const HWRConfirmModal: React.FC<HWRConfirmModalProps> = ({
34
- close,
35
- onConfirm,
36
- healthWorker,
37
- normalizedData,
38
- fhirFormat,
39
- }) => {
15
+ type License = NonNullable<ProfessionalRegistryResponse['professional']['licenses']>[number];
16
+
17
+ const InfoRow: React.FC<{ label: string; value: React.ReactNode }> = ({ label, value }) => (
18
+ <div className={styles.healthWorkerInfoContainer}>
19
+ <span className={styles.healthWorkerInfoLabel}>{label}</span>
20
+ <span>{value || '--'}</span>
21
+ </div>
22
+ );
23
+
24
+ const SectionHeading: React.FC<{ children: React.ReactNode }> = ({ children }) => (
25
+ <div className={styles.sectionHeading}>{children}</div>
26
+ );
27
+
28
+ const useCurrentLicense = (licenses: Array<License> = []): License | undefined =>
29
+ useMemo(() => {
30
+ if (licenses.length === 0) {
31
+ return undefined;
32
+ }
33
+ const sorted = [...licenses]
34
+ .filter((l) => l.license_end)
35
+ .sort((a, b) => new Date(b.license_end).getTime() - new Date(a.license_end).getTime());
36
+ const now = Date.now();
37
+ return sorted.find((l) => new Date(l.license_end).getTime() >= now) ?? sorted[0];
38
+ }, [licenses]);
39
+
40
+ const HWRConfirmModal: React.FC<HWRConfirmModalProps> = ({ close, onConfirm, healthWorker }) => {
40
41
  const { t } = useTranslation();
42
+ const { professional } = healthWorker;
43
+ const { membership, licenses, contacts, identifiers, professional_details } = professional;
41
44
 
42
- const isLicenseValid = normalizedData.licenseEndDate ? new Date(normalizedData.licenseEndDate) > new Date() : false;
45
+ const currentLicense = useCurrentLicense(licenses);
46
+ const isLicenseValid = currentLicense?.license_end ? new Date(currentLicense.license_end) > new Date() : false;
43
47
 
44
48
  return (
45
49
  <>
46
50
  <div className="cds--modal-header">
47
51
  <h3 className="cds--modal-header__heading">{t('healthWorkerRegistry', 'Health worker registry')}</h3>
48
52
  </div>
53
+
49
54
  <div className="cds--modal-content">
50
- <p>
55
+ <p className={styles.modalIntro}>
51
56
  {t(
52
57
  'healthWorkerDetailsFound',
53
- 'Health worker information found in the registry, do you want to use the information to continue with registration?',
58
+ 'Health worker found in the registry. Use this information to pre-fill the registration form?',
54
59
  )}
55
60
  </p>
61
+
56
62
  <div className={styles.healthWorkerOverview}>
57
63
  <ExtensionSlot
58
64
  className={styles.healthWorkerPhoto}
59
65
  name="patient-photo-slot"
60
- state={{
61
- patientName: normalizedData.fullName || '',
62
- }}
66
+ state={{ patientName: membership.full_name || '' }}
63
67
  />
64
- <div style={{ width: '100%', marginLeft: '0.625rem' }}>
65
- <HealthWorkerInfo
66
- label={t('healthWorkerName', 'Health worker name')}
67
- value={normalizedData.fullName || '--'}
68
- />
69
-
70
- <HealthWorkerInfo
71
- label={t('providerUniqueIdentifier', 'Provider unique identifier')}
72
- value={normalizedData.providerUniqueIdentifier || '--'}
73
- />
74
-
75
- <HealthWorkerInfo
76
- label={t('registrationId', 'Registration ID')}
77
- value={normalizedData.registrationId || '--'}
78
- />
79
-
80
- <HealthWorkerInfo
81
- label={t('externalReferenceId', 'External Reference ID')}
82
- value={normalizedData.externalReferenceId || '--'}
83
- />
84
-
85
- <HealthWorkerInfo label={t('gender', 'Gender')} value={normalizedData.gender || '--'} />
86
-
87
- <HealthWorkerInfo label={t('status', 'Status')} value={normalizedData.status || '--'} />
88
-
89
- {normalizedData.phoneNumber && (
90
- <HealthWorkerInfo label={t('phone', 'Phone')} value={normalizedData.phoneNumber} />
91
- )}
92
-
93
- {normalizedData.email && <HealthWorkerInfo label={t('email', 'Email')} value={normalizedData.email} />}
94
-
95
- {normalizedData.nationalId && (
96
- <HealthWorkerInfo
97
- label={t('identificationNumber', 'Identification Number')}
98
- value={normalizedData.nationalId}
99
- />
100
- )}
101
-
102
- <HealthWorkerInfo
103
- label={t('licensingBody', 'Licensing Body')}
104
- value={normalizedData.licensingBody || '--'}
105
- />
106
-
107
- <HealthWorkerInfo label={t('specialty', 'Specialty')} value={normalizedData.specialty || '--'} />
108
-
109
- {normalizedData.professionalCadre && (
110
- <HealthWorkerInfo
111
- label={t('professionalCadre', 'Professional Cadre')}
112
- value={normalizedData.professionalCadre}
113
- />
114
- )}
115
-
116
- {normalizedData.practiceType && (
117
- <HealthWorkerInfo label={t('practiceType', 'Practice Type')} value={normalizedData.practiceType} />
118
- )}
119
-
120
- {normalizedData.licenses && normalizedData.licenses.length > 0 && (
121
- <>
122
- <div style={{ marginTop: '1rem', marginBottom: '0.5rem' }}>
123
- <strong>{t('licenses', 'Licenses')}</strong>
124
- </div>
125
- {normalizedData.licenses.map((license, index) => (
126
- <div key={index} style={{ marginBottom: '0.5rem', paddingLeft: '1rem' }}>
127
- <HealthWorkerInfo
128
- label={`${license.license_type} ${t('license', 'License')}`}
129
- value={license.external_reference_id || '--'}
130
- />
131
- <HealthWorkerInfo
68
+ <div className={styles.healthWorkerSummary}>
69
+ <h4 className={styles.healthWorkerName}>{membership.full_name || '--'}</h4>
70
+ <div className={styles.healthWorkerSubtitle}>
71
+ {membership.specialty || t('practitioner', 'Practitioner')}
72
+ {membership.licensing_body && ` · ${membership.licensing_body}`}
73
+ </div>
74
+ <div className={styles.tagRow}>
75
+ <Tag type={membership.is_active === 1 ? 'green' : 'gray'} size="md">
76
+ {membership.is_active === 1 ? t('active', 'Active') : t('inactive', 'Inactive')}
77
+ </Tag>
78
+ <Tag type={isLicenseValid ? 'green' : 'red'} size="md">
79
+ {isLicenseValid ? t('licenseValid', 'License valid') : t('licenseExpired', 'License expired')}
80
+ </Tag>
81
+ </div>
82
+ </div>
83
+ </div>
84
+
85
+ <SectionHeading>{t('identity', 'Identity')}</SectionHeading>
86
+ <InfoRow label={t('providerUniqueIdentifier', 'Provider unique identifier')} value={membership.id} />
87
+ <InfoRow label={t('registrationId', 'Registration ID')} value={membership.registration_id} />
88
+ <InfoRow label={t('externalReferenceId', 'External reference ID')} value={membership.external_reference_id} />
89
+ <InfoRow label={t('gender', 'Gender')} value={membership.gender} />
90
+ {identifiers?.identification_number && (
91
+ <InfoRow
92
+ label={t('identificationNumber', 'Identification number')}
93
+ value={`${identifiers.identification_type ?? ''} ${identifiers.identification_number}`.trim()}
94
+ />
95
+ )}
96
+
97
+ <SectionHeading>{t('licensing', 'Licensing & qualifications')}</SectionHeading>
98
+ <InfoRow label={t('licensingBody', 'Licensing body')} value={membership.licensing_body} />
99
+ <InfoRow label={t('specialty', 'Specialty')} value={membership.specialty} />
100
+ {professional_details?.professional_cadre && (
101
+ <InfoRow
102
+ label={t('professionalCadre', 'Professional cadre')}
103
+ value={professional_details.professional_cadre}
104
+ />
105
+ )}
106
+ {professional_details?.practice_type && (
107
+ <InfoRow label={t('practiceType', 'Practice type')} value={professional_details.practice_type} />
108
+ )}
109
+ {professional_details?.educational_qualifications && (
110
+ <InfoRow
111
+ label={t('qualification', 'Qualification')}
112
+ value={professional_details.educational_qualifications}
113
+ />
114
+ )}
115
+
116
+ {licenses && licenses.length > 0 && (
117
+ <>
118
+ <SectionHeading>{t('licenses', 'Licenses')}</SectionHeading>
119
+ <div className={styles.licenseList}>
120
+ {licenses.map((license) => {
121
+ const expired = license.license_end && new Date(license.license_end) < new Date();
122
+ return (
123
+ <div key={license.id} className={styles.licenseCard}>
124
+ <div className={styles.licenseHeader}>
125
+ <span className={styles.licenseType}>{license.license_type}</span>
126
+ <Tag type={expired ? 'red' : 'green'} size="sm">
127
+ {expired ? t('expired', 'Expired') : t('valid', 'Valid')}
128
+ </Tag>
129
+ </div>
130
+ <InfoRow label={t('licenseNumber', 'License no.')} value={license.external_reference_id} />
131
+ <InfoRow
132
132
  label={t('validity', 'Validity')}
133
- value={`${formatDateTime(license.license_start)} - ${formatDateTime(license.license_end)}`}
133
+ value={`${formatDateTime(license.license_start)} ${formatDateTime(license.license_end)}`}
134
134
  />
135
135
  </div>
136
- ))}
137
- </>
138
- )}
139
-
140
- {normalizedData.licenseStartDate && normalizedData.licenseEndDate && (
141
- <HealthWorkerInfo
142
- label={t('licenseValidity', 'License Validity Period')}
143
- value={`${formatDateTime(normalizedData.licenseStartDate)} - ${formatDateTime(
144
- normalizedData.licenseEndDate,
145
- )}`}
146
- />
147
- )}
148
-
149
- <HealthWorkerInfo
150
- label={t('licenseValid', 'License Validity')}
151
- value={
152
- <Tag type={isLicenseValid ? 'green' : 'red'}>
153
- {isLicenseValid ? t('licenseValid', 'License Valid') : t('licenseExpired', 'License Expired')}
154
- </Tag>
155
- }
156
- />
157
- </div>
158
- </div>
136
+ );
137
+ })}
138
+ </div>
139
+ </>
140
+ )}
141
+
142
+ <SectionHeading>{t('contact', 'Contact')}</SectionHeading>
143
+ <InfoRow label={t('phone', 'Phone')} value={contacts?.phone} />
144
+ <InfoRow label={t('email', 'Email')} value={contacts?.email} />
145
+ {contacts?.postal_address && (
146
+ <InfoRow label={t('postalAddress', 'Postal address')} value={contacts.postal_address} />
147
+ )}
159
148
  </div>
149
+
160
150
  <div className="cds--modal-footer">
161
151
  <Button kind="secondary" onClick={close}>
162
152
  {t('cancel', 'Cancel')}