@kenyaemr/esm-admin-app 5.4.4-pre.50 → 5.4.4-pre.59

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 (429) hide show
  1. package/.turbo/turbo-build.log +5 -5
  2. package/dist/1074.js +1 -0
  3. package/dist/{8240.js.map → 1074.js.map} +1 -1
  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/{6192.js → 1242.js} +1 -1
  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/{5870.js → 1425.js} +1 -1
  13. package/dist/{5870.js.map → 1425.js.map} +1 -1
  14. package/dist/1462.js +1 -0
  15. package/dist/1462.js.map +1 -0
  16. package/dist/1469.js +1 -0
  17. package/dist/{2534.js.map → 1469.js.map} +1 -1
  18. package/dist/1506.js +13 -0
  19. package/dist/1506.js.map +1 -0
  20. package/dist/171.js +1 -0
  21. package/dist/171.js.map +1 -0
  22. package/dist/1718.js +1 -0
  23. package/dist/1718.js.map +1 -0
  24. package/dist/1722.js +1 -0
  25. package/dist/{3189.js.map → 1722.js.map} +1 -1
  26. package/dist/1772.js +1 -0
  27. package/dist/1772.js.map +1 -0
  28. package/dist/1889.js +1 -0
  29. package/dist/1889.js.map +1 -0
  30. package/dist/1972.js +1 -0
  31. package/dist/{3509.js.map → 1972.js.map} +1 -1
  32. package/dist/1990.js +1 -0
  33. package/dist/1990.js.map +1 -0
  34. package/dist/2080.js +1 -0
  35. package/dist/2080.js.map +1 -0
  36. package/dist/{5533.js → 2096.js} +1 -1
  37. package/dist/2096.js.map +1 -0
  38. package/dist/2153.js +1 -0
  39. package/dist/2153.js.map +1 -0
  40. package/dist/216.js +1 -0
  41. package/dist/216.js.map +1 -0
  42. package/dist/2270.js +1 -0
  43. package/dist/2270.js.map +1 -0
  44. package/dist/2294.js +1 -0
  45. package/dist/2294.js.map +1 -0
  46. package/dist/2345.js +1 -0
  47. package/dist/2345.js.map +1 -0
  48. package/dist/{6892.js → 2402.js} +1 -1
  49. package/dist/{6892.js.map → 2402.js.map} +1 -1
  50. package/dist/2500.js +1 -0
  51. package/dist/2500.js.map +1 -0
  52. package/dist/251.js +1 -0
  53. package/dist/251.js.map +1 -0
  54. package/dist/257.js +1 -0
  55. package/dist/257.js.map +1 -0
  56. package/dist/2586.js +1 -0
  57. package/dist/2586.js.map +1 -0
  58. package/dist/2625.js +1 -0
  59. package/dist/{5096.js.map → 2625.js.map} +1 -1
  60. package/dist/2652.js +1 -0
  61. package/dist/2652.js.map +1 -0
  62. package/dist/2685.js +1 -0
  63. package/dist/2685.js.map +1 -0
  64. package/dist/2948.js +1 -0
  65. package/dist/{2007.js.map → 2948.js.map} +1 -1
  66. package/dist/3089.js +1 -0
  67. package/dist/3089.js.map +1 -0
  68. package/dist/3190.js +1 -0
  69. package/dist/3190.js.map +1 -0
  70. package/dist/3224.js +1 -0
  71. package/dist/3224.js.map +1 -0
  72. package/dist/3366.js +1 -0
  73. package/dist/3366.js.map +1 -0
  74. package/dist/{1072.js → 3548.js} +1 -1
  75. package/dist/3548.js.map +1 -0
  76. package/dist/3571.js +1 -0
  77. package/dist/3571.js.map +1 -0
  78. package/dist/3691.js +1 -0
  79. package/dist/3691.js.map +1 -0
  80. package/dist/3775.js +1 -0
  81. package/dist/{9947.js.map → 3775.js.map} +1 -1
  82. package/dist/3816.js +1 -0
  83. package/dist/3816.js.map +1 -0
  84. package/dist/3852.js +1 -0
  85. package/dist/3852.js.map +1 -0
  86. package/dist/3906.js +1 -0
  87. package/dist/3906.js.map +1 -0
  88. package/dist/3963.js +1 -0
  89. package/dist/3963.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/4735.js +1 -0
  97. package/dist/4735.js.map +1 -0
  98. package/dist/4744.js +1 -0
  99. package/dist/4744.js.map +1 -0
  100. package/dist/4813.js +2 -0
  101. package/dist/4813.js.map +1 -0
  102. package/dist/{5809.js → 4858.js} +1 -1
  103. package/dist/4858.js.map +1 -0
  104. package/dist/4970.js +1 -0
  105. package/dist/4970.js.map +1 -0
  106. package/dist/5202.js +1 -0
  107. package/dist/{4178.js.map → 5202.js.map} +1 -1
  108. package/dist/5294.js +1 -0
  109. package/dist/5294.js.map +1 -0
  110. package/dist/545.js +1 -0
  111. package/dist/545.js.map +1 -0
  112. package/dist/552.js +1 -0
  113. package/dist/552.js.map +1 -0
  114. package/dist/5592.js +1 -0
  115. package/dist/5592.js.map +1 -0
  116. package/dist/5669.js +1 -0
  117. package/dist/5669.js.map +1 -0
  118. package/dist/{2357.js → 5884.js} +1 -1
  119. package/dist/5884.js.map +1 -0
  120. package/dist/{2738.js → 5940.js} +1 -1
  121. package/dist/5940.js.map +1 -0
  122. package/dist/6092.js +1 -0
  123. package/dist/6092.js.map +1 -0
  124. package/dist/{2797.js → 6155.js} +1 -1
  125. package/dist/{2797.js.map → 6155.js.map} +1 -1
  126. package/dist/6178.js +1 -0
  127. package/dist/6178.js.map +1 -0
  128. package/dist/6399.js +1 -0
  129. package/dist/6399.js.map +1 -0
  130. package/dist/{5882.js → 6456.js} +1 -1
  131. package/dist/6466.js +3 -0
  132. package/dist/6466.js.map +1 -0
  133. package/dist/6492.js +1 -0
  134. package/dist/6492.js.map +1 -0
  135. package/dist/6676.js +1 -0
  136. package/dist/6676.js.map +1 -0
  137. package/dist/6800.js +1 -0
  138. package/dist/6800.js.map +1 -0
  139. package/dist/6976.js +1 -0
  140. package/dist/6976.js.map +1 -0
  141. package/dist/7005.js +1 -0
  142. package/dist/7005.js.map +1 -0
  143. package/dist/{2867.js → 7201.js} +1 -1
  144. package/dist/7201.js.map +1 -0
  145. package/dist/{4224.js → 7210.js} +1 -1
  146. package/dist/7210.js.map +1 -0
  147. package/dist/7234.js +1 -0
  148. package/dist/7234.js.map +1 -0
  149. package/dist/7261.js +1 -0
  150. package/dist/{2045.js.map → 7261.js.map} +1 -1
  151. package/dist/7326.js +1 -0
  152. package/dist/7463.js +1 -0
  153. package/dist/7463.js.map +1 -0
  154. package/dist/7528.js +1 -0
  155. package/dist/7528.js.map +1 -0
  156. package/dist/7584.js +1 -0
  157. package/dist/7584.js.map +1 -0
  158. package/dist/7607.js +1 -0
  159. package/dist/7717.js +1 -0
  160. package/dist/7717.js.map +1 -0
  161. package/dist/7737.js +1 -0
  162. package/dist/7737.js.map +1 -0
  163. package/dist/7739.js +1 -0
  164. package/dist/{4308.js.map → 7739.js.map} +1 -1
  165. package/dist/7765.js +1 -0
  166. package/dist/7765.js.map +1 -0
  167. package/dist/7820.js +1 -0
  168. package/dist/7820.js.map +1 -0
  169. package/dist/7844.js +1 -0
  170. package/dist/7844.js.map +1 -0
  171. package/dist/7866.js +1 -0
  172. package/dist/7866.js.map +1 -0
  173. package/dist/7916.js +1 -0
  174. package/dist/{3134.js.map → 7916.js.map} +1 -1
  175. package/dist/7971.js +1 -0
  176. package/dist/7971.js.map +1 -0
  177. package/dist/8159.js +7 -0
  178. package/dist/8159.js.map +1 -0
  179. package/dist/8244.js +1 -0
  180. package/dist/8244.js.map +1 -0
  181. package/dist/8262.js +1 -0
  182. package/dist/8262.js.map +1 -0
  183. package/dist/834.js +1 -0
  184. package/dist/834.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/8546.js +1 -0
  190. package/dist/8546.js.map +1 -0
  191. package/dist/8570.js +1 -0
  192. package/dist/8570.js.map +1 -0
  193. package/dist/87.js +1 -0
  194. package/dist/87.js.map +1 -0
  195. package/dist/{7127.js → 8727.js} +1 -1
  196. package/dist/8828.js +1 -0
  197. package/dist/8828.js.map +1 -0
  198. package/dist/8860.js +1 -0
  199. package/dist/8860.js.map +1 -0
  200. package/dist/9036.js +1 -0
  201. package/dist/9036.js.map +1 -0
  202. package/dist/9124.js +1 -0
  203. package/dist/9124.js.map +1 -0
  204. package/dist/9182.js +1 -0
  205. package/dist/921.js +1 -0
  206. package/dist/921.js.map +1 -0
  207. package/dist/9404.js +1 -0
  208. package/dist/9404.js.map +1 -0
  209. package/dist/9406.js +1 -0
  210. package/dist/9406.js.map +1 -0
  211. package/dist/9446.js +1 -0
  212. package/dist/{8502.js.map → 9446.js.map} +1 -1
  213. package/dist/9449.js +1 -0
  214. package/dist/9449.js.map +1 -0
  215. package/dist/9566.js +5 -0
  216. package/dist/9566.js.map +1 -0
  217. package/dist/{3491.js → 9641.js} +1 -1
  218. package/dist/{3491.js.map → 9641.js.map} +1 -1
  219. package/dist/9711.js +1 -0
  220. package/dist/{6615.js.map → 9711.js.map} +1 -1
  221. package/dist/9801.js +1 -0
  222. package/dist/9801.js.map +1 -0
  223. package/dist/9835.js +11 -0
  224. package/dist/9835.js.map +1 -0
  225. package/dist/kenyaemr-esm-admin-app.js +5 -5
  226. package/dist/kenyaemr-esm-admin-app.js.buildmanifest.json +815 -760
  227. package/dist/kenyaemr-esm-admin-app.js.map +1 -1
  228. package/dist/main.js +5 -5
  229. package/dist/main.js.map +1 -1
  230. package/dist/routes.json +1 -1
  231. package/package.json +3 -5
  232. package/src/components/locations/forms/add-location/add-location.workspace.tsx +96 -95
  233. package/src/components/locations/forms/search-location/search-location.workspace.tsx +90 -85
  234. package/src/components/locations/tables/locations-table.component.tsx +117 -121
  235. package/src/components/users/manage-users/manage-user-role-scope/user-role-scope-workspace/user-role-scope.workspace.tsx +13 -13
  236. package/src/components/users/manage-users/user-list/user-list.component.tsx +22 -9
  237. package/src/components/users/manage-users/user-management.workspace.tsx +590 -585
  238. package/src/root.component.tsx +11 -13
  239. package/src/routes.json +40 -40
  240. package/tsconfig.json +1 -1
  241. package/dist/1072.js.map +0 -1
  242. package/dist/1091.js +0 -1
  243. package/dist/1091.js.map +0 -1
  244. package/dist/1172.js +0 -1
  245. package/dist/1172.js.map +0 -1
  246. package/dist/132.js +0 -1
  247. package/dist/132.js.map +0 -1
  248. package/dist/1332.js +0 -1
  249. package/dist/1332.js.map +0 -1
  250. package/dist/1577.js +0 -1
  251. package/dist/1577.js.map +0 -1
  252. package/dist/1660.js +0 -1
  253. package/dist/1660.js.map +0 -1
  254. package/dist/1729.js +0 -17
  255. package/dist/1729.js.map +0 -1
  256. package/dist/1761.js +0 -1
  257. package/dist/1761.js.map +0 -1
  258. package/dist/1809.js +0 -7
  259. package/dist/1809.js.map +0 -1
  260. package/dist/1866.js +0 -1
  261. package/dist/1866.js.map +0 -1
  262. package/dist/1962.js +0 -1
  263. package/dist/1962.js.map +0 -1
  264. package/dist/2007.js +0 -1
  265. package/dist/2045.js +0 -1
  266. package/dist/2163.js +0 -1
  267. package/dist/2163.js.map +0 -1
  268. package/dist/2267.js +0 -1
  269. package/dist/2267.js.map +0 -1
  270. package/dist/2357.js.map +0 -1
  271. package/dist/2419.js +0 -1
  272. package/dist/2419.js.map +0 -1
  273. package/dist/2534.js +0 -1
  274. package/dist/2561.js +0 -1
  275. package/dist/2561.js.map +0 -1
  276. package/dist/2564.js +0 -1
  277. package/dist/2564.js.map +0 -1
  278. package/dist/2738.js.map +0 -1
  279. package/dist/2810.js +0 -2
  280. package/dist/2810.js.map +0 -1
  281. package/dist/2867.js.map +0 -1
  282. package/dist/3040.js +0 -1
  283. package/dist/3134.js +0 -1
  284. package/dist/3189.js +0 -1
  285. package/dist/3228.js +0 -1
  286. package/dist/3228.js.map +0 -1
  287. package/dist/3248.js +0 -1
  288. package/dist/3248.js.map +0 -1
  289. package/dist/3381.js +0 -1
  290. package/dist/3381.js.map +0 -1
  291. package/dist/3472.js +0 -1
  292. package/dist/3472.js.map +0 -1
  293. package/dist/3509.js +0 -1
  294. package/dist/3576.js +0 -1
  295. package/dist/3576.js.map +0 -1
  296. package/dist/3968.js +0 -1
  297. package/dist/3968.js.map +0 -1
  298. package/dist/4146.js +0 -1
  299. package/dist/4146.js.map +0 -1
  300. package/dist/4178.js +0 -1
  301. package/dist/4220.js +0 -1
  302. package/dist/4220.js.map +0 -1
  303. package/dist/4224.js.map +0 -1
  304. package/dist/4308.js +0 -1
  305. package/dist/4402.js +0 -1
  306. package/dist/4402.js.map +0 -1
  307. package/dist/4637.js +0 -1
  308. package/dist/4637.js.map +0 -1
  309. package/dist/466.js +0 -1
  310. package/dist/466.js.map +0 -1
  311. package/dist/4724.js +0 -1
  312. package/dist/4724.js.map +0 -1
  313. package/dist/4972.js +0 -1
  314. package/dist/4972.js.map +0 -1
  315. package/dist/5086.js +0 -1
  316. package/dist/5086.js.map +0 -1
  317. package/dist/509.js +0 -1
  318. package/dist/509.js.map +0 -1
  319. package/dist/5096.js +0 -1
  320. package/dist/5119.js +0 -1
  321. package/dist/5119.js.map +0 -1
  322. package/dist/5136.js +0 -1
  323. package/dist/5136.js.map +0 -1
  324. package/dist/5159.js +0 -13
  325. package/dist/5159.js.map +0 -1
  326. package/dist/5361.js +0 -1
  327. package/dist/5361.js.map +0 -1
  328. package/dist/5533.js.map +0 -1
  329. package/dist/5676.js +0 -1
  330. package/dist/5676.js.map +0 -1
  331. package/dist/5809.js.map +0 -1
  332. package/dist/5939.js +0 -5
  333. package/dist/5939.js.map +0 -1
  334. package/dist/6004.js +0 -1
  335. package/dist/6004.js.map +0 -1
  336. package/dist/6104.js +0 -1
  337. package/dist/6104.js.map +0 -1
  338. package/dist/6121.js +0 -3
  339. package/dist/6121.js.map +0 -1
  340. package/dist/6137.js +0 -1
  341. package/dist/6137.js.map +0 -1
  342. package/dist/6192.js.map +0 -1
  343. package/dist/6232.js +0 -1
  344. package/dist/6232.js.map +0 -1
  345. package/dist/6356.js +0 -1
  346. package/dist/6356.js.map +0 -1
  347. package/dist/6363.js +0 -1
  348. package/dist/6363.js.map +0 -1
  349. package/dist/6427.js +0 -1
  350. package/dist/6427.js.map +0 -1
  351. package/dist/6548.js +0 -1
  352. package/dist/6548.js.map +0 -1
  353. package/dist/6571.js +0 -1
  354. package/dist/6571.js.map +0 -1
  355. package/dist/6615.js +0 -1
  356. package/dist/6721.js +0 -1
  357. package/dist/6721.js.map +0 -1
  358. package/dist/682.js +0 -1
  359. package/dist/682.js.map +0 -1
  360. package/dist/6868.js +0 -1
  361. package/dist/6868.js.map +0 -1
  362. package/dist/689.js +0 -1
  363. package/dist/689.js.map +0 -1
  364. package/dist/7085.js +0 -1
  365. package/dist/7085.js.map +0 -1
  366. package/dist/7329.js +0 -1
  367. package/dist/7329.js.map +0 -1
  368. package/dist/7419.js +0 -1
  369. package/dist/7419.js.map +0 -1
  370. package/dist/7478.js +0 -1
  371. package/dist/7478.js.map +0 -1
  372. package/dist/754.js +0 -1
  373. package/dist/754.js.map +0 -1
  374. package/dist/7544.js +0 -1
  375. package/dist/7544.js.map +0 -1
  376. package/dist/7560.js +0 -1
  377. package/dist/7560.js.map +0 -1
  378. package/dist/781.js +0 -1
  379. package/dist/781.js.map +0 -1
  380. package/dist/7988.js +0 -1
  381. package/dist/7988.js.map +0 -1
  382. package/dist/8179.js +0 -6
  383. package/dist/8179.js.map +0 -1
  384. package/dist/8189.js +0 -1
  385. package/dist/8189.js.map +0 -1
  386. package/dist/8196.js +0 -1
  387. package/dist/8196.js.map +0 -1
  388. package/dist/8240.js +0 -1
  389. package/dist/8249.js +0 -1
  390. package/dist/8249.js.map +0 -1
  391. package/dist/8502.js +0 -1
  392. package/dist/8522.js +0 -1
  393. package/dist/8522.js.map +0 -1
  394. package/dist/8622.js +0 -1
  395. package/dist/8622.js.map +0 -1
  396. package/dist/8775.js +0 -11
  397. package/dist/8775.js.map +0 -1
  398. package/dist/8820.js +0 -1
  399. package/dist/8820.js.map +0 -1
  400. package/dist/887.js +0 -1
  401. package/dist/887.js.map +0 -1
  402. package/dist/8927.js +0 -1
  403. package/dist/8927.js.map +0 -1
  404. package/dist/8977.js +0 -1
  405. package/dist/8977.js.map +0 -1
  406. package/dist/9011.js +0 -1
  407. package/dist/9011.js.map +0 -1
  408. package/dist/9061.js +0 -1
  409. package/dist/9061.js.map +0 -1
  410. package/dist/916.js +0 -1
  411. package/dist/9303.js +0 -1
  412. package/dist/9303.js.map +0 -1
  413. package/dist/9425.js +0 -1
  414. package/dist/9466.js +0 -1
  415. package/dist/9466.js.map +0 -1
  416. package/dist/9520.js +0 -1
  417. package/dist/9520.js.map +0 -1
  418. package/dist/9675.js +0 -1
  419. package/dist/9675.js.map +0 -1
  420. package/dist/9787.js +0 -1
  421. package/dist/9787.js.map +0 -1
  422. package/dist/981.js +0 -1
  423. package/dist/981.js.map +0 -1
  424. package/dist/984.js +0 -1
  425. package/dist/984.js.map +0 -1
  426. package/dist/9931.js +0 -1
  427. package/dist/9931.js.map +0 -1
  428. package/dist/9947.js +0 -1
  429. package/jest.config.js +0 -8
@@ -9,6 +9,8 @@ import {
9
9
  useConfig,
10
10
  showModal,
11
11
  parseDate,
12
+ Workspace2,
13
+ Workspace2DefinitionProps,
12
14
  } from '@openmrs/esm-framework';
13
15
  import { Controller, FormProvider, useForm } from 'react-hook-form';
14
16
  import styles from './user-management.workspace.scss';
@@ -46,9 +48,9 @@ import {
46
48
  import UserManagementFormSchema from '../userManagementFormSchema';
47
49
  import { ChevronLeft, Query, ChevronRight } from '@carbon/react/icons';
48
50
  import { useSystemUserRoleConfigSetting } from '../../hook/useSystemRoleSetting';
49
- import { type CustomHIEPractitionerResponse, type PractitionerResponse, Provider, User } from '../../../types';
51
+ import { Provider, User } from '../../../types';
50
52
  import { searchHealthCareWork, HealthWorkerAdapter, NormalizedPractitioner } from '../../hook/healthWorkerAdapter';
51
- import { ROLE_CATEGORIES, SECTIONS, today } from '../../../constants';
53
+ import { ROLE_CATEGORIES, SECTIONS } from '../../../constants';
52
54
  import { ConfigObject } from '../../../config-schema';
53
55
  import { mutate } from 'swr';
54
56
  import { createProviderAttribute, updateProviderAttributes } from '../../modal/hwr-sync.resource';
@@ -58,13 +60,9 @@ type ManageUserWorkspaceProps = DefaultWorkspaceProps & {
58
60
  initialUserValue?: User;
59
61
  };
60
62
 
61
- const MinDate: Date = today();
62
-
63
- const ManageUserWorkspace: React.FC<ManageUserWorkspaceProps> = ({
63
+ const ManageUserWorkspace: React.FC<Workspace2DefinitionProps<ManageUserWorkspaceProps, {}, {}>> = ({
64
64
  closeWorkspace,
65
- promptBeforeClosing,
66
- closeWorkspaceWithSavedChanges,
67
- initialUserValue = {} as User,
65
+ workspaceProps: { initialUserValue = {} as User },
68
66
  }) => {
69
67
  const { t } = useTranslation();
70
68
  const isTablet = useLayoutType() === 'tablet';
@@ -76,6 +74,7 @@ const ManageUserWorkspace: React.FC<ManageUserWorkspaceProps> = ({
76
74
  const usernames =
77
75
  users?.map((user) => user.username).filter((username) => username !== initialUserValue?.username) || [];
78
76
  const isInitialValuesEmpty = Object.keys(initialUserValue).length === 0;
77
+ const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);
79
78
 
80
79
  const { userManagementFormSchema } = UserManagementFormSchema(usernames);
81
80
 
@@ -248,9 +247,9 @@ const ManageUserWorkspace: React.FC<ManageUserWorkspaceProps> = ({
248
247
 
249
248
  useEffect(() => {
250
249
  if (isDirty) {
251
- promptBeforeClosing(() => isDirty);
250
+ setHasUnsavedChanges(true);
252
251
  }
253
- }, [isDirty, promptBeforeClosing]);
252
+ }, [isDirty, setHasUnsavedChanges]);
254
253
 
255
254
  const setPractitionerValuesFromNormalized = (normalized: NormalizedPractitioner) => {
256
255
  setValue('givenName', normalized.firstName || '');
@@ -448,7 +447,7 @@ const ManageUserWorkspace: React.FC<ManageUserWorkspaceProps> = ({
448
447
  }
449
448
  handleMutation(`${restBaseUrl}/user`);
450
449
  mutate((key) => typeof key === 'string' && key.startsWith(`${restBaseUrl}/provider`));
451
- closeWorkspaceWithSavedChanges();
450
+ closeWorkspace({ discardUnsavedChanges: true });
452
451
  } catch (error) {
453
452
  showSnackbarMessage(
454
453
  t('userSaveFailed', 'Failed to save user'),
@@ -460,10 +459,12 @@ const ManageUserWorkspace: React.FC<ManageUserWorkspaceProps> = ({
460
459
 
461
460
  const handleError = (error, response) => {
462
461
  showSnackbar({
463
- title: t('userSaveFailed', 'Fail to save {{error}}', response),
464
- subtitle: t('userCreationFailedSubtitle', 'An error occurred while creating user {{errorMessage}}', {
465
- errorMessage: JSON.stringify(error, null, 2),
466
- }),
462
+ title: String(t('userSaveFailed', 'Fail to save {{error}}', response)),
463
+ subtitle: String(
464
+ t('userCreationFailedSubtitle', 'An error occurred while creating user {{errorMessage}}', {
465
+ errorMessage: JSON.stringify(error, null, 2),
466
+ }),
467
+ ),
467
468
  kind: 'error',
468
469
  isLowContrast: true,
469
470
  });
@@ -519,621 +520,625 @@ const ManageUserWorkspace: React.FC<ManageUserWorkspaceProps> = ({
519
520
  };
520
521
 
521
522
  return (
522
- <div className={styles.leftContainer}>
523
- <div>
524
- <div className={styles.leftLayout}>
525
- <ProgressIndicator
526
- currentIndex={currentIndex}
527
- spaceEqually={true}
528
- vertical={true}
529
- className={styles.progressIndicator}
530
- onChange={(newIndex) => {
531
- if (!searchHWR.isHWRLoading) {
532
- toggleSection(steps[newIndex].id);
533
- setCurrentIndex(newIndex);
534
- }
535
- }}>
536
- {steps.map((step, index) => (
537
- <ProgressStep key={step.id} label={step.label} className={styles.ProgresStep} />
538
- ))}
539
- </ProgressIndicator>
540
- <div className={styles.sections}>
541
- <FormProvider {...userFormMethods}>
542
- <form onSubmit={userFormMethods.handleSubmit(onSubmit, handleError)} className={styles.form}>
543
- <div className={styles.formContainer}>
544
- <Stack className={styles.formStackControl} gap={7}>
545
- {hasDemographicInfo && (
546
- <ResponsiveWrapper>
547
- <span className={styles.formHeaderSection}>
548
- {t('healthWorkVerify', 'Health worker registry verification')}
549
- </span>
550
- {searchHWR.isHWRLoading ? (
551
- <InlineLoading
552
- className={styles.formLoading}
553
- description={t('pullDetailsfromHWR', 'Pulling data from Health worker registry...')}
554
- />
555
- ) : (
556
- <>
523
+ <Workspace2 title={t('manageUserWorkspace', 'Manage User Workspace')} hasUnsavedChanges={hasUnsavedChanges}>
524
+ <div className={styles.leftContainer}>
525
+ <div>
526
+ <div className={styles.leftLayout}>
527
+ <ProgressIndicator
528
+ currentIndex={currentIndex}
529
+ spaceEqually={true}
530
+ vertical={true}
531
+ className={styles.progressIndicator}
532
+ onChange={(newIndex) => {
533
+ if (!searchHWR.isHWRLoading) {
534
+ toggleSection(steps[newIndex].id);
535
+ setCurrentIndex(newIndex);
536
+ }
537
+ }}>
538
+ {steps.map((step, index) => (
539
+ <ProgressStep key={step.id} label={step.label} className={styles.ProgresStep} />
540
+ ))}
541
+ </ProgressIndicator>
542
+ <div className={styles.sections}>
543
+ <FormProvider {...userFormMethods}>
544
+ <form onSubmit={userFormMethods.handleSubmit(onSubmit, handleError)} className={styles.form}>
545
+ <div className={styles.formContainer}>
546
+ <Stack className={styles.formStackControl} gap={7}>
547
+ {hasDemographicInfo && (
548
+ <ResponsiveWrapper>
549
+ <span className={styles.formHeaderSection}>
550
+ {t('healthWorkVerify', 'Health worker registry verification')}
551
+ </span>
552
+ {searchHWR.isHWRLoading ? (
553
+ <InlineLoading
554
+ className={styles.formLoading}
555
+ description={t('pullDetailsfromHWR', 'Pulling data from Health worker registry...')}
556
+ />
557
+ ) : (
557
558
  <>
558
- <Column>
559
- <ComboBox
560
- onChange={({ selectedItem }) => {
561
- setSearchHWR({ ...searchHWR, identifierType: selectedItem?.key ?? '' });
562
- }}
563
- id="formIdentifierType"
564
- titleText={t('identificationType', 'Identification Type')}
565
- placeholder={t('chooseIdentifierType', 'Choose identifier type')}
566
- initialSelectedItem={defaultIdentifierType}
567
- items={identifierTypes}
568
- itemToString={(item) => (item ? item.name : '')}
569
- />
570
- </Column>
571
- <Column>
572
- <ComboBox
573
- onChange={({ selectedItem }) => {
574
- setSearchHWR({ ...searchHWR, regulator: selectedItem?.key ?? '' });
575
- }}
576
- id="formRegulatorOptions"
577
- titleText={t('regulator', 'Regulator')}
578
- placeholder={t('chooseRegulatorType', 'Choose regulator option')}
579
- initialSelectedItem={defaultRegulator}
580
- items={regulatorOptions}
581
- itemToString={(item) => (item ? item.name : '')}
582
- />
583
- </Column>
584
- <Column>
585
- <span className={styles.formIdentifierType}>
586
- {t('identifierNumber', 'Identifier number*')}
587
- </span>
588
- <Row className={styles.formRow}>
589
- <Search
590
- labelText={t('enterIdentifierNumber', 'Enter identifier number')}
591
- className={styles.formSearch}
592
- defaultValue={searchHWR.identifier}
593
- placeholder={t('enterIdentifierNumber', 'Enter identifier number')}
594
- id="formSearchHealthWorkers"
595
- onChange={(value) => {
596
- setSearchHWR({ ...searchHWR, identifier: value.target.value });
559
+ <>
560
+ <Column>
561
+ <ComboBox
562
+ onChange={({ selectedItem }) => {
563
+ setSearchHWR({ ...searchHWR, identifierType: selectedItem?.key ?? '' });
597
564
  }}
565
+ id="formIdentifierType"
566
+ titleText={t('identificationType', 'Identification Type')}
567
+ placeholder={t('chooseIdentifierType', 'Choose identifier type')}
568
+ initialSelectedItem={defaultIdentifierType}
569
+ items={identifierTypes}
570
+ itemToString={(item) => (item ? item.name : '')}
598
571
  />
599
- <Button
600
- kind="secondary"
601
- size="md"
602
- renderIcon={Query}
603
- disabled={
604
- !searchHWR.identifier ||
605
- searchHWR.isHWRLoading ||
606
- !searchHWR.identifierType ||
607
- !searchHWR.regulator
608
- }
609
- iconDescription={t('search', 'Search')}
610
- hasIconOnly
611
- className={styles.formSearchButton}
612
- onClick={handleSearch}
613
- />
614
- </Row>
615
- </Column>
616
- </>
617
- <span className={styles.formHeaderSection}>{t('demographicInfo', 'Demographic info')}</span>
618
- <ResponsiveWrapper>
619
- <Controller
620
- name="givenName"
621
- control={userFormMethods.control}
622
- render={({ field }) => (
623
- <TextInput
624
- {...field}
625
- id="givenName"
626
- type="text"
627
- labelText={t('givenName', 'Given Name')}
628
- placeholder={t('userGivenName', 'Enter Given Name')}
629
- invalid={!!errors.givenName}
630
- invalidText={errors.givenName?.message}
631
- />
632
- )}
633
- />
634
- </ResponsiveWrapper>
635
- <ResponsiveWrapper>
636
- <Controller
637
- name="middleName"
638
- control={userFormMethods.control}
639
- render={({ field }) => (
640
- <TextInput
641
- {...field}
642
- id="middleName"
643
- labelText={t('middleName', 'Middle Name')}
644
- placeholder={t('middleName', 'Middle Name')}
645
- />
646
- )}
647
- />
648
- </ResponsiveWrapper>
649
- <ResponsiveWrapper>
650
- <Controller
651
- name="familyName"
652
- control={userFormMethods.control}
653
- render={({ field }) => (
654
- <TextInput
655
- {...field}
656
- id="familyName"
657
- labelText={t('familyName', 'Family Name')}
658
- placeholder={t('familyName', 'Family Name')}
659
- invalid={!!errors.familyName}
660
- invalidText={errors.familyName?.message}
661
- />
662
- )}
663
- />
664
- </ResponsiveWrapper>
665
- <ResponsiveWrapper>
666
- <Controller
667
- name="phoneNumber"
668
- control={userFormMethods.control}
669
- render={({ field }) => (
670
- <TextInput
671
- {...field}
672
- id="phoneNumber"
673
- type="text"
674
- disabled={isInitialValuesEmpty}
675
- labelText={t('phoneNumber', 'Phone Number')}
676
- placeholder={t('phoneNumber', 'Enter Phone Number')}
677
- invalid={!!errors.phoneNumber}
678
- invalidText={errors.phoneNumber?.message}
679
- />
680
- )}
681
- />
682
- </ResponsiveWrapper>
683
- <ResponsiveWrapper>
684
- <Controller
685
- name="email"
686
- control={userFormMethods.control}
687
- render={({ field }) => (
688
- <TextInput
689
- {...field}
690
- id="email"
691
- type="email"
692
- disabled={isInitialValuesEmpty}
693
- labelText={t('email', 'Email')}
694
- placeholder={t('email', 'Enter Email')}
695
- invalid={!!errors.email}
696
- invalidText={errors.email?.message}
697
- className={styles.checkboxLabelSingleLine}
572
+ </Column>
573
+ <Column>
574
+ <ComboBox
575
+ onChange={({ selectedItem }) => {
576
+ setSearchHWR({ ...searchHWR, regulator: selectedItem?.key ?? '' });
577
+ }}
578
+ id="formRegulatorOptions"
579
+ titleText={t('regulator', 'Regulator')}
580
+ placeholder={t('chooseRegulatorType', 'Choose regulator option')}
581
+ initialSelectedItem={defaultRegulator}
582
+ items={regulatorOptions}
583
+ itemToString={(item) => (item ? item.name : '')}
698
584
  />
699
- )}
700
- />
701
- </ResponsiveWrapper>
702
- <ResponsiveWrapper>
703
- <Controller
704
- name="gender"
705
- control={userFormMethods.control}
706
- render={({ field }) => (
707
- <RadioButtonGroup
708
- {...field}
709
- legendText={t('sex', 'Sex')}
710
- orientation="vertical"
711
- invalid={!!errors.gender}
712
- invalidText={errors.gender?.message}>
713
- <RadioButton
714
- value="M"
715
- id="M"
716
- labelText={t('male', 'Male')}
717
- checked={field.value === 'M'}
585
+ </Column>
586
+ <Column>
587
+ <span className={styles.formIdentifierType}>
588
+ {t('identifierNumber', 'Identifier number*')}
589
+ </span>
590
+ <Row className={styles.formRow}>
591
+ <Search
592
+ labelText={t('enterIdentifierNumber', 'Enter identifier number')}
593
+ className={styles.formSearch}
594
+ defaultValue={searchHWR.identifier}
595
+ placeholder={t('enterIdentifierNumber', 'Enter identifier number')}
596
+ id="formSearchHealthWorkers"
597
+ onChange={(value) => {
598
+ setSearchHWR({ ...searchHWR, identifier: value.target.value });
599
+ }}
718
600
  />
719
- <RadioButton
720
- value="F"
721
- id="F"
722
- labelText={t('female', 'Female')}
723
- checked={field.value === 'F'}
601
+ <Button
602
+ kind="secondary"
603
+ size="md"
604
+ renderIcon={Query}
605
+ disabled={
606
+ !searchHWR.identifier ||
607
+ searchHWR.isHWRLoading ||
608
+ !searchHWR.identifierType ||
609
+ !searchHWR.regulator
610
+ }
611
+ iconDescription={t('search', 'Search')}
612
+ hasIconOnly
613
+ className={styles.formSearchButton}
614
+ onClick={handleSearch}
724
615
  />
725
- </RadioButtonGroup>
726
- )}
727
- />
728
- </ResponsiveWrapper>
729
- </>
730
- )}
731
- </ResponsiveWrapper>
732
- )}
733
- {hasProviderAccount && (
734
- <ResponsiveWrapper>
735
- <span className={styles.formHeaderSection}>{t('providerDetails', 'Provider details')}</span>
736
- <ResponsiveWrapper>
737
- <Controller
738
- name="providerUniqueIdentifier"
739
- control={userFormMethods.control}
740
- render={({ field }) => (
741
- <TextInput
742
- {...field}
743
- id="providerUniqueIdentifier"
744
- type="text"
745
- labelText={t('providerUniqueIdentifier', 'Provider Unique Identifier')}
746
- placeholder={t(
747
- 'providerUniqueIdentifierPlaceholder',
748
- 'Enter Provider Unqiue Identifier',
749
- )}
750
- invalid={!!errors.providerUniqueIdentifier}
751
- invalidText={errors.providerUniqueIdentifier?.message}
752
- />
753
- )}
754
- />
755
- </ResponsiveWrapper>
756
- <ResponsiveWrapper>
757
- <Controller
758
- name="nationalId"
759
- control={userFormMethods.control}
760
- render={({ field }) => (
761
- <TextInput
762
- {...field}
763
- id="nationalId"
764
- disabled={isInitialValuesEmpty}
765
- type="text"
766
- labelText={t('nationalID', 'National id')}
767
- placeholder={t('nationalID', 'National id')}
768
- invalid={!!errors.nationalId}
769
- invalidText={errors.nationalId?.message}
770
- className={styles.checkboxLabelSingleLine}
771
- />
772
- )}
773
- />
774
- </ResponsiveWrapper>
775
- <ResponsiveWrapper>
776
- <Controller
777
- name="passportNumber"
778
- control={userFormMethods.control}
779
- render={({ field }) => (
780
- <TextInput
781
- {...field}
782
- id="passportNumber"
783
- disabled={isInitialValuesEmpty}
784
- type="text"
785
- labelText={t('passportNumber', 'Passport number')}
786
- placeholder={t('passportNumber', 'Passport number')}
787
- invalid={!!errors.nationalId}
788
- invalidText={errors.nationalId?.message}
789
- className={styles.checkboxLabelSingleLine}
790
- />
791
- )}
792
- />
793
- </ResponsiveWrapper>
794
- <ResponsiveWrapper>
795
- <Controller
796
- name="providerLicense"
797
- control={userFormMethods.control}
798
- render={({ field }) => (
799
- <TextInput
800
- {...field}
801
- id="providerLicense"
802
- type="text"
803
- disabled={isInitialValuesEmpty}
804
- labelText={t('providerLicense', 'License Number')}
805
- placeholder={t('providerLicense', 'License Number')}
806
- className={styles.checkboxLabelSingleLine}
807
- />
808
- )}
809
- />
810
- </ResponsiveWrapper>
811
- <ResponsiveWrapper>
812
- <Controller
813
- name="registrationNumber"
814
- control={userFormMethods.control}
815
- render={({ field }) => (
816
- <TextInput
817
- {...field}
818
- id="registrationNumber"
819
- type="text"
820
- disabled={isInitialValuesEmpty}
821
- labelText={t('registrationNumber', 'Registration Number')}
822
- placeholder={t('registrationNumber', 'Registration Number')}
823
- className={styles.checkboxLabelSingleLine}
824
- />
825
- )}
826
- />
827
- </ResponsiveWrapper>
828
- <ResponsiveWrapper>
829
- <Controller
830
- name="qualification"
831
- control={userFormMethods.control}
832
- render={({ field }) => (
833
- <TextInput
834
- {...field}
835
- id="qualification"
836
- type="qualification"
837
- disabled
838
- labelText={t('qualification', 'Qualification')}
839
- placeholder={t('qualification', 'Qualification')}
840
- invalid={!!errors.qualification}
841
- invalidText={errors.qualification?.message}
842
- className={styles.checkboxLabelSingleLine}
843
- />
844
- )}
845
- />
616
+ </Row>
617
+ </Column>
618
+ </>
619
+ <span className={styles.formHeaderSection}>
620
+ {t('demographicInfo', 'Demographic info')}
621
+ </span>
622
+ <ResponsiveWrapper>
623
+ <Controller
624
+ name="givenName"
625
+ control={userFormMethods.control}
626
+ render={({ field }) => (
627
+ <TextInput
628
+ {...field}
629
+ id="givenName"
630
+ type="text"
631
+ labelText={t('givenName', 'Given Name')}
632
+ placeholder={t('userGivenName', 'Enter Given Name')}
633
+ invalid={!!errors.givenName}
634
+ invalidText={errors.givenName?.message}
635
+ />
636
+ )}
637
+ />
638
+ </ResponsiveWrapper>
639
+ <ResponsiveWrapper>
640
+ <Controller
641
+ name="middleName"
642
+ control={userFormMethods.control}
643
+ render={({ field }) => (
644
+ <TextInput
645
+ {...field}
646
+ id="middleName"
647
+ labelText={t('middleName', 'Middle Name')}
648
+ placeholder={t('middleName', 'Middle Name')}
649
+ />
650
+ )}
651
+ />
652
+ </ResponsiveWrapper>
653
+ <ResponsiveWrapper>
654
+ <Controller
655
+ name="familyName"
656
+ control={userFormMethods.control}
657
+ render={({ field }) => (
658
+ <TextInput
659
+ {...field}
660
+ id="familyName"
661
+ labelText={t('familyName', 'Family Name')}
662
+ placeholder={t('familyName', 'Family Name')}
663
+ invalid={!!errors.familyName}
664
+ invalidText={errors.familyName?.message}
665
+ />
666
+ )}
667
+ />
668
+ </ResponsiveWrapper>
669
+ <ResponsiveWrapper>
670
+ <Controller
671
+ name="phoneNumber"
672
+ control={userFormMethods.control}
673
+ render={({ field }) => (
674
+ <TextInput
675
+ {...field}
676
+ id="phoneNumber"
677
+ type="text"
678
+ disabled={isInitialValuesEmpty}
679
+ labelText={t('phoneNumber', 'Phone Number')}
680
+ placeholder={t('phoneNumber', 'Enter Phone Number')}
681
+ invalid={!!errors.phoneNumber}
682
+ invalidText={errors.phoneNumber?.message}
683
+ />
684
+ )}
685
+ />
686
+ </ResponsiveWrapper>
687
+ <ResponsiveWrapper>
688
+ <Controller
689
+ name="email"
690
+ control={userFormMethods.control}
691
+ render={({ field }) => (
692
+ <TextInput
693
+ {...field}
694
+ id="email"
695
+ type="email"
696
+ disabled={isInitialValuesEmpty}
697
+ labelText={t('email', 'Email')}
698
+ placeholder={t('email', 'Enter Email')}
699
+ invalid={!!errors.email}
700
+ invalidText={errors.email?.message}
701
+ className={styles.checkboxLabelSingleLine}
702
+ />
703
+ )}
704
+ />
705
+ </ResponsiveWrapper>
706
+ <ResponsiveWrapper>
707
+ <Controller
708
+ name="gender"
709
+ control={userFormMethods.control}
710
+ render={({ field }) => (
711
+ <RadioButtonGroup
712
+ {...field}
713
+ legendText={t('sex', 'Sex')}
714
+ orientation="vertical"
715
+ invalid={!!errors.gender}
716
+ invalidText={errors.gender?.message}>
717
+ <RadioButton
718
+ value="M"
719
+ id="M"
720
+ labelText={t('male', 'Male')}
721
+ checked={field.value === 'M'}
722
+ />
723
+ <RadioButton
724
+ value="F"
725
+ id="F"
726
+ labelText={t('female', 'Female')}
727
+ checked={field.value === 'F'}
728
+ />
729
+ </RadioButtonGroup>
730
+ )}
731
+ />
732
+ </ResponsiveWrapper>
733
+ </>
734
+ )}
846
735
  </ResponsiveWrapper>
847
-
736
+ )}
737
+ {hasProviderAccount && (
848
738
  <ResponsiveWrapper>
849
- <Controller
850
- name="licenseExpiryDate"
851
- control={userFormMethods.control}
852
- render={({ field }) => (
853
- <DatePicker
854
- datePickerType="single"
855
- className={styles.formDatePicker}
856
- onChange={(event) => {
857
- if (event.length) {
858
- field.onChange(event[0]);
859
- }
860
- }}
861
- value={field.value ? new Date(field.value) : ''}>
862
- <DatePickerInput
863
- className={styles.formDatePicker}
864
- placeholder="mm/dd/yyyy"
865
- labelText={t('licenseExpiryDate', 'License Expiry Date')}
866
- id="formLicenseDatePicker"
867
- size="md"
739
+ <span className={styles.formHeaderSection}>{t('providerDetails', 'Provider details')}</span>
740
+ <ResponsiveWrapper>
741
+ <Controller
742
+ name="providerUniqueIdentifier"
743
+ control={userFormMethods.control}
744
+ render={({ field }) => (
745
+ <TextInput
746
+ {...field}
747
+ id="providerUniqueIdentifier"
748
+ type="text"
749
+ labelText={t('providerUniqueIdentifier', 'Provider Unique Identifier')}
750
+ placeholder={t(
751
+ 'providerUniqueIdentifierPlaceholder',
752
+ 'Enter Provider Unqiue Identifier',
753
+ )}
754
+ invalid={!!errors.providerUniqueIdentifier}
755
+ invalidText={errors.providerUniqueIdentifier?.message}
756
+ />
757
+ )}
758
+ />
759
+ </ResponsiveWrapper>
760
+ <ResponsiveWrapper>
761
+ <Controller
762
+ name="nationalId"
763
+ control={userFormMethods.control}
764
+ render={({ field }) => (
765
+ <TextInput
766
+ {...field}
767
+ id="nationalId"
768
+ disabled={isInitialValuesEmpty}
769
+ type="text"
770
+ labelText={t('nationalID', 'National id')}
771
+ placeholder={t('nationalID', 'National id')}
772
+ invalid={!!errors.nationalId}
773
+ invalidText={errors.nationalId?.message}
774
+ className={styles.checkboxLabelSingleLine}
775
+ />
776
+ )}
777
+ />
778
+ </ResponsiveWrapper>
779
+ <ResponsiveWrapper>
780
+ <Controller
781
+ name="passportNumber"
782
+ control={userFormMethods.control}
783
+ render={({ field }) => (
784
+ <TextInput
785
+ {...field}
786
+ id="passportNumber"
787
+ disabled={isInitialValuesEmpty}
788
+ type="text"
789
+ labelText={t('passportNumber', 'Passport number')}
790
+ placeholder={t('passportNumber', 'Passport number')}
791
+ invalid={!!errors.nationalId}
792
+ invalidText={errors.nationalId?.message}
793
+ className={styles.checkboxLabelSingleLine}
794
+ />
795
+ )}
796
+ />
797
+ </ResponsiveWrapper>
798
+ <ResponsiveWrapper>
799
+ <Controller
800
+ name="providerLicense"
801
+ control={userFormMethods.control}
802
+ render={({ field }) => (
803
+ <TextInput
804
+ {...field}
805
+ id="providerLicense"
806
+ type="text"
807
+ disabled={isInitialValuesEmpty}
808
+ labelText={t('providerLicense', 'License Number')}
809
+ placeholder={t('providerLicense', 'License Number')}
810
+ className={styles.checkboxLabelSingleLine}
811
+ />
812
+ )}
813
+ />
814
+ </ResponsiveWrapper>
815
+ <ResponsiveWrapper>
816
+ <Controller
817
+ name="registrationNumber"
818
+ control={userFormMethods.control}
819
+ render={({ field }) => (
820
+ <TextInput
821
+ {...field}
822
+ id="registrationNumber"
823
+ type="text"
824
+ disabled={isInitialValuesEmpty}
825
+ labelText={t('registrationNumber', 'Registration Number')}
826
+ placeholder={t('registrationNumber', 'Registration Number')}
827
+ className={styles.checkboxLabelSingleLine}
828
+ />
829
+ )}
830
+ />
831
+ </ResponsiveWrapper>
832
+ <ResponsiveWrapper>
833
+ <Controller
834
+ name="qualification"
835
+ control={userFormMethods.control}
836
+ render={({ field }) => (
837
+ <TextInput
838
+ {...field}
839
+ id="qualification"
840
+ type="qualification"
868
841
  disabled
869
- invalid={!!errors.licenseExpiryDate}
870
- invalidText={errors.licenseExpiryDate?.message}
842
+ labelText={t('qualification', 'Qualification')}
843
+ placeholder={t('qualification', 'Qualification')}
844
+ invalid={!!errors.qualification}
845
+ invalidText={errors.qualification?.message}
846
+ className={styles.checkboxLabelSingleLine}
871
847
  />
872
- </DatePicker>
873
- )}
874
- />
875
- </ResponsiveWrapper>
876
- {loadingProvider || providerError ? (
877
- <InlineLoading status="active" iconDescription="Loading" description="Loading data..." />
878
- ) : provider.length > 0 ? (
879
- <>
880
- <ResponsiveWrapper>
881
- <Controller
882
- name="systemId"
883
- control={userFormMethods.control}
884
- render={({ field }) => (
885
- <TextInput
886
- {...field}
887
- id="systemeId"
888
- type="text"
889
- labelText={t('providerId', 'Provider Id')}
890
- placeholder={t('providerId', 'Provider Id')}
891
- invalid={!!errors.systemId}
892
- invalidText={errors.systemId?.message}
893
- className={styles.checkboxLabelSingleLine}
848
+ )}
849
+ />
850
+ </ResponsiveWrapper>
851
+
852
+ <ResponsiveWrapper>
853
+ <Controller
854
+ name="licenseExpiryDate"
855
+ control={userFormMethods.control}
856
+ render={({ field }) => (
857
+ <DatePicker
858
+ datePickerType="single"
859
+ className={styles.formDatePicker}
860
+ onChange={(event) => {
861
+ if (event.length) {
862
+ field.onChange(event[0]);
863
+ }
864
+ }}
865
+ value={field.value ? new Date(field.value) : ''}>
866
+ <DatePickerInput
867
+ className={styles.formDatePicker}
868
+ placeholder="mm/dd/yyyy"
869
+ labelText={t('licenseExpiryDate', 'License Expiry Date')}
870
+ id="formLicenseDatePicker"
871
+ size="md"
872
+ disabled
873
+ invalid={!!errors.licenseExpiryDate}
874
+ invalidText={errors.licenseExpiryDate?.message}
894
875
  />
895
- )}
896
- />
876
+ </DatePicker>
877
+ )}
878
+ />
879
+ </ResponsiveWrapper>
880
+ {loadingProvider || providerError ? (
881
+ <InlineLoading status="active" iconDescription="Loading" description="Loading data..." />
882
+ ) : provider.length > 0 ? (
883
+ <>
884
+ <ResponsiveWrapper>
885
+ <Controller
886
+ name="systemId"
887
+ control={userFormMethods.control}
888
+ render={({ field }) => (
889
+ <TextInput
890
+ {...field}
891
+ id="systemeId"
892
+ type="text"
893
+ labelText={t('providerId', 'Provider Id')}
894
+ placeholder={t('providerId', 'Provider Id')}
895
+ invalid={!!errors.systemId}
896
+ invalidText={errors.systemId?.message}
897
+ className={styles.checkboxLabelSingleLine}
898
+ />
899
+ )}
900
+ />
901
+ <Controller
902
+ name="isEditProvider"
903
+ control={userFormMethods.control}
904
+ render={({ field }) => (
905
+ <CheckboxGroup
906
+ legendText={t('editProvider', 'Edit Provider Details')}
907
+ className={styles.multilineCheckboxLabel}>
908
+ <Checkbox
909
+ className={styles.checkboxLabelSingleLine}
910
+ id="isEditProvider"
911
+ labelText={t('EditProviderDetails', 'Edit provider details?')}
912
+ checked={field.value || false}
913
+ onChange={(e) => field.onChange(e.target.checked)}
914
+ />
915
+ </CheckboxGroup>
916
+ )}
917
+ />
918
+ </ResponsiveWrapper>
919
+ </>
920
+ ) : (
921
+ <>
897
922
  <Controller
898
- name="isEditProvider"
923
+ name="providerIdentifiers"
899
924
  control={userFormMethods.control}
900
925
  render={({ field }) => (
901
926
  <CheckboxGroup
902
- legendText={t('editProvider', 'Edit Provider Details')}
927
+ legendText={t('providerIdentifiers', 'Provider Details')}
903
928
  className={styles.multilineCheckboxLabel}>
904
929
  <Checkbox
905
930
  className={styles.checkboxLabelSingleLine}
906
- id="isEditProvider"
907
- labelText={t('EditProviderDetails', 'Edit provider details?')}
931
+ id="providerIdentifiersa"
932
+ labelText={t('providerIdentifiers', 'Create a Provider account for this user')}
908
933
  checked={field.value || false}
909
934
  onChange={(e) => field.onChange(e.target.checked)}
910
935
  />
911
936
  </CheckboxGroup>
912
937
  )}
913
938
  />
914
- </ResponsiveWrapper>
915
- </>
916
- ) : (
917
- <>
939
+ </>
940
+ )}
941
+ </ResponsiveWrapper>
942
+ )}
943
+ {hasLoginInfo && (
944
+ <ResponsiveWrapper>
945
+ <span className={styles.formHeaderSection}>{t('loginInfo', 'Login Info')}</span>
946
+ <ResponsiveWrapper>
918
947
  <Controller
919
- name="providerIdentifiers"
948
+ name="username"
949
+ control={userFormMethods.control}
950
+ render={({ field }) => (
951
+ <TextInput
952
+ {...field}
953
+ id="username"
954
+ labelText={t('username', 'Username')}
955
+ invalid={!!errors.username}
956
+ invalidText={errors.username?.message}
957
+ />
958
+ )}
959
+ />
960
+ </ResponsiveWrapper>
961
+
962
+ <ResponsiveWrapper>
963
+ <Controller
964
+ name="password"
965
+ control={userFormMethods.control}
966
+ rules={
967
+ isInitialValuesEmpty
968
+ ? {
969
+ required: 'Password is required',
970
+ minLength: { value: 8, message: 'Password must be at least 8 characters long' },
971
+ pattern: {
972
+ value: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/,
973
+ message: 'Password must include uppercase, lowercase, and a number',
974
+ },
975
+ }
976
+ : {}
977
+ }
978
+ render={({ field }) => (
979
+ <PasswordInput
980
+ {...field}
981
+ id="password"
982
+ labelText="Password"
983
+ invalid={!!errors.password}
984
+ invalidText={errors.password?.message}
985
+ />
986
+ )}
987
+ />
988
+ </ResponsiveWrapper>
989
+ <ResponsiveWrapper>
990
+ <Controller
991
+ name="confirmPassword"
992
+ control={userFormMethods.control}
993
+ rules={
994
+ isInitialValuesEmpty
995
+ ? {
996
+ required: 'Please confirm your password',
997
+ validate: (value) =>
998
+ value === userFormMethods.watch('password') || 'Passwords do not match',
999
+ }
1000
+ : {}
1001
+ }
1002
+ render={({ field }) => (
1003
+ <PasswordInput
1004
+ {...field}
1005
+ id="confirmPassword"
1006
+ labelText="Confirm Password"
1007
+ invalid={!!errors.confirmPassword}
1008
+ invalidText={errors.confirmPassword?.message}
1009
+ />
1010
+ )}
1011
+ />
1012
+ </ResponsiveWrapper>
1013
+ <ResponsiveWrapper>
1014
+ <Controller
1015
+ name="forcePasswordChange"
920
1016
  control={userFormMethods.control}
921
1017
  render={({ field }) => (
922
1018
  <CheckboxGroup
923
- legendText={t('providerIdentifiers', 'Provider Details')}
924
- className={styles.multilineCheckboxLabel}>
1019
+ legendText={t('forcePasswordChange', 'Force Password Change')}
1020
+ className={styles.checkboxGroupGrid}>
925
1021
  <Checkbox
926
- className={styles.checkboxLabelSingleLine}
927
- id="providerIdentifiersa"
928
- labelText={t('providerIdentifiers', 'Create a Provider account for this user')}
929
- checked={field.value || false}
1022
+ className={styles.multilineCheckboxLabel}
1023
+ id="forcePasswordChange"
1024
+ labelText={t(
1025
+ 'forcePasswordChangeHelper',
1026
+ 'Optionally require this user to change their password on next login',
1027
+ )}
1028
+ checked={!!field.value || false}
930
1029
  onChange={(e) => field.onChange(e.target.checked)}
931
1030
  />
932
1031
  </CheckboxGroup>
933
1032
  )}
934
1033
  />
935
- </>
936
- )}
937
- </ResponsiveWrapper>
938
- )}
939
- {hasLoginInfo && (
940
- <ResponsiveWrapper>
941
- <span className={styles.formHeaderSection}>{t('loginInfo', 'Login Info')}</span>
942
- <ResponsiveWrapper>
943
- <Controller
944
- name="username"
945
- control={userFormMethods.control}
946
- render={({ field }) => (
947
- <TextInput
948
- {...field}
949
- id="username"
950
- labelText={t('username', 'Username')}
951
- invalid={!!errors.username}
952
- invalidText={errors.username?.message}
953
- />
954
- )}
955
- />
956
- </ResponsiveWrapper>
957
-
958
- <ResponsiveWrapper>
959
- <Controller
960
- name="password"
961
- control={userFormMethods.control}
962
- rules={
963
- isInitialValuesEmpty
964
- ? {
965
- required: 'Password is required',
966
- minLength: { value: 8, message: 'Password must be at least 8 characters long' },
967
- pattern: {
968
- value: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/,
969
- message: 'Password must include uppercase, lowercase, and a number',
970
- },
971
- }
972
- : {}
973
- }
974
- render={({ field }) => (
975
- <PasswordInput
976
- {...field}
977
- id="password"
978
- labelText="Password"
979
- invalid={!!errors.password}
980
- invalidText={errors.password?.message}
981
- />
982
- )}
983
- />
984
- </ResponsiveWrapper>
985
- <ResponsiveWrapper>
986
- <Controller
987
- name="confirmPassword"
988
- control={userFormMethods.control}
989
- rules={
990
- isInitialValuesEmpty
991
- ? {
992
- required: 'Please confirm your password',
993
- validate: (value) =>
994
- value === userFormMethods.watch('password') || 'Passwords do not match',
995
- }
996
- : {}
997
- }
998
- render={({ field }) => (
999
- <PasswordInput
1000
- {...field}
1001
- id="confirmPassword"
1002
- labelText="Confirm Password"
1003
- invalid={!!errors.confirmPassword}
1004
- invalidText={errors.confirmPassword?.message}
1005
- />
1006
- )}
1007
- />
1008
- </ResponsiveWrapper>
1009
- <ResponsiveWrapper>
1010
- <Controller
1011
- name="forcePasswordChange"
1012
- control={userFormMethods.control}
1013
- render={({ field }) => (
1014
- <CheckboxGroup
1015
- legendText={t('forcePasswordChange', 'Force Password Change')}
1016
- className={styles.checkboxGroupGrid}>
1017
- <Checkbox
1018
- className={styles.multilineCheckboxLabel}
1019
- id="forcePasswordChange"
1020
- labelText={t(
1021
- 'forcePasswordChangeHelper',
1022
- 'Optionally require this user to change their password on next login',
1023
- )}
1024
- checked={!!field.value || false}
1025
- onChange={(e) => field.onChange(e.target.checked)}
1026
- />
1027
- </CheckboxGroup>
1028
- )}
1029
- />
1034
+ </ResponsiveWrapper>
1030
1035
  </ResponsiveWrapper>
1031
- </ResponsiveWrapper>
1032
- )}
1036
+ )}
1033
1037
 
1034
- {hasRoles && (
1035
- <ResponsiveWrapper>
1036
- <span className={styles.formHeaderSection}>{t('rolesInfo', 'Roles Info')}</span>
1038
+ {hasRoles && (
1037
1039
  <ResponsiveWrapper>
1038
- {filterRolesConfig(rolesConfig).map((category) => (
1039
- <Column key={category.category} xsm={8} md={12} lg={12} className={styles.checkBoxColumn}>
1040
- <CheckboxGroup legendText={category.category} className={styles.checkboxGroupGrid}>
1041
- {isLoading ? (
1042
- <InlineLoading
1043
- status="active"
1044
- iconDescription="Loading"
1045
- description="Loading data..."
1046
- />
1047
- ) : (
1048
- <Controller
1049
- name="roles"
1050
- control={userFormMethods.control}
1051
- render={({ field }) => {
1052
- const selectedRoles = field.value || [];
1040
+ <span className={styles.formHeaderSection}>{t('rolesInfo', 'Roles Info')}</span>
1041
+ <ResponsiveWrapper>
1042
+ {filterRolesConfig(rolesConfig).map((category) => (
1043
+ <Column key={category.category} xsm={8} md={12} lg={12} className={styles.checkBoxColumn}>
1044
+ <CheckboxGroup legendText={category.category} className={styles.checkboxGroupGrid}>
1045
+ {isLoading ? (
1046
+ <InlineLoading
1047
+ status="active"
1048
+ iconDescription="Loading"
1049
+ description="Loading data..."
1050
+ />
1051
+ ) : (
1052
+ <Controller
1053
+ name="roles"
1054
+ control={userFormMethods.control}
1055
+ render={({ field }) => {
1056
+ const selectedRoles = field.value || [];
1053
1057
 
1054
- return (
1055
- <>
1056
- {roles
1057
- .filter((role) => category.roles.includes(role.name))
1058
- .map((role) => {
1059
- const isSelected = selectedRoles.some(
1060
- (r) =>
1061
- r.display === role.display &&
1062
- r.description === role.description &&
1063
- r.uuid === role.uuid,
1064
- );
1058
+ return (
1059
+ <>
1060
+ {roles
1061
+ .filter((role) => category.roles.includes(role.name))
1062
+ .map((role) => {
1063
+ const isSelected = selectedRoles.some(
1064
+ (r) =>
1065
+ r.display === role.display &&
1066
+ r.description === role.description &&
1067
+ r.uuid === role.uuid,
1068
+ );
1065
1069
 
1066
- return (
1067
- <label
1068
- key={role.display}
1069
- className={
1070
- isSelected ? styles.checkboxLabelSelected : styles.checkboxLabel
1071
- }>
1072
- <input
1073
- type="checkbox"
1074
- id={role.display}
1075
- checked={isSelected}
1076
- onChange={(e) => {
1077
- const updatedValue = e.target.checked
1078
- ? [
1079
- ...selectedRoles,
1080
- {
1081
- uuid: role.uuid,
1082
- display: role.display,
1083
- description: role.description ?? null,
1084
- },
1085
- ]
1086
- : selectedRoles.filter(
1087
- (selectedRole) => selectedRole.display !== role.display,
1088
- );
1070
+ return (
1071
+ <label
1072
+ key={role.display}
1073
+ className={
1074
+ isSelected ? styles.checkboxLabelSelected : styles.checkboxLabel
1075
+ }>
1076
+ <input
1077
+ type="checkbox"
1078
+ id={role.display}
1079
+ checked={isSelected}
1080
+ onChange={(e) => {
1081
+ const updatedValue = e.target.checked
1082
+ ? [
1083
+ ...selectedRoles,
1084
+ {
1085
+ uuid: role.uuid,
1086
+ display: role.display,
1087
+ description: role.description ?? null,
1088
+ },
1089
+ ]
1090
+ : selectedRoles.filter(
1091
+ (selectedRole) => selectedRole.display !== role.display,
1092
+ );
1089
1093
 
1090
- field.onChange(updatedValue);
1091
- }}
1092
- />
1093
- {role.display}
1094
- </label>
1095
- );
1096
- })}
1097
- </>
1098
- );
1099
- }}
1100
- />
1101
- )}
1102
- </CheckboxGroup>
1103
- </Column>
1104
- ))}
1094
+ field.onChange(updatedValue);
1095
+ }}
1096
+ />
1097
+ {role.display}
1098
+ </label>
1099
+ );
1100
+ })}
1101
+ </>
1102
+ );
1103
+ }}
1104
+ />
1105
+ )}
1106
+ </CheckboxGroup>
1107
+ </Column>
1108
+ ))}
1109
+ </ResponsiveWrapper>
1105
1110
  </ResponsiveWrapper>
1106
- </ResponsiveWrapper>
1107
- )}
1108
- </Stack>
1109
- </div>
1110
- <ButtonSet className={classNames({ [styles.tablet]: isTablet, [styles.desktop]: !isTablet })}>
1111
- <Button kind="secondary" onClick={handleBackClick} className={styles.btn}>
1112
- {t(hasDemographicInfo ? 'cancel' : 'back', hasDemographicInfo ? 'Cancel' : 'Back')}
1113
- </Button>
1111
+ )}
1112
+ </Stack>
1113
+ </div>
1114
+ <ButtonSet className={classNames({ [styles.tablet]: isTablet, [styles.desktop]: !isTablet })}>
1115
+ <Button kind="secondary" onClick={handleBackClick} className={styles.btn}>
1116
+ {t(hasDemographicInfo ? 'cancel' : 'back', hasDemographicInfo ? 'Cancel' : 'Back')}
1117
+ </Button>
1114
1118
 
1115
- <Button
1116
- kind="primary"
1117
- type={getSubmitButtonType()}
1118
- disabled={isSubmitting || Object.keys(errors).length > 0 || searchHWR.isHWRLoading}
1119
- renderIcon={getSubmitButtonIcon()}
1120
- className={styles.btn}
1121
- onClick={handleNextClick}>
1122
- {isSubmitting ? (
1123
- <span style={{ display: 'flex', alignItems: 'center' }}>
1124
- {t('submitting', 'Submitting...')} <InlineLoading status="active" />
1125
- </span>
1126
- ) : (
1127
- getSubmitButtonText()
1128
- )}
1129
- </Button>
1130
- </ButtonSet>
1131
- </form>
1132
- </FormProvider>
1119
+ <Button
1120
+ kind="primary"
1121
+ type={getSubmitButtonType()}
1122
+ disabled={isSubmitting || Object.keys(errors).length > 0 || searchHWR.isHWRLoading}
1123
+ renderIcon={getSubmitButtonIcon()}
1124
+ className={styles.btn}
1125
+ onClick={handleNextClick}>
1126
+ {isSubmitting ? (
1127
+ <span style={{ display: 'flex', alignItems: 'center' }}>
1128
+ {t('submitting', 'Submitting...')} <InlineLoading status="active" />
1129
+ </span>
1130
+ ) : (
1131
+ getSubmitButtonText()
1132
+ )}
1133
+ </Button>
1134
+ </ButtonSet>
1135
+ </form>
1136
+ </FormProvider>
1137
+ </div>
1133
1138
  </div>
1134
1139
  </div>
1135
1140
  </div>
1136
- </div>
1141
+ </Workspace2>
1137
1142
  );
1138
1143
  };
1139
1144