@argusoft/medplat-core 1.0.30 → 1.0.31

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 (156) hide show
  1. package/dist/{AccessRights-xrday-L1.js → AccessRights-DUgY6ewy.js} +151 -143
  2. package/dist/AccessRights-DUgY6ewy.js.map +1 -0
  3. package/dist/AddMenuConfiguration-c6ZKiN0i.js +8898 -0
  4. package/dist/AddMenuConfiguration-c6ZKiN0i.js.map +1 -0
  5. package/dist/{BrandsPage-DmRW5bhm-Bk1szrjI.js → BrandsPage-DMw2vT0u-BVhvhc6J.js} +14 -14
  6. package/dist/{BrandsPage-DmRW5bhm-Bk1szrjI.js.map → BrandsPage-DMw2vT0u-BVhvhc6J.js.map} +1 -1
  7. package/dist/{CategoriesPage-BsS5IQh3-B03lWRY5.js → CategoriesPage-D3ihx9Gi-CT58g0ry.js} +112 -105
  8. package/dist/CategoriesPage-D3ihx9Gi-CT58g0ry.js.map +1 -0
  9. package/dist/{ChangePasswordModalCore-BPsJquTS.js → ChangePasswordModalCore-lQ9GamH1.js} +3 -3
  10. package/dist/{ChangePasswordModalCore-BPsJquTS.js.map → ChangePasswordModalCore-lQ9GamH1.js.map} +1 -1
  11. package/dist/ConditionConfig-BQBmBHaM.js +408 -0
  12. package/dist/ConditionConfig-BQBmBHaM.js.map +1 -0
  13. package/dist/{DashboardPage-C3bKc5na-sBd9Yqbi.js → DashboardPage-asr2XDRu-uOOlX9Vq.js} +29 -29
  14. package/dist/{DashboardPage-C3bKc5na-sBd9Yqbi.js.map → DashboardPage-asr2XDRu-uOOlX9Vq.js.map} +1 -1
  15. package/dist/EventConfig-BY2cgGyx.js +27 -0
  16. package/dist/{EventConfig-BmLemzX3.js.map → EventConfig-BY2cgGyx.js.map} +1 -1
  17. package/dist/EventConfigurations-CUPEN5BV.js +544 -0
  18. package/dist/EventConfigurations-CUPEN5BV.js.map +1 -0
  19. package/dist/EventConfigurations.css +1 -1
  20. package/dist/EventsExceptionModal-BX-ArkBE.js +188 -0
  21. package/dist/EventsExceptionModal-BX-ArkBE.js.map +1 -0
  22. package/dist/EventsUi-D6O9S7BK.js +258 -0
  23. package/dist/EventsUi-D6O9S7BK.js.map +1 -0
  24. package/dist/{FacilityPicker-BiZeupmP-CyPHmj6b.js → FacilityPicker-DYl_PDyt-Cbwo2tAY.js} +10 -10
  25. package/dist/{FacilityPicker-BiZeupmP-CyPHmj6b.js.map → FacilityPicker-DYl_PDyt-Cbwo2tAY.js.map} +1 -1
  26. package/dist/{FeatureMenu-DYJmDt7q.js → FeatureMenu-CHsBbw3W.js} +9 -5
  27. package/dist/FeatureMenu-CHsBbw3W.js.map +1 -0
  28. package/dist/{FhirServerList-DuTwnngN.js → FhirServerList-iXBPkRVF.js} +11 -11
  29. package/dist/{FhirServerList-DuTwnngN.js.map → FhirServerList-iXBPkRVF.js.map} +1 -1
  30. package/dist/{GrantPermissionModal-BDN66Atn.js → GrantPermissionModal-D7iNZd0M.js} +54 -51
  31. package/dist/GrantPermissionModal-D7iNZd0M.js.map +1 -0
  32. package/dist/{ImmunizationConfigurationBase-Di1KO3oW.js → ImmunizationConfigurationBase-aUtx0JEe.js} +3440 -3060
  33. package/dist/ImmunizationConfigurationBase-aUtx0JEe.js.map +1 -0
  34. package/dist/{InventoryPage-C_AxSy7A-QLvlL4rE.js → InventoryPage-DOotGZrj-CoPjOJEI.js} +10 -10
  35. package/dist/{InventoryPage-C_AxSy7A-QLvlL4rE.js.map → InventoryPage-DOotGZrj-CoPjOJEI.js.map} +1 -1
  36. package/dist/ManageEventConfiguration-DqW3krT6.js +1216 -0
  37. package/dist/ManageEventConfiguration-DqW3krT6.js.map +1 -0
  38. package/dist/ManageEventConfiguration.css +1 -1
  39. package/dist/{ManageUser-DCFkUMV9.js → ManageUser-DZltBina.js} +134 -134
  40. package/dist/{ManageUser-DCFkUMV9.js.map → ManageUser-DZltBina.js.map} +1 -1
  41. package/dist/{MemberProfileCard-BdUNgHRB-VywqQdFF.js → MemberProfileCard-D5CgkTdJ-D2NgDJl3.js} +25 -25
  42. package/dist/{MemberProfileCard-BdUNgHRB-VywqQdFF.js.map → MemberProfileCard-D5CgkTdJ-D2NgDJl3.js.map} +1 -1
  43. package/dist/MobileAnalytics-BLOionG_.js +17301 -0
  44. package/dist/MobileAnalytics-BLOionG_.js.map +1 -0
  45. package/dist/MobileMenuManagement-68Wijb0X.js +220 -0
  46. package/dist/MobileMenuManagement-68Wijb0X.js.map +1 -0
  47. package/dist/MobileTypeEventConfigModal-CMcj7Ozp.js +752 -0
  48. package/dist/MobileTypeEventConfigModal-CMcj7Ozp.js.map +1 -0
  49. package/dist/OtherTypeEventConfigModal-stNmuSv_.js +1812 -0
  50. package/dist/OtherTypeEventConfigModal-stNmuSv_.js.map +1 -0
  51. package/dist/{PaymentCreatePage-CIVe0P0p-25BQVpOX.js → PaymentCreatePage-DfvSZ-kB-CckogYoe.js} +14 -14
  52. package/dist/{PaymentCreatePage-CIVe0P0p-25BQVpOX.js.map → PaymentCreatePage-DfvSZ-kB-CckogYoe.js.map} +1 -1
  53. package/dist/{PaymentsPage-BvPe5Q9F-D2gfziwW.js → PaymentsPage-DMNjYWAJ-ChO9IXmk.js} +24 -24
  54. package/dist/{PaymentsPage-BvPe5Q9F-D2gfziwW.js.map → PaymentsPage-DMNjYWAJ-ChO9IXmk.js.map} +1 -1
  55. package/dist/{PickupBatchLinesEditor-DHmcAG23-DL2p6IKJ.js → PickupBatchLinesEditor-CE2RuyJT-BPceiJr8.js} +2 -2
  56. package/dist/{PickupBatchLinesEditor-DHmcAG23-DL2p6IKJ.js.map → PickupBatchLinesEditor-CE2RuyJT-BPceiJr8.js.map} +1 -1
  57. package/dist/{PickupCreatePage-CB0Sl0Hb-Mmj7zESG.js → PickupCreatePage-B4O_-vE5-DoOo9nJO.js} +64 -64
  58. package/dist/{PickupCreatePage-CB0Sl0Hb-Mmj7zESG.js.map → PickupCreatePage-B4O_-vE5-DoOo9nJO.js.map} +1 -1
  59. package/dist/{PickupsPage-Ctpghavs-CUp4uIZq.js → PickupsPage-D7zyioJB-bHKnARYw.js} +29 -29
  60. package/dist/PickupsPage-D7zyioJB-bHKnARYw.js.map +1 -0
  61. package/dist/{PmGuard-b10TGXEi-G3N0G_Wg.js → PmGuard-BZE-y4In-D_pUm5MP.js} +25 -25
  62. package/dist/{PmGuard-b10TGXEi-G3N0G_Wg.js.map → PmGuard-BZE-y4In-D_pUm5MP.js.map} +1 -1
  63. package/dist/{ProductEditPage-C1thoKHu-URQaZ6st.js → ProductEditPage-BVlVUCtD-BR-tJ5Wb.js} +475 -472
  64. package/dist/ProductEditPage-BVlVUCtD-BR-tJ5Wb.js.map +1 -0
  65. package/dist/{ProductsPage-CupVmOD4-D45a_hf-.js → ProductsPage-DvNHIeZt-BoOOJJtk.js} +36 -35
  66. package/dist/ProductsPage-DvNHIeZt-BoOOJJtk.js.map +1 -0
  67. package/dist/{PurchaseCreatePage-YD3NmhPQ-2j4etSjM.js → PurchaseCreatePage-Cq_i9snz-DRtHHFWw.js} +214 -187
  68. package/dist/PurchaseCreatePage-Cq_i9snz-DRtHHFWw.js.map +1 -0
  69. package/dist/{PurchaseRequestDetailPage-Dg_MRY_N-D1bgTEAn.js → PurchaseRequestDetailPage-CA9KFOfE-CtjG4Gx6.js} +80 -80
  70. package/dist/PurchaseRequestDetailPage-CA9KFOfE-CtjG4Gx6.js.map +1 -0
  71. package/dist/{PurchaseRequestsPage-DPAPzpmm-mDH2IrTl.js → PurchaseRequestsPage-DS9i4o0--TpoxA5Kd.js} +29 -29
  72. package/dist/{PurchaseRequestsPage-DPAPzpmm-mDH2IrTl.js.map → PurchaseRequestsPage-DS9i4o0--TpoxA5Kd.js.map} +1 -1
  73. package/dist/{PurchasesPage-It1GHiXl-eH4IsF_U.js → PurchasesPage-DgL5T6BY-DePUuE9l.js} +31 -31
  74. package/dist/{PurchasesPage-It1GHiXl-eH4IsF_U.js.map → PurchasesPage-DgL5T6BY-DePUuE9l.js.map} +1 -1
  75. package/dist/{SaleCreatePage-C9kFmTvm-B3Y0o4CX.js → SaleCreatePage-CZnIOydv-DKBw-qp7.js} +15 -15
  76. package/dist/{SaleCreatePage-C9kFmTvm-B3Y0o4CX.js.map → SaleCreatePage-CZnIOydv-DKBw-qp7.js.map} +1 -1
  77. package/dist/{SalesPage-D18DCseD-BxktGDRQ.js → SalesPage-DPIRrC_O-M8rqnK7z.js} +62 -62
  78. package/dist/SalesPage-DPIRrC_O-M8rqnK7z.js.map +1 -0
  79. package/dist/SettingsPage-BC_R6Z-Q-CKNt9zRu.js +676 -0
  80. package/dist/SettingsPage-BC_R6Z-Q-CKNt9zRu.js.map +1 -0
  81. package/dist/{ShowFlywayQuery-D1y_4A1u.js → ShowFlywayQuery-DIOUdYfG.js} +26 -19
  82. package/dist/{ShowFlywayQuery-D1y_4A1u.js.map → ShowFlywayQuery-DIOUdYfG.js.map} +1 -1
  83. package/dist/{StorageUnitsPage-7EqwuMOI-BwUso1Th.js → StorageUnitsPage-BDRkdCjW-UF64rf7q.js} +195 -188
  84. package/dist/StorageUnitsPage-BDRkdCjW-UF64rf7q.js.map +1 -0
  85. package/dist/{SubMenu-eEDhZUvh.js → SubMenu-BdMTYtC1.js} +5 -3
  86. package/dist/SubMenu-BdMTYtC1.js.map +1 -0
  87. package/dist/{TransactionsPage-DrH53pVS-BkhIGB6C.js → TransactionsPage-CqWTMNU8-Df6eGFDW.js} +48 -48
  88. package/dist/{TransactionsPage-DrH53pVS-BkhIGB6C.js.map → TransactionsPage-CqWTMNU8-Df6eGFDW.js.map} +1 -1
  89. package/dist/{TransferCreatePage-CuvoMrYH-DTTfHjz-.js → TransferCreatePage-DF7FZaTJ-CL79V3aR.js} +8 -8
  90. package/dist/{TransferCreatePage-CuvoMrYH-DTTfHjz-.js.map → TransferCreatePage-DF7FZaTJ-CL79V3aR.js.map} +1 -1
  91. package/dist/{TransfersPage-Cf701t8s-BBbN7cBf.js → TransfersPage-CGrRFaBF-cTwBUv0o.js} +69 -69
  92. package/dist/TransfersPage-CGrRFaBF-cTwBUv0o.js.map +1 -0
  93. package/dist/TypeConfiguration-JbRCN6GR.js +114 -0
  94. package/dist/TypeConfiguration-JbRCN6GR.js.map +1 -0
  95. package/dist/{UserList-DgPxsnj2.js → UserList-L41Xw0Q6.js} +2 -2
  96. package/dist/{UserList-DgPxsnj2.js.map → UserList-L41Xw0Q6.js.map} +1 -1
  97. package/dist/Users-CsJ08Kjm.js +40 -0
  98. package/dist/{Users-Bpc4Sazd.js.map → Users-CsJ08Kjm.js.map} +1 -1
  99. package/dist/{VialsPage-8oAc1yFv-Cl3FUXBJ.js → VialsPage-rvvXjgZG-Oqo1v6kQ.js} +35 -35
  100. package/dist/{VialsPage-8oAc1yFv-Cl3FUXBJ.js.map → VialsPage-rvvXjgZG-Oqo1v6kQ.js.map} +1 -1
  101. package/dist/{constants-ClZJY2x1-MkSWn6TZ.js → constants-DpXnLsAB-D6lN5cjK.js} +58 -47
  102. package/dist/constants-DpXnLsAB-D6lN5cjK.js.map +1 -0
  103. package/dist/{dashboardLayoutUtils-D1xCAxp3.js → dashboardLayoutUtils-CJivzaU1.js} +95 -92
  104. package/dist/dashboardLayoutUtils-CJivzaU1.js.map +1 -0
  105. package/dist/index.css +1 -1
  106. package/dist/index.js +1 -1
  107. package/dist/index.lib-ETRQOzvE.js +894 -0
  108. package/dist/index.lib-ETRQOzvE.js.map +1 -0
  109. package/dist/listValueStore-BFQtDYIR-Bj0yX145.js +36 -0
  110. package/dist/listValueStore-BFQtDYIR-Bj0yX145.js.map +1 -0
  111. package/package.json +1 -1
  112. package/dist/AccessRights-xrday-L1.js.map +0 -1
  113. package/dist/AddMenuConfiguration-e5BVXhmw.js +0 -8547
  114. package/dist/AddMenuConfiguration-e5BVXhmw.js.map +0 -1
  115. package/dist/CategoriesPage-BsS5IQh3-B03lWRY5.js.map +0 -1
  116. package/dist/ConditionConfig-Ddz9halE.js +0 -395
  117. package/dist/ConditionConfig-Ddz9halE.js.map +0 -1
  118. package/dist/ConditionConfig.css +0 -1
  119. package/dist/EventConfig-BmLemzX3.js +0 -26
  120. package/dist/EventConfigurations-Bzh1qWXU.js +0 -450
  121. package/dist/EventConfigurations-Bzh1qWXU.js.map +0 -1
  122. package/dist/EventsExceptionModal-B2SRrnB1.js +0 -200
  123. package/dist/EventsExceptionModal-B2SRrnB1.js.map +0 -1
  124. package/dist/EventsSkeleton-BIcPks4T.js +0 -61
  125. package/dist/EventsSkeleton-BIcPks4T.js.map +0 -1
  126. package/dist/FeatureMenu-DYJmDt7q.js.map +0 -1
  127. package/dist/GrantPermissionModal-BDN66Atn.js.map +0 -1
  128. package/dist/ImmunizationConfigurationBase-Di1KO3oW.js.map +0 -1
  129. package/dist/ManageEventConfiguration-CoYcpjR9.js +0 -1085
  130. package/dist/ManageEventConfiguration-CoYcpjR9.js.map +0 -1
  131. package/dist/MobileAnalytics-pQoE8cG1.js +0 -16888
  132. package/dist/MobileAnalytics-pQoE8cG1.js.map +0 -1
  133. package/dist/MobileMenuManagement-Cf8IZlla.js +0 -108
  134. package/dist/MobileMenuManagement-Cf8IZlla.js.map +0 -1
  135. package/dist/MobileTypeEventConfigModal-BeveaX0C.js +0 -783
  136. package/dist/MobileTypeEventConfigModal-BeveaX0C.js.map +0 -1
  137. package/dist/OtherTypeEventConfigModal-CM6VkdmY.js +0 -2046
  138. package/dist/OtherTypeEventConfigModal-CM6VkdmY.js.map +0 -1
  139. package/dist/PickupsPage-Ctpghavs-CUp4uIZq.js.map +0 -1
  140. package/dist/ProductEditPage-C1thoKHu-URQaZ6st.js.map +0 -1
  141. package/dist/ProductsPage-CupVmOD4-D45a_hf-.js.map +0 -1
  142. package/dist/PurchaseCreatePage-YD3NmhPQ-2j4etSjM.js.map +0 -1
  143. package/dist/PurchaseRequestDetailPage-Dg_MRY_N-D1bgTEAn.js.map +0 -1
  144. package/dist/SalesPage-D18DCseD-BxktGDRQ.js.map +0 -1
  145. package/dist/SettingsPage-VsxI-ano-DcmtUUEj.js +0 -747
  146. package/dist/SettingsPage-VsxI-ano-DcmtUUEj.js.map +0 -1
  147. package/dist/StorageUnitsPage-7EqwuMOI-BwUso1Th.js.map +0 -1
  148. package/dist/SubMenu-eEDhZUvh.js.map +0 -1
  149. package/dist/TransfersPage-Cf701t8s-BBbN7cBf.js.map +0 -1
  150. package/dist/TypeConfiguration-3O6ABrK-.js +0 -117
  151. package/dist/TypeConfiguration-3O6ABrK-.js.map +0 -1
  152. package/dist/Users-Bpc4Sazd.js +0 -41
  153. package/dist/constants-ClZJY2x1-MkSWn6TZ.js.map +0 -1
  154. package/dist/dashboardLayoutUtils-D1xCAxp3.js.map +0 -1
  155. package/dist/index.lib-Dn8PMkeD.js +0 -862
  156. package/dist/index.lib-Dn8PMkeD.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeatureMenu-CHsBbw3W.js","sources":["../src/views/Features/Skeletons/FeatureSkeletons.jsx","../src/views/Features/FeatureMenu.jsx"],"sourcesContent":["import PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { getUseSkeleton } from \"@/store/reducers/SkeletonReducer\";\n\n/**\n * Skeleton block style shared by every placeholder in this file.\n * Matches the app-wide convention: pulsing neutral block, small radius.\n */\nconst BLOCK = \"bg-gray-300 animate-pulse rounded-sm\";\n\nexport const FeatureMenuSkeleton = ({ children, isLoading }) => {\n const useSkeleton = useSelector(getUseSkeleton);\n if (!useSkeleton) {\n return children ?? null;\n }\n if (!isLoading) return children ?? null;\n return (\n <div className=\"flex flex-col gap-6\" aria-busy=\"true\">\n {/* title + subtitle + actions */}\n <div className=\"flex flex-row flex-wrap justify-between gap-4\">\n <div className=\"flex flex-col gap-2\">\n <div className={`${BLOCK} h-[28px] w-[220px]`}></div>\n <div className={`${BLOCK} h-[16px] w-[340px] max-w-full`}></div>\n </div>\n <div className=\"flex flex-row gap-2 items-start\">\n <div className={`${BLOCK} h-[32px] w-[150px]`}></div>\n <div className={`${BLOCK} h-[32px] w-[120px]`}></div>\n </div>\n </div>\n {/* tab strip */}\n <div className=\"flex flex-row flex-wrap gap-2\">\n <div className={`${BLOCK} h-[36px] w-[85px]`}></div>\n <div className={`${BLOCK} h-[36px] w-[85px]`}></div>\n <div className={`${BLOCK} h-[36px] w-[85px]`}></div>\n <div className={`${BLOCK} h-[36px] w-[85px]`}></div>\n <div className={`${BLOCK} h-[36px] w-[85px]`}></div>\n </div>\n </div>\n );\n};\n\nFeatureMenuSkeleton.propTypes = {\n children: PropTypes.any,\n isLoading: PropTypes.any,\n};\n\nexport const ManageFeatureSkeleton = ({ children, isLoading }) => {\n const useSkeleton = useSelector(getUseSkeleton);\n if (!useSkeleton) {\n return children ?? null;\n }\n if (!isLoading) return children ?? null;\n\n return (\n <div className=\"mt-8 ml-4\">\n <div className=\"bg-gray-300 animate-pulse rounded-sm w-[150px] h-[35px]\"></div>\n <div className=\"flex flex-col gap-4 my-3\">\n <div className=\"flex justify-between w-[870px]\">\n <div className=\"bg-gray-300 animate-pulse rounded-sm w-[130px] h-[40px]\"></div>\n <div className=\"bg-gray-300 animate-pulse rounded-sm w-[520px] h-[40px]\"></div>\n </div>\n <div className=\"flex justify-between w-[870px]\">\n <div className=\"bg-gray-300 animate-pulse rounded-sm w-[130px] h-[40px]\"></div>\n <div className=\"bg-gray-300 animate-pulse rounded-sm w-[520px] h-[40px]\"></div>\n </div>\n <div className=\"flex justify-between w-[870px]\">\n <div className=\"bg-gray-300 animate-pulse rounded-sm w-[200px] h-[40px]\"></div>\n <div className=\"bg-gray-300 animate-pulse rounded-sm w-[30px] h-[40px]\"></div>\n </div>\n <div className=\"flex justify-between w-[870px]\">\n <div className=\"bg-gray-300 animate-pulse rounded-sm w-[130px] h-[40px]\"></div>\n <div className=\"bg-gray-300 animate-pulse rounded-sm w-[520px] h-[40px] ml-8\"></div>\n </div>\n </div>\n <div className=\"flex justify-end gap-5 m-7\">\n <div className=\"bg-gray-300 animate-pulse rounded-sm w-[64px] h-[40px]\"></div>\n <div className=\"bg-gray-300 animate-pulse rounded-sm w-[64px] h-[40px]\"></div>\n </div>\n </div>\n );\n};\n\nManageFeatureSkeleton.propTypes = {\n children: PropTypes.any,\n isLoading: PropTypes.any,\n};\n\n/**\n * Master pane placeholder — header bar, search box, then a run of list rows,\n * sized to approximate the real sub-menu list so the swap doesn't jump.\n */\nexport const SubMenuSkeleton = ({ children, isLoading }) => {\n const useSkeleton = useSelector(getUseSkeleton);\n if (!useSkeleton) {\n return children ?? null;\n }\n if (!isLoading) return children ?? null;\n\n return (\n <div className=\"w-full flex flex-col gap-2 p-3\" aria-busy=\"true\">\n <div className={`${BLOCK} h-[20px] w-[140px]`}></div>\n <div className={`${BLOCK} h-[38px] w-full`}></div>\n <div className=\"flex flex-col gap-1.5 pt-1\">\n {Array.from({ length: 7 }).map((_, index) => (\n <div key={index} className={`${BLOCK} h-[36px] w-full`}></div>\n ))}\n </div>\n </div>\n );\n};\n\nSubMenuSkeleton.propTypes = {\n children: PropTypes.any,\n isLoading: PropTypes.any,\n};\n\n/**\n * Detail pane placeholder — toolbar row, then a stack of collapsed\n * role/user rows matching the accordion list underneath.\n */\nexport const AccessRightsSkeleton = ({ children, isLoading }) => {\n const useSkeleton = useSelector(getUseSkeleton);\n if (!useSkeleton) {\n return children ?? null;\n }\n if (!isLoading) return children ?? null;\n\n return (\n <div className=\"w-full flex flex-col gap-3 p-3\" aria-busy=\"true\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center\">\n <div className={`${BLOCK} h-[38px] w-full sm:w-[220px]`}></div>\n <div className={`${BLOCK} h-[38px] w-full sm:flex-1`}></div>\n <div className={`${BLOCK} h-[38px] w-full sm:w-[90px]`}></div>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className={`${BLOCK} h-[52px] w-full`}></div>\n ))}\n </div>\n </div>\n );\n};\n\nAccessRightsSkeleton.propTypes = {\n children: PropTypes.any,\n isLoading: PropTypes.any,\n};\n","import React, {\n lazy,\n Suspense,\n useEffect,\n useMemo,\n useRef,\n useState,\n startTransition,\n useCallback,\n} from \"react\";\nimport { useTranslateProvider } from \"@/common/languageTranslator/TranslationContext\";\nimport { getFeatureName } from \"../../services/Features\";\nimport { showToast } from \"@/common/toaster/toaster\";\nimport useTrackEvent from \"@/hooks/useTrackEvent\";\nconst AccessRights = lazy(() => import(\"./AccessRights\"));\nconst SubMenu = lazy(() => import(\"./SubMenu\"));\nimport { Box, Button, Paper, Typography } from \"@mui/material\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useNavigate, useSearchParams } from \"react-router-dom\";\nimport FontAwesomeIcons from \"@/common/fontAwesomeIcons/FontAwesomeIcons\";\nimport SegmentedTabs from \"@/views/custom-components/SegmentedTabs\";\nimport { featureModuleIcon } from \"@/common/constants/FeatureModuleIcons\";\nimport {\n AccessRightsSkeleton,\n FeatureMenuSkeleton,\n SubMenuSkeleton,\n} from \"./Skeletons/FeatureSkeletons\";\nimport {\n setSubMenuId,\n setSubMenuGroupName,\n setSubMenuFeatureVal,\n} from \"@/store/reducers/FeatureReducer\";\nimport { getAssignedFeatures } from \"@/utils/feature\";\nimport GeneralUtil from \"@/common/services/util/GeneralUtil\";\nimport useCaching from \"@/hooks/useCaching\";\n\n/**\n * Turns a raw feature-module key into a human label. Short keys are domain\n * acronyms (`fhs`, `ncd`, `mch`) and stay upper-cased; longer keys are\n * title-cased. Tab labels are never shouted — see the MEDplat tab rules.\n * @param {string} key - The feature module key from `user.features`.\n * @returns {string} The label to render on the tab.\n */\nconst formatModuleLabel = (key) => {\n if (!key) return \"\";\n if (key.length <= 4 && !/[\\s_-]/.test(key)) return key.toUpperCase();\n return key\n .split(/[\\s_-]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n};\n\n/**\n * The `FeatureMenu` component renders a menu or list of features in the application.\n * @module FeatureMenu\n * @returns {JSX.Element} The rendered `FeatureMenu` component.\n */\n\nexport default function FeatureMenu() {\n const dispatch = useDispatch();\n const { getCachedData } = useCaching();\n const [Data, setData] = useState([]);\n const [searchParams, setSearchParams] = useSearchParams();\n const subMenuId = useSelector((state) => {\n return state?.FeatureReducer?.subMenuId;\n });\n const subMenuGroupName = useSelector(\n (state) => state?.FeatureReducer?.subMenuGroupName,\n );\n const subMenuFeatureVal = useSelector(\n (state) => state?.FeatureReducer?.subMenuFeatureVal,\n );\n // Read inside the module-load effect without making the selection a\n // dependency of it — that would refetch the whole list every time the user\n // picks a different sub menu.\n const subMenuIdRef = useRef(subMenuId);\n subMenuIdRef.current = subMenuId;\n\n /**\n * Clears the selected menu config so the detail pane shows its empty state\n * instead of a config belonging to a module that is no longer active.\n * @returns {void}\n */\n const clearSelection = useCallback(() => {\n dispatch(setSubMenuId(null));\n dispatch(setSubMenuGroupName(null));\n dispatch(setSubMenuFeatureVal(null));\n }, [dispatch]);\n\n const navigate = useNavigate();\n const { user } = useSelector((state) => state.Authenticate);\n const { translate } = useTranslateProvider();\n const [isLoading, setIsLoading] = useState(false);\n const trackEvent = useTrackEvent();\n const [isNewAPI, setIsNewAPI] = useState({});\n const [rights, setRights] = useState(null);\n const features = user?.features || {};\n const featureNames = useMemo(\n () => Object.keys(features).filter((key) => key !== \"mch\"),\n [features],\n );\n\n // The active module lives in the URL (`?module=fhs`) so a refresh, a browser\n // back, or a shared link lands on the same tab instead of resetting to the first.\n const moduleParam = searchParams.get(\"module\");\n const selectedId = useMemo(() => {\n const index = featureNames.indexOf(moduleParam);\n return index >= 0 ? index : 0;\n }, [featureNames, moduleParam]);\n const selectedModule = featureNames[selectedId];\n\n // The menu config currently open in the detail pane, so the pane header can\n // name exactly which one's rights are being edited.\n const selectedSubMenu = useMemo(\n () => Data?.find((item) => item?.id === subMenuId) || null,\n [Data, subMenuId],\n );\n\n // Module › group › sub group › menu name. Non-navigational — this is a\n // context label identifying the record, not a breadcrumb trail to click.\n const menuConfigTrail = useMemo(\n () =>\n selectedSubMenu\n ? [\n formatModuleLabel(selectedModule),\n selectedSubMenu.groupName,\n selectedSubMenu.subGroupName,\n selectedSubMenu.name,\n ].filter(Boolean)\n : [],\n [selectedSubMenu, selectedModule],\n );\n\n const moduleTabs = useMemo(\n () =>\n featureNames.map((feat, index) => ({\n value: feat,\n label: formatModuleLabel(feat),\n icon: featureModuleIcon(feat),\n id: `feature-tab-${index}`,\n dataTestId: `featuremenu-button-${index}`,\n })),\n [featureNames],\n );\n\n // 🧠 handle tab switch\n const handleTabChange = useCallback(\n (event, nextModule) => {\n if (!nextModule) return;\n setSearchParams(\n (prev) => {\n const next = new URLSearchParams(prev);\n next.set(\"module\", nextModule);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n /**\n * Navigates to the '/ui/addfeature' route when called.\n * @function handleClick\n * @returns {void} This function does not return a value.\n */\n\n const handleFeature = useCallback(() => {\n trackEvent(\"button_click\", {\n button_name: \"featuremenu-add-button\",\n button_type: \"navigate\",\n button_id: \"featuremenu-add-button\",\n });\n navigate(\"addDynamicFeature\");\n }, [navigate, trackEvent]);\n\n // 📦 fetch feature data\n /**\n * Effect hook that runs when `selectedId` changes to load and set initial feature data.\n * @effect\n * @returns {void} This effect does not return a value.\n */\n useEffect(() => {\n async function getFeatures() {\n // The user's rights for this screen don't change mid-session; without a\n // cache this fires on every visit to Features.\n const data = await getCachedData({\n cacheKey: [\"assignedFeatures\", \"techo.manage.menu\"],\n fetchFn: async () =>\n (await getAssignedFeatures(\"techo.manage.menu\")).data,\n staleTime: 5 * 60 * 1000,\n cacheTime: 30 * 60 * 1000,\n });\n const parsedRights = JSON.parse(data);\n setRights(parsedRights);\n }\n getFeatures();\n }, []);\n\n useEffect(() => {\n const loadInitialData = async () => {\n if (!featureNames.length || selectedId >= featureNames.length) return;\n\n try {\n setIsLoading(true);\n const { data } = await getFeatureName(featureNames[selectedId]);\n const filterData = data.sort((a, b) => a.name?.localeCompare(b.name));\n startTransition(() => {\n setData(filterData);\n // The selected menu config lives in Redux, so it outlives a module\n // switch. Without this the detail pane keeps rendering the previous\n // module's access rights even though that config isn't in the list\n // any more. Drop the selection whenever it doesn't belong to the\n // module that just loaded — the pane then falls back to its\n // \"No sub menu selected\" state.\n if (\n subMenuIdRef.current &&\n !filterData.some((item) => item?.id === subMenuIdRef.current)\n ) {\n clearSelection();\n }\n setIsLoading(false);\n });\n } catch (error) {\n showToast({\n message: `Error : ${error?.response?.data?.message}`,\n type: \"error\",\n });\n // The module did change, so keeping the previous module's list and\n // selection on screen would misrepresent which module is active.\n startTransition(() => {\n setData([]);\n clearSelection();\n setIsLoading(false);\n });\n }\n };\n\n loadInitialData();\n }, [selectedId, featureNames, clearSelection]);\n\n // 🧠 Memoized SubMenu\n const SubMenuContent = useMemo(\n () => (\n <Suspense fallback={<SubMenuSkeleton isLoading />}>\n <SubMenu\n data-testid=\"featuremenu-submenu\"\n data={Data}\n subMenuId={subMenuId}\n setSubMenuId={(id) => {\n dispatch(setSubMenuId(id));\n }}\n setSubMenuGroupName={(name) => {\n dispatch(setSubMenuGroupName(name));\n }}\n setSubMenuFeatureVal={(val) => {\n dispatch(setSubMenuFeatureVal(val));\n }}\n type={featureNames[selectedId]}\n isLoading={isLoading}\n isNewAPI={isNewAPI}\n subMenuGroupName={subMenuGroupName}\n rights={rights}\n />\n </Suspense>\n ),\n [Data, subMenuId, selectedId, isLoading, featureNames, isNewAPI, rights],\n );\n\n // 🧠 Memoized AccessRights\n const AccessRightsContent = useMemo(\n () => (\n <Suspense fallback={<AccessRightsSkeleton isLoading />}>\n <AccessRights\n data-testid=\"featuremenu-access-rights\"\n subMenuId={subMenuId}\n subMenuGroupName={subMenuGroupName}\n subMenuFeatureVal={subMenuFeatureVal}\n selectedTab={featureNames[selectedId]}\n parentLoading={isLoading}\n onNewAPIChange={setIsNewAPI}\n rights={rights}\n />\n </Suspense>\n ),\n // `selectedTab`, `subMenuGroupName` and `subMenuFeatureVal` were read but\n // not declared, so this could hand AccessRights a menu config from one\n // module labelled with another module's tab.\n [\n subMenuId,\n subMenuGroupName,\n subMenuFeatureVal,\n featureNames,\n selectedId,\n isLoading,\n rights,\n ],\n );\n\n const canManageGroups = GeneralUtil.hasCheckRights(\n rights?.[\"update.manage.featurelist\"],\n undefined,\n true,\n );\n const canCreateFeature = GeneralUtil.hasCheckRights(\n rights?.[\"create.manage.featurelist\"],\n undefined,\n true,\n );\n\n return !isLoading &&\n rights !== null &&\n !GeneralUtil.hasCheckRights(rights?.[\"view.manage.featurelist\"], undefined, true) ? (\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n width: \"100%\",\n minHeight: \"70vh\",\n }}\n >\n <Paper\n elevation={0}\n sx={{\n p: { xs: 3, md: 5 },\n maxWidth: 520,\n textAlign: \"center\",\n border: \"1px solid\",\n borderColor: \"divider\",\n borderRadius: (t) => `${t.shape.cardRadius}px`,\n backgroundColor: \"background.paper\",\n }}\n >\n <Box sx={{ color: \"text.disabled\", mb: 2 }}>\n <FontAwesomeIcons iconName=\"faLock\" size=\"2x\" />\n </Box>\n <Typography\n variant=\"h6\"\n component=\"h1\"\n sx={{ fontWeight: 700, mb: 1, color: \"text.primary\" }}\n >\n {translate(\"You don't have permission to view features\")}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {translate(\n \"Ask an administrator to grant you access to the feature list.\",\n )}\n </Typography>\n </Paper>\n </Box>\n ) : (\n <Paper\n elevation={0}\n sx={{\n p: { xs: 2.5, md: 3 },\n mt: 2,\n mb: 3,\n border: \"1px solid\",\n borderColor: \"divider\",\n borderRadius: (t) => `${t.shape.cardRadius}px`,\n backgroundColor: \"background.paper\",\n }}\n >\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 3 }}>\n <FeatureMenuSkeleton isLoading={isLoading}>\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2.5 }}>\n {/* ── Header: title block (left) + actions (right) ── */}\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n flexWrap: \"wrap\",\n gap: 2,\n }}\n >\n <Box sx={{ minWidth: { xs: \"100%\", lg: \"40%\" } }}>\n <Typography\n variant=\"h5\"\n component=\"h1\"\n sx={{ fontWeight: 800, color: \"text.primary\", mb: 0.5 }}\n >\n {translate(\"Feature Access\")}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {selectedModule\n ? `${translate(\"Manage access for the\")} ${formatModuleLabel(selectedModule)} ${translate(\"module. Choose a sub menu, then grant or revoke its rights for roles and users.\")}`\n : translate(\n \"Pick a module, choose one of its sub menus, then grant or revoke that sub menu's rights for roles and users.\",\n )}\n </Typography>\n </Box>\n\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1.5,\n flexWrap: \"wrap\",\n }}\n >\n {canManageGroups && (\n <Button\n size=\"small\"\n variant=\"outlined\"\n onClick={() => navigate(\"/ui/medplat/report/all/groups\")}\n startIcon={<FontAwesomeIcons iconName=\"faLayerGroup\" />}\n >\n {translate(\"Manage\")} {translate(\"Menu\")}{\" \"}\n {translate(\"Group\")}\n </Button>\n )}\n {canCreateFeature && (\n <Button\n size=\"small\"\n data-testid=\"featuremenu-add-button\"\n variant=\"contained\"\n onClick={handleFeature}\n startIcon={<FontAwesomeIcons iconName=\"faPlus\" />}\n >\n {translate(\"Add\")} {translate(\"Feature\")}\n </Button>\n )}\n </Box>\n </Box>\n\n {/* ── Module tabs ── */}\n <SegmentedTabs\n tabs={moduleTabs}\n value={selectedModule}\n onChange={handleTabChange}\n ariaLabel={translate(\"Feature modules\")}\n panelId=\"feature-tabpanel\"\n dataTestId=\"featuremenu-tabs\"\n // Module names are short and there are only a handful of them,\n // so every tab can carry its label. Hover-to-reveal made the\n // unselected modules a row of unlabelled icons.\n collapseLabels={false}\n // With labels always on, the rail is wide enough to run past the\n // pane on smaller screens. Wrapping to a second row reads better\n // than a horizontal scrollbar for a control this short.\n sx={{ flexWrap: \"wrap\" }}\n />\n </Box>\n </FeatureMenuSkeleton>\n\n {/* ── Master (sub menu list) + detail (access rights) ── */}\n <Box\n role=\"tabpanel\"\n id=\"feature-tabpanel\"\n aria-labelledby={`feature-tab-${selectedId}`}\n sx={{\n display: \"flex\",\n flexDirection: { xs: \"column\", md: \"row\" },\n alignItems: \"stretch\",\n border: \"1px solid\",\n borderColor: \"divider\",\n borderRadius: (t) => `${t.shape.borderRadius}px`,\n overflow: \"hidden\",\n minHeight: 420,\n }}\n >\n <Box\n sx={{\n width: { xs: \"100%\", md: 280, lg: 320 },\n flexShrink: 0,\n borderBottom: { xs: \"1px solid\", md: \"none\" },\n borderRight: { xs: \"none\", md: \"1px solid\" },\n borderColor: \"divider\",\n display: \"flex\",\n }}\n >\n {SubMenuContent}\n </Box>\n\n <Box\n sx={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 0.25,\n px: 2,\n py: 1.5,\n borderBottom: \"1px solid\",\n borderColor: \"divider\",\n }}\n >\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <Box sx={{ color: \"text.secondary\", display: \"flex\" }}>\n <FontAwesomeIcons iconName=\"faGear\" />\n </Box>\n <Typography variant=\"body2\" sx={{ fontWeight: 700 }}>\n {translate(\"Access Rights\")}\n </Typography>\n </Box>\n\n {menuConfigTrail.length > 0 && (\n <Box\n data-testid=\"featuremenu-selected-menu-config\"\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: 0.75,\n pl: 3,\n minWidth: 0,\n }}\n >\n {menuConfigTrail.map((part, index) => {\n const isLast = index === menuConfigTrail.length - 1;\n return (\n <React.Fragment key={`${part}-${index}`}>\n {index > 0 && (\n <Box\n component=\"span\"\n aria-hidden=\"true\"\n sx={{ color: \"text.disabled\", fontSize: \"0.75rem\" }}\n >\n ›\n </Box>\n )}\n <Typography\n variant=\"caption\"\n sx={{\n color: isLast ? \"text.primary\" : \"text.secondary\",\n fontWeight: isLast ? 700 : 400,\n // Feature names have no spaces to break on, so\n // without this a long one overflows the trail.\n overflowWrap: \"anywhere\",\n }}\n >\n {part}\n </Typography>\n </React.Fragment>\n );\n })}\n {selectedSubMenu?.navigationState && (\n <Typography\n variant=\"caption\"\n sx={{\n ml: 0.5,\n px: 0.75,\n borderRadius: (t) => `${t.shape.chipRadius}px`,\n backgroundColor: \"action.hover\",\n color: \"text.secondary\",\n fontFamily: \"monospace\",\n overflowWrap: \"anywhere\",\n }}\n >\n {selectedSubMenu.navigationState}\n </Typography>\n )}\n </Box>\n )}\n </Box>\n\n {subMenuId ? (\n AccessRightsContent\n ) : (\n <Box\n data-testid=\"featuremenu-no-feature-selected\"\n sx={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n textAlign: \"center\",\n gap: 1,\n p: 4,\n }}\n >\n <Box sx={{ color: \"text.disabled\" }}>\n <FontAwesomeIcons iconName=\"faListCheck\" size=\"2x\" />\n </Box>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 700 }}>\n {translate(\"No sub menu selected\")}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {translate(\n \"Select a sub menu from the list to view and manage its access rights.\",\n )}\n </Typography>\n </Box>\n )}\n </Box>\n </Box>\n </Box>\n </Paper>\n );\n}\n"],"names":["BLOCK","FeatureMenuSkeleton","children","isLoading","useSelector","getUseSkeleton","jsxs","jsx","PropTypes","SubMenuSkeleton","_","index","AccessRightsSkeleton","AccessRights","lazy","SubMenu","formatModuleLabel","key","word","FeatureMenu","dispatch","useDispatch","getCachedData","useCaching","Data","setData","useState","searchParams","setSearchParams","useSearchParams","subMenuId","state","_a","subMenuGroupName","subMenuFeatureVal","subMenuIdRef","useRef","clearSelection","useCallback","setSubMenuId","setSubMenuGroupName","setSubMenuFeatureVal","navigate","useNavigate","user","translate","useTranslateProvider","setIsLoading","trackEvent","useTrackEvent","isNewAPI","setIsNewAPI","rights","setRights","features","featureNames","useMemo","moduleParam","selectedId","selectedModule","selectedSubMenu","item","menuConfigTrail","moduleTabs","feat","featureModuleIcon","handleTabChange","event","nextModule","prev","next","handleFeature","useEffect","getFeatures","data","getAssignedFeatures","parsedRights","getFeatureName","filterData","a","b","startTransition","error","showToast","_b","SubMenuContent","Suspense","id","name","val","AccessRightsContent","canManageGroups","GeneralUtil","canCreateFeature","Box","Paper","t","FontAwesomeIcons","Typography","Button","SegmentedTabs","part","isLast","React"],"mappings":"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"}
@@ -5,14 +5,14 @@ import { Box as u, Stack as c, Button as o, Grid as m, Skeleton as F, Card as S,
5
5
  import b from "@mui/icons-material/AddRounded";
6
6
  import H from "@mui/icons-material/RefreshRounded";
7
7
  import T from "@mui/icons-material/SyncRounded";
8
- import N from "@mui/icons-material/InboxRounded";
9
- import D from "@mui/icons-material/OpenInNewRounded";
8
+ import D from "@mui/icons-material/InboxRounded";
9
+ import N from "@mui/icons-material/OpenInNewRounded";
10
10
  import v from "@mui/icons-material/DnsRounded";
11
11
  import L from "@mui/icons-material/LockRounded";
12
- import O from "@mui/icons-material/LockOpenRounded";
13
- import W from "moment";
12
+ import W from "@mui/icons-material/LockOpenRounded";
13
+ import $ from "moment";
14
14
  import { showToast as E } from "@/common/toaster/toaster";
15
- import { u as $, r as j, F as G, a as P, S as V, M as B } from "./permissions-DEWACxJN.js";
15
+ import { u as O, r as j, F as G, a as P, S as V, M as B } from "./permissions-DEWACxJN.js";
16
16
  import { S as M } from "./SyncDialog-BRGpHOE4.js";
17
17
  function U({ server: n, onOpen: a, onSync: d, onStaging: f, canManage: g }) {
18
18
  var r;
@@ -28,7 +28,7 @@ function U({ server: n, onOpen: a, onSync: d, onStaging: f, canManage: g }) {
28
28
  p,
29
29
  {
30
30
  size: "small",
31
- icon: s ? /* @__PURE__ */ e(L, {}) : /* @__PURE__ */ e(O, {}),
31
+ icon: s ? /* @__PURE__ */ e(L, {}) : /* @__PURE__ */ e(W, {}),
32
32
  label: s ? n.authType : "Public",
33
33
  variant: "outlined",
34
34
  sx: { height: 20, mt: 0.5 }
@@ -47,18 +47,18 @@ function U({ server: n, onOpen: a, onSync: d, onStaging: f, canManage: g }) {
47
47
  ] }) : /* @__PURE__ */ e(l, { variant: "caption", color: "text.disabled", children: "Capability not discovered" }),
48
48
  n.capabilitySyncedAt && /* @__PURE__ */ i(l, { variant: "caption", color: "text.secondary", display: "block", sx: { mt: 1 }, children: [
49
49
  "synced ",
50
- W(n.capabilitySyncedAt).fromNow()
50
+ $(n.capabilitySyncedAt).fromNow()
51
51
  ] })
52
52
  ] }),
53
53
  /* @__PURE__ */ i(z, { sx: { px: 2, pb: 2, pt: 0, gap: 1, flexWrap: "wrap" }, children: [
54
- /* @__PURE__ */ e(o, { size: "small", variant: "contained", startIcon: /* @__PURE__ */ e(D, {}), onClick: a, children: "Open" }),
54
+ /* @__PURE__ */ e(o, { size: "small", variant: "contained", startIcon: /* @__PURE__ */ e(N, {}), onClick: a, children: "Open" }),
55
55
  g && /* @__PURE__ */ e(o, { size: "small", variant: "outlined", startIcon: /* @__PURE__ */ e(T, {}), onClick: d, children: "Sync" }),
56
- /* @__PURE__ */ e(o, { size: "small", variant: "outlined", startIcon: /* @__PURE__ */ e(N, {}), onClick: f, children: "Staging" })
56
+ /* @__PURE__ */ e(o, { size: "small", variant: "outlined", startIcon: /* @__PURE__ */ e(D, {}), onClick: f, children: "Staging" })
57
57
  ] })
58
58
  ] });
59
59
  }
60
60
  function ce() {
61
- const n = w(), { canManage: a } = $(), [d, f] = y([]), [g, s] = y(!1), [r, x] = y(null), h = C(async () => {
61
+ const n = w(), { canManage: a } = O(), [d, f] = y([]), [g, s] = y(!1), [r, x] = y(null), h = C(async () => {
62
62
  s(!0);
63
63
  try {
64
64
  const t = await j();
@@ -113,4 +113,4 @@ function ce() {
113
113
  export {
114
114
  ce as default
115
115
  };
116
- //# sourceMappingURL=FhirServerList-DuTwnngN.js.map
116
+ //# sourceMappingURL=FhirServerList-iXBPkRVF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FhirServerList-DuTwnngN.js","sources":["../src/views/FhirResource/FhirServerList.jsx"],"sourcesContent":["import { useEffect, useState, useCallback } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport {\n Box, Button, Stack, Typography, Skeleton, Chip, Grid,\n Card, CardContent, CardActions, Divider,\n} from \"@mui/material\";\nimport AddRoundedIcon from \"@mui/icons-material/AddRounded\";\nimport RefreshRoundedIcon from \"@mui/icons-material/RefreshRounded\";\nimport SyncRoundedIcon from \"@mui/icons-material/SyncRounded\";\nimport InboxRoundedIcon from \"@mui/icons-material/InboxRounded\";\nimport OpenInNewRoundedIcon from \"@mui/icons-material/OpenInNewRounded\";\nimport DnsRoundedIcon from \"@mui/icons-material/DnsRounded\";\nimport LockRoundedIcon from \"@mui/icons-material/LockRounded\";\nimport LockOpenRoundedIcon from \"@mui/icons-material/LockOpenRounded\";\nimport moment from \"moment\";\nimport { showToast } from \"@/common/toaster/toaster\";\nimport { retrieveAllServers } from \"../../services/FhirResource\";\nimport { FhirPageHeader, StatusChip, MonoText } from \"./components/FhirUi\";\nimport { FhirGuard, useFhirPermissions } from \"./components/permissions\";\nimport SyncDialog from \"./SyncDialog\";\n\nfunction ServerCard({ server, onOpen, onSync, onStaging, canManage }) {\n const secured = server.authType && server.authType !== \"NONE\";\n return (\n <Card variant=\"outlined\" sx={{ height: \"100%\", borderRadius: 2, display: \"flex\", flexDirection: \"column\" }}>\n <CardContent sx={{ flexGrow: 1 }}>\n <Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"flex-start\">\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Box sx={{ width: 36, height: 36, borderRadius: 1.5, bgcolor: \"primary.main\", color: \"#fff\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\n <DnsRoundedIcon fontSize=\"small\" />\n </Box>\n <Box>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 800, lineHeight: 1.1 }}>{server.name}</Typography>\n <Chip\n size=\"small\"\n icon={secured ? <LockRoundedIcon /> : <LockOpenRoundedIcon />}\n label={secured ? server.authType : \"Public\"}\n variant=\"outlined\"\n sx={{ height: 20, mt: 0.5 }}\n />\n </Box>\n </Stack>\n <StatusChip value={server.isActive ? \"ACTIVE\" : \"INACTIVE\"} />\n </Stack>\n\n <Box sx={{ mt: 1.5 }}><MonoText muted>{server.baseUrl}</MonoText></Box>\n\n <Divider sx={{ my: 1.5 }} />\n\n {server.capabilitySyncedAt ? (\n <Stack direction=\"row\" spacing={0.75} flexWrap=\"wrap\" useFlexGap>\n {server.fhirVersion ? <Chip size=\"small\" label={`FHIR ${server.fhirVersion}`} sx={{ height: 22 }} /> : null}\n <Chip size=\"small\" label={`${server.supportedResources?.length ?? 0} resources`} sx={{ height: 22 }} />\n {server.supportsExpand ? <Chip size=\"small\" color=\"success\" label=\"$expand\" sx={{ height: 22 }} /> : null}\n </Stack>\n ) : (\n <Typography variant=\"caption\" color=\"text.disabled\">Capability not discovered</Typography>\n )}\n {server.capabilitySyncedAt && (\n <Typography variant=\"caption\" color=\"text.secondary\" display=\"block\" sx={{ mt: 1 }}>\n synced {moment(server.capabilitySyncedAt).fromNow()}\n </Typography>\n )}\n </CardContent>\n <CardActions sx={{ px: 2, pb: 2, pt: 0, gap: 1, flexWrap: \"wrap\" }}>\n <Button size=\"small\" variant=\"contained\" startIcon={<OpenInNewRoundedIcon />} onClick={onOpen}>Open</Button>\n {canManage && (\n <Button size=\"small\" variant=\"outlined\" startIcon={<SyncRoundedIcon />} onClick={onSync}>Sync</Button>\n )}\n <Button size=\"small\" variant=\"outlined\" startIcon={<InboxRoundedIcon />} onClick={onStaging}>Staging</Button>\n </CardActions>\n </Card>\n );\n}\n\nfunction FhirServerList() {\n const navigate = useNavigate();\n const { canManage } = useFhirPermissions();\n const [servers, setServers] = useState([]);\n const [loading, setLoading] = useState(false);\n const [syncServer, setSyncServer] = useState(null);\n\n const load = useCallback(async () => {\n setLoading(true);\n try {\n const res = await retrieveAllServers();\n setServers(res?.data ?? []);\n } catch {\n showToast({ type: \"error\", message: \"Failed to load FHIR servers.\" });\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => { load(); }, [load]);\n\n return (\n <FhirGuard>\n <Box sx={{ p: { xs: 2, md: 3 } }}>\n <FhirPageHeader\n title=\"FHIR Sync\"\n subtitle=\"Connect any FHIR-compliant server by its base URL, discover what it supports, then sync resources into the staging inbox and process them into the system.\"\n chips={[\"Sync\", \"Raw Storage\", \"Processing\"]}\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" startIcon={<RefreshRoundedIcon />} onClick={load}>Refresh</Button>\n {canManage && (\n <Button variant=\"contained\" startIcon={<AddRoundedIcon />} onClick={() => navigate(\"/ui/medplat/admin/fhirResource/new\")}>\n Connect Server\n </Button>\n )}\n </Stack>\n }\n />\n\n {loading ? (\n <Grid container spacing={2}>\n {Array.from({ length: 3 }).map((_, i) => (\n <Grid item xs={12} sm={6} md={4} key={i}><Skeleton variant=\"rounded\" height={220} /></Grid>\n ))}\n </Grid>\n ) : servers.length === 0 ? (\n <Card variant=\"outlined\" sx={{ borderRadius: 2, p: 5, textAlign: \"center\" }}>\n <Stack alignItems=\"center\" spacing={1.5}>\n <DnsRoundedIcon sx={{ fontSize: 48, color: \"text.disabled\" }} />\n <Typography variant=\"h6\" sx={{ fontWeight: 700 }}>No FHIR servers yet</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ maxWidth: 420 }}>\n Connect a FHIR server by its base URL. We’ll guide you through discovering its capabilities and syncing resources.\n </Typography>\n {canManage && (\n <Button variant=\"contained\" startIcon={<AddRoundedIcon />} onClick={() => navigate(\"/ui/medplat/admin/fhirResource/new\")}>\n Connect your first server\n </Button>\n )}\n </Stack>\n </Card>\n ) : (\n <Grid container spacing={2}>\n {servers.map((s) => (\n <Grid item xs={12} sm={6} md={4} key={s.id}>\n <ServerCard\n server={s}\n canManage={canManage}\n onOpen={() => navigate(`/ui/medplat/admin/fhirResource/${s.id}`)}\n onSync={() => setSyncServer(s)}\n onStaging={() => navigate(`/ui/medplat/admin/fhirResource/${s.id}/staging`)}\n />\n </Grid>\n ))}\n </Grid>\n )}\n\n {syncServer && (\n <SyncDialog\n open={Boolean(syncServer)}\n server={syncServer}\n onClose={() => setSyncServer(null)}\n onDone={load}\n />\n )}\n </Box>\n </FhirGuard>\n );\n}\n\nexport default FhirServerList;\n"],"names":["ServerCard","server","onOpen","onSync","onStaging","canManage","secured","jsxs","Card","CardContent","Stack","jsx","Box","DnsRoundedIcon","Typography","Chip","LockRoundedIcon","LockOpenRoundedIcon","StatusChip","MonoText","Divider","_a","moment","CardActions","Button","OpenInNewRoundedIcon","SyncRoundedIcon","InboxRoundedIcon","FhirServerList","navigate","useNavigate","useFhirPermissions","servers","setServers","useState","loading","setLoading","syncServer","setSyncServer","load","useCallback","res","retrieveAllServers","showToast","useEffect","FhirGuard","FhirPageHeader","RefreshRoundedIcon","AddRoundedIcon","Grid","_","i","Skeleton","s","SyncDialog"],"mappings":";;;;;;;;;;;;;;;;AAqBA,SAASA,EAAW,EAAE,QAAAC,GAAQ,QAAAC,GAAQ,QAAAC,GAAQ,WAAAC,GAAW,WAAAC,KAAa;;AACpE,QAAMC,IAAUL,EAAO,YAAYA,EAAO,aAAa;AACvD,SACE,gBAAAM,EAACC,GAAA,EAAK,SAAQ,YAAW,IAAI,EAAE,QAAQ,QAAQ,cAAc,GAAG,SAAS,QAAQ,eAAe,YAC9F,UAAA;AAAA,IAAA,gBAAAD,EAACE,GAAA,EAAY,IAAI,EAAE,UAAU,KAC3B,UAAA;AAAA,MAAA,gBAAAF,EAACG,KAAM,WAAU,OAAM,gBAAe,iBAAgB,YAAW,cAC/D,UAAA;AAAA,QAAA,gBAAAH,EAACG,KAAM,WAAU,OAAM,SAAS,GAAG,YAAW,UAC5C,UAAA;AAAA,UAAA,gBAAAC,EAACC,GAAA,EAAI,IAAI,EAAE,OAAO,IAAI,QAAQ,IAAI,cAAc,KAAK,SAAS,gBAAgB,OAAO,QAAQ,SAAS,QAAQ,YAAY,UAAU,gBAAgB,SAAA,GAClJ,UAAA,gBAAAD,EAACE,GAAA,EAAe,UAAS,QAAA,CAAQ,EAAA,CACnC;AAAA,4BACCD,GAAA,EACC,UAAA;AAAA,YAAA,gBAAAD,EAACG,GAAA,EAAW,SAAQ,aAAY,IAAI,EAAE,YAAY,KAAK,YAAY,IAAA,GAAQ,UAAAb,EAAO,KAAA,CAAK;AAAA,YACvF,gBAAAU;AAAA,cAACI;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,MAAMT,IAAU,gBAAAK,EAACK,GAAA,CAAA,CAAgB,sBAAMC,GAAA,EAAoB;AAAA,gBAC3D,OAAOX,IAAUL,EAAO,WAAW;AAAA,gBACnC,SAAQ;AAAA,gBACR,IAAI,EAAE,QAAQ,IAAI,IAAI,IAAA;AAAA,cAAI;AAAA,YAAA;AAAA,UAC5B,EAAA,CACF;AAAA,QAAA,GACF;AAAA,0BACCiB,GAAA,EAAW,OAAOjB,EAAO,WAAW,WAAW,WAAA,CAAY;AAAA,MAAA,GAC9D;AAAA,MAEA,gBAAAU,EAACC,GAAA,EAAI,IAAI,EAAE,IAAI,IAAA,GAAO,UAAA,gBAAAD,EAACQ,GAAA,EAAS,OAAK,IAAE,UAAAlB,EAAO,SAAQ,GAAW;AAAA,wBAEhEmB,GAAA,EAAQ,IAAI,EAAE,IAAI,OAAO;AAAA,MAEzBnB,EAAO,qBACN,gBAAAM,EAACG,GAAA,EAAM,WAAU,OAAM,SAAS,MAAM,UAAS,QAAO,YAAU,IAC7D,UAAA;AAAA,QAAAT,EAAO,cAAc,gBAAAU,EAACI,GAAA,EAAK,MAAK,SAAQ,OAAO,QAAQd,EAAO,WAAW,IAAI,IAAI,EAAE,QAAQ,GAAA,GAAM,IAAK;AAAA,QACvG,gBAAAU,EAACI,GAAA,EAAK,MAAK,SAAQ,OAAO,KAAGM,IAAApB,EAAO,uBAAP,gBAAAoB,EAA2B,WAAU,CAAC,cAAc,IAAI,EAAE,QAAQ,MAAM;AAAA,QACpGpB,EAAO,iBAAiB,gBAAAU,EAACI,GAAA,EAAK,MAAK,SAAQ,OAAM,WAAU,OAAM,WAAU,IAAI,EAAE,QAAQ,GAAA,GAAM,IAAK;AAAA,MAAA,EAAA,CACvG,IAEA,gBAAAJ,EAACG,GAAA,EAAW,SAAQ,WAAU,OAAM,iBAAgB,UAAA,6BAAyB;AAAA,MAE9Eb,EAAO,sBACN,gBAAAM,EAACO,GAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,SAAQ,SAAQ,IAAI,EAAE,IAAI,KAAK,UAAA;AAAA,QAAA;AAAA,QAC1EQ,EAAOrB,EAAO,kBAAkB,EAAE,QAAA;AAAA,MAAQ,EAAA,CACpD;AAAA,IAAA,GAEJ;AAAA,IACA,gBAAAM,EAACgB,GAAA,EAAY,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,UAAU,UACxD,UAAA;AAAA,MAAA,gBAAAZ,EAACa,GAAA,EAAO,MAAK,SAAQ,SAAQ,aAAY,WAAW,gBAAAb,EAACc,GAAA,CAAA,CAAqB,GAAI,SAASvB,GAAQ,UAAA,QAAI;AAAA,MAClGG,KACC,gBAAAM,EAACa,GAAA,EAAO,MAAK,SAAQ,SAAQ,YAAW,WAAW,gBAAAb,EAACe,GAAA,CAAA,CAAgB,GAAI,SAASvB,GAAQ,UAAA,QAAI;AAAA,MAE/F,gBAAAQ,EAACa,GAAA,EAAO,MAAK,SAAQ,SAAQ,YAAW,WAAW,gBAAAb,EAACgB,GAAA,CAAA,CAAiB,GAAI,SAASvB,GAAW,UAAA,UAAA,CAAO;AAAA,IAAA,EAAA,CACtG;AAAA,EAAA,GACF;AAEJ;AAEA,SAASwB,KAAiB;AACxB,QAAMC,IAAWC,EAAA,GACX,EAAE,WAAAzB,EAAA,IAAc0B,EAAA,GAChB,CAACC,GAASC,CAAU,IAAIC,EAAS,CAAA,CAAE,GACnC,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAK,GACtC,CAACG,GAAYC,CAAa,IAAIJ,EAAS,IAAI,GAE3CK,IAAOC,EAAY,YAAY;AACnC,IAAAJ,EAAW,EAAI;AACf,QAAI;AACF,YAAMK,IAAM,MAAMC,EAAA;AAClB,MAAAT,GAAWQ,KAAA,gBAAAA,EAAK,SAAQ,EAAE;AAAA,IAC5B,QAAQ;AACN,MAAAE,EAAU,EAAE,MAAM,SAAS,SAAS,gCAAgC;AAAA,IACtE,UAAA;AACE,MAAAP,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,SAAAQ,EAAU,MAAM;AAAE,IAAAL,EAAA;AAAA,EAAQ,GAAG,CAACA,CAAI,CAAC,GAGjC,gBAAA5B,EAACkC,GAAA,EACD,UAAA,gBAAAtC,EAACK,GAAA,EAAI,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,IAAI,EAAA,KACzB,UAAA;AAAA,IAAA,gBAAAD;AAAA,MAACmC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,UAAS;AAAA,QACT,OAAO,CAAC,QAAQ,eAAe,YAAY;AAAA,QAC3C,SACE,gBAAAvC,EAACG,GAAA,EAAM,WAAU,OAAM,SAAS,GAC9B,UAAA;AAAA,UAAA,gBAAAC,EAACa,GAAA,EAAO,SAAQ,YAAW,6BAAYuB,GAAA,CAAA,CAAmB,GAAI,SAASR,GAAM,UAAA,UAAA,CAAO;AAAA,UACnFlC,KACC,gBAAAM,EAACa,GAAA,EAAO,SAAQ,aAAY,WAAW,gBAAAb,EAACqC,GAAA,CAAA,CAAe,GAAI,SAAS,MAAMnB,EAAS,oCAAoC,GAAG,UAAA,iBAAA,CAE1H;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,IAIHM,IACC,gBAAAxB,EAACsC,GAAA,EAAK,WAAS,IAAC,SAAS,GACtB,UAAA,MAAM,KAAK,EAAE,QAAQ,EAAA,CAAG,EAAE,IAAI,CAACC,GAAGC,MACjC,gBAAAxC,EAACsC,GAAA,EAAK,MAAI,IAAC,IAAI,IAAI,IAAI,GAAG,IAAI,GAAW,UAAA,gBAAAtC,EAACyC,GAAA,EAAS,SAAQ,WAAU,QAAQ,IAAA,CAAK,EAAA,GAA5CD,CAA8C,CACrF,EAAA,CACH,IACEnB,EAAQ,WAAW,IACrB,gBAAArB,EAACH,GAAA,EAAK,SAAQ,YAAW,IAAI,EAAE,cAAc,GAAG,GAAG,GAAG,WAAW,SAAA,GAC/D,UAAA,gBAAAD,EAACG,GAAA,EAAM,YAAW,UAAS,SAAS,KAClC,UAAA;AAAA,MAAA,gBAAAC,EAACE,KAAe,IAAI,EAAE,UAAU,IAAI,OAAO,mBAAmB;AAAA,MAC9D,gBAAAF,EAACG,KAAW,SAAQ,MAAK,IAAI,EAAE,YAAY,IAAA,GAAO,UAAA,sBAAA,CAAmB;AAAA,MACrE,gBAAAH,EAACG,GAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,UAAU,IAAA,GAAO,UAAA,qHAAA,CAE1E;AAAA,MACCT,KACC,gBAAAM,EAACa,GAAA,EAAO,SAAQ,aAAY,WAAW,gBAAAb,EAACqC,GAAA,CAAA,CAAe,GAAI,SAAS,MAAMnB,EAAS,oCAAoC,GAAG,UAAA,4BAAA,CAE1H;AAAA,IAAA,EAAA,CAEJ,EAAA,CACF,IAEA,gBAAAlB,EAACsC,GAAA,EAAK,WAAS,IAAC,SAAS,GACtB,UAAAjB,EAAQ,IAAI,CAACqB,MACZ,gBAAA1C,EAACsC,KAAK,MAAI,IAAC,IAAI,IAAI,IAAI,GAAG,IAAI,GAC5B,UAAA,gBAAAtC;AAAA,MAACX;AAAA,MAAA;AAAA,QACC,QAAQqD;AAAA,QACR,WAAAhD;AAAA,QACA,QAAQ,MAAMwB,EAAS,kCAAkCwB,EAAE,EAAE,EAAE;AAAA,QAC/D,QAAQ,MAAMf,EAAce,CAAC;AAAA,QAC7B,WAAW,MAAMxB,EAAS,kCAAkCwB,EAAE,EAAE,UAAU;AAAA,MAAA;AAAA,IAAA,EAC5E,GAPoCA,EAAE,EAQxC,CACD,GACH;AAAA,IAGDhB,KACC,gBAAA1B;AAAA,MAAC2C;AAAA,MAAA;AAAA,QACC,MAAM,EAAQjB;AAAA,QACd,QAAQA;AAAA,QACR,SAAS,MAAMC,EAAc,IAAI;AAAA,QACjC,QAAQC;AAAA,MAAA;AAAA,IAAA;AAAA,EACV,EAAA,CAEJ,EAAA,CACA;AAEJ;"}
1
+ {"version":3,"file":"FhirServerList-iXBPkRVF.js","sources":["../src/views/FhirResource/FhirServerList.jsx"],"sourcesContent":["import { useEffect, useState, useCallback } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport {\n Box, Button, Stack, Typography, Skeleton, Chip, Grid,\n Card, CardContent, CardActions, Divider,\n} from \"@mui/material\";\nimport AddRoundedIcon from \"@mui/icons-material/AddRounded\";\nimport RefreshRoundedIcon from \"@mui/icons-material/RefreshRounded\";\nimport SyncRoundedIcon from \"@mui/icons-material/SyncRounded\";\nimport InboxRoundedIcon from \"@mui/icons-material/InboxRounded\";\nimport OpenInNewRoundedIcon from \"@mui/icons-material/OpenInNewRounded\";\nimport DnsRoundedIcon from \"@mui/icons-material/DnsRounded\";\nimport LockRoundedIcon from \"@mui/icons-material/LockRounded\";\nimport LockOpenRoundedIcon from \"@mui/icons-material/LockOpenRounded\";\nimport moment from \"moment\";\nimport { showToast } from \"@/common/toaster/toaster\";\nimport { retrieveAllServers } from \"../../services/FhirResource\";\nimport { FhirPageHeader, StatusChip, MonoText } from \"./components/FhirUi\";\nimport { FhirGuard, useFhirPermissions } from \"./components/permissions\";\nimport SyncDialog from \"./SyncDialog\";\n\nfunction ServerCard({ server, onOpen, onSync, onStaging, canManage }) {\n const secured = server.authType && server.authType !== \"NONE\";\n return (\n <Card variant=\"outlined\" sx={{ height: \"100%\", borderRadius: 2, display: \"flex\", flexDirection: \"column\" }}>\n <CardContent sx={{ flexGrow: 1 }}>\n <Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"flex-start\">\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Box sx={{ width: 36, height: 36, borderRadius: 1.5, bgcolor: \"primary.main\", color: \"#fff\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\n <DnsRoundedIcon fontSize=\"small\" />\n </Box>\n <Box>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 800, lineHeight: 1.1 }}>{server.name}</Typography>\n <Chip\n size=\"small\"\n icon={secured ? <LockRoundedIcon /> : <LockOpenRoundedIcon />}\n label={secured ? server.authType : \"Public\"}\n variant=\"outlined\"\n sx={{ height: 20, mt: 0.5 }}\n />\n </Box>\n </Stack>\n <StatusChip value={server.isActive ? \"ACTIVE\" : \"INACTIVE\"} />\n </Stack>\n\n <Box sx={{ mt: 1.5 }}><MonoText muted>{server.baseUrl}</MonoText></Box>\n\n <Divider sx={{ my: 1.5 }} />\n\n {server.capabilitySyncedAt ? (\n <Stack direction=\"row\" spacing={0.75} flexWrap=\"wrap\" useFlexGap>\n {server.fhirVersion ? <Chip size=\"small\" label={`FHIR ${server.fhirVersion}`} sx={{ height: 22 }} /> : null}\n <Chip size=\"small\" label={`${server.supportedResources?.length ?? 0} resources`} sx={{ height: 22 }} />\n {server.supportsExpand ? <Chip size=\"small\" color=\"success\" label=\"$expand\" sx={{ height: 22 }} /> : null}\n </Stack>\n ) : (\n <Typography variant=\"caption\" color=\"text.disabled\">Capability not discovered</Typography>\n )}\n {server.capabilitySyncedAt && (\n <Typography variant=\"caption\" color=\"text.secondary\" display=\"block\" sx={{ mt: 1 }}>\n synced {moment(server.capabilitySyncedAt).fromNow()}\n </Typography>\n )}\n </CardContent>\n <CardActions sx={{ px: 2, pb: 2, pt: 0, gap: 1, flexWrap: \"wrap\" }}>\n <Button size=\"small\" variant=\"contained\" startIcon={<OpenInNewRoundedIcon />} onClick={onOpen}>Open</Button>\n {canManage && (\n <Button size=\"small\" variant=\"outlined\" startIcon={<SyncRoundedIcon />} onClick={onSync}>Sync</Button>\n )}\n <Button size=\"small\" variant=\"outlined\" startIcon={<InboxRoundedIcon />} onClick={onStaging}>Staging</Button>\n </CardActions>\n </Card>\n );\n}\n\nfunction FhirServerList() {\n const navigate = useNavigate();\n const { canManage } = useFhirPermissions();\n const [servers, setServers] = useState([]);\n const [loading, setLoading] = useState(false);\n const [syncServer, setSyncServer] = useState(null);\n\n const load = useCallback(async () => {\n setLoading(true);\n try {\n const res = await retrieveAllServers();\n setServers(res?.data ?? []);\n } catch {\n showToast({ type: \"error\", message: \"Failed to load FHIR servers.\" });\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => { load(); }, [load]);\n\n return (\n <FhirGuard>\n <Box sx={{ p: { xs: 2, md: 3 } }}>\n <FhirPageHeader\n title=\"FHIR Sync\"\n subtitle=\"Connect any FHIR-compliant server by its base URL, discover what it supports, then sync resources into the staging inbox and process them into the system.\"\n chips={[\"Sync\", \"Raw Storage\", \"Processing\"]}\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" startIcon={<RefreshRoundedIcon />} onClick={load}>Refresh</Button>\n {canManage && (\n <Button variant=\"contained\" startIcon={<AddRoundedIcon />} onClick={() => navigate(\"/ui/medplat/admin/fhirResource/new\")}>\n Connect Server\n </Button>\n )}\n </Stack>\n }\n />\n\n {loading ? (\n <Grid container spacing={2}>\n {Array.from({ length: 3 }).map((_, i) => (\n <Grid item xs={12} sm={6} md={4} key={i}><Skeleton variant=\"rounded\" height={220} /></Grid>\n ))}\n </Grid>\n ) : servers.length === 0 ? (\n <Card variant=\"outlined\" sx={{ borderRadius: 2, p: 5, textAlign: \"center\" }}>\n <Stack alignItems=\"center\" spacing={1.5}>\n <DnsRoundedIcon sx={{ fontSize: 48, color: \"text.disabled\" }} />\n <Typography variant=\"h6\" sx={{ fontWeight: 700 }}>No FHIR servers yet</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ maxWidth: 420 }}>\n Connect a FHIR server by its base URL. We’ll guide you through discovering its capabilities and syncing resources.\n </Typography>\n {canManage && (\n <Button variant=\"contained\" startIcon={<AddRoundedIcon />} onClick={() => navigate(\"/ui/medplat/admin/fhirResource/new\")}>\n Connect your first server\n </Button>\n )}\n </Stack>\n </Card>\n ) : (\n <Grid container spacing={2}>\n {servers.map((s) => (\n <Grid item xs={12} sm={6} md={4} key={s.id}>\n <ServerCard\n server={s}\n canManage={canManage}\n onOpen={() => navigate(`/ui/medplat/admin/fhirResource/${s.id}`)}\n onSync={() => setSyncServer(s)}\n onStaging={() => navigate(`/ui/medplat/admin/fhirResource/${s.id}/staging`)}\n />\n </Grid>\n ))}\n </Grid>\n )}\n\n {syncServer && (\n <SyncDialog\n open={Boolean(syncServer)}\n server={syncServer}\n onClose={() => setSyncServer(null)}\n onDone={load}\n />\n )}\n </Box>\n </FhirGuard>\n );\n}\n\nexport default FhirServerList;\n"],"names":["ServerCard","server","onOpen","onSync","onStaging","canManage","secured","jsxs","Card","CardContent","Stack","jsx","Box","DnsRoundedIcon","Typography","Chip","LockRoundedIcon","LockOpenRoundedIcon","StatusChip","MonoText","Divider","_a","moment","CardActions","Button","OpenInNewRoundedIcon","SyncRoundedIcon","InboxRoundedIcon","FhirServerList","navigate","useNavigate","useFhirPermissions","servers","setServers","useState","loading","setLoading","syncServer","setSyncServer","load","useCallback","res","retrieveAllServers","showToast","useEffect","FhirGuard","FhirPageHeader","RefreshRoundedIcon","AddRoundedIcon","Grid","_","i","Skeleton","s","SyncDialog"],"mappings":"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"}
@@ -1,18 +1,18 @@
1
1
  import { jsx as t, jsxs as o } from "react/jsx-runtime";
2
2
  import "react";
3
- import { Dialog as M, DialogTitle as W, Box as m, Typography as w, IconButton as j, DialogContent as A, DialogActions as F, Button as g } from "@mui/material";
4
- import P from "@/common/fontAwesomeIcons/FontAwesomeIcons";
5
- import { useForm as q } from "react-hook-form";
6
- import { yupResolver as N } from "@hookform/resolvers/yup";
3
+ import { Dialog as R, DialogTitle as q, Box as m, Typography as w, IconButton as z, DialogContent as V, DialogActions as _, Button as E } from "@mui/material";
4
+ import $ from "@/common/fontAwesomeIcons/FontAwesomeIcons";
5
+ import { useForm as L } from "react-hook-form";
6
+ import { yupResolver as X } from "@hookform/resolvers/yup";
7
7
  import * as s from "yup";
8
8
  import h from "@/views/custom-components/CustomCheckBox";
9
9
  import k from "@/views/custom-components/CustomDatePicker";
10
10
  import r from "prop-types";
11
- import { a as z } from "./Features-Dne21RWu.js";
11
+ import { a as H } from "./Features-Dne21RWu.js";
12
12
  import { showToast as B } from "@/common/toaster/toaster";
13
- import { execute as V } from "@/common/services/GlobalApis.js";
14
- import { useTranslateProvider as L } from "@/common/languageTranslator/TranslationContext";
15
- const R = s.object().shape({
13
+ import { execute as J } from "@/common/services/GlobalApis.js";
14
+ import { useTranslateProvider as K } from "@/common/languageTranslator/TranslationContext";
15
+ const Q = s.object().shape({
16
16
  noStartDate: s.boolean().default(!0),
17
17
  noEndDate: s.boolean().default(!0),
18
18
  startDate: s.date().nullable().when("noStartDate", {
@@ -32,22 +32,22 @@ const R = s.object().shape({
32
32
  ),
33
33
  isBackendOnly: s.boolean().default(!1)
34
34
  });
35
- function X({
35
+ function U({
36
36
  isOpen: a,
37
37
  onClose: n,
38
38
  pendingGrant: e,
39
- subMenuId: E,
39
+ subMenuId: T,
40
40
  newApiData: I
41
41
  }) {
42
- const { translate: l } = L(), {
43
- handleSubmit: v,
44
- control: i,
42
+ const { translate: i } = K(), {
43
+ handleSubmit: g,
44
+ control: l,
45
45
  reset: p,
46
46
  watch: u,
47
47
  formState: { errors: f },
48
48
  trigger: b
49
- } = q({
50
- resolver: N(R),
49
+ } = L({
50
+ resolver: X(Q),
51
51
  defaultValues: {
52
52
  noStartDate: !0,
53
53
  noEndDate: !0,
@@ -56,26 +56,29 @@ function X({
56
56
  isBackendOnly: !1
57
57
  },
58
58
  mode: "onChange"
59
- }), T = u("noStartDate"), Y = u("noEndDate"), x = u("startDate"), y = u("endDate"), O = async (d) => {
59
+ }), v = u("noStartDate"), O = u("noEndDate"), x = u("startDate"), y = u("endDate"), Y = /^view\.report\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, P = async (d) => {
60
60
  var S, C;
61
61
  if (e) {
62
62
  try {
63
- await V({
64
- code: "grant_permission",
65
- parameters: {
66
- featureName: e.id,
67
- roleIds: e != null && e.designationId ? String(e == null ? void 0 : e.designationId) : null,
68
- userIds: e != null && e.userId ? String(e.userId) : null,
69
- startDate: d.noStartDate ? null : d.startDate,
70
- endDate: d.noEndDate ? null : d.endDate,
71
- isBackendOnly: d.isBackendOnly
72
- }
73
- }), B({
63
+ const c = e != null && e.designationId ? String(e == null ? void 0 : e.designationId) : null, A = e != null && e.userId ? String(e.userId) : null, M = d.noStartDate ? null : d.startDate, N = d.noEndDate ? null : d.endDate, W = Y.test(e.id) ? [e.id, `${e.id}.candrilldown`] : [e.id];
64
+ for (const F of W)
65
+ await J({
66
+ code: "grant_permission",
67
+ parameters: {
68
+ featureName: F,
69
+ roleIds: c,
70
+ userIds: A,
71
+ startDate: M,
72
+ endDate: N,
73
+ isBackendOnly: d.isBackendOnly
74
+ }
75
+ });
76
+ B({
74
77
  type: "success",
75
78
  message: "Permission Granted Successfully"
76
79
  });
77
- const { data: c } = await z(E);
78
- I(c);
80
+ const { data: j } = await H(T);
81
+ I(j);
79
82
  } catch (c) {
80
83
  B({
81
84
  type: "error",
@@ -87,9 +90,9 @@ function X({
87
90
  }, D = () => {
88
91
  p(), n();
89
92
  };
90
- return /* @__PURE__ */ t(M, { open: !!a, onClose: D, fullWidth: !0, maxWidth: "sm", children: /* @__PURE__ */ o("form", { onSubmit: v(O), children: [
93
+ return /* @__PURE__ */ t(R, { open: !!a, onClose: D, fullWidth: !0, maxWidth: "sm", children: /* @__PURE__ */ o("form", { onSubmit: g(P), children: [
91
94
  /* @__PURE__ */ o(
92
- W,
95
+ q,
93
96
  {
94
97
  sx: {
95
98
  display: "flex",
@@ -108,27 +111,27 @@ function X({
108
111
  variant: "subtitle1",
109
112
  component: "span",
110
113
  sx: { fontWeight: 700, display: "block" },
111
- children: l("Set Access Window")
114
+ children: i("Set Access Window")
112
115
  }
113
116
  ),
114
- /* @__PURE__ */ t(w, { variant: "body2", color: "text.secondary", children: l(
117
+ /* @__PURE__ */ t(w, { variant: "body2", color: "text.secondary", children: i(
115
118
  "Leave both dates off to grant access that never expires."
116
119
  ) })
117
120
  ] }),
118
121
  /* @__PURE__ */ t(
119
- j,
122
+ z,
120
123
  {
121
124
  size: "small",
122
125
  onClick: D,
123
- "aria-label": l("Close"),
126
+ "aria-label": i("Close"),
124
127
  "data-testid": "grantpermission-close-button",
125
- children: /* @__PURE__ */ t(P, { iconName: "faXmark" })
128
+ children: /* @__PURE__ */ t($, { iconName: "faXmark" })
126
129
  }
127
130
  )
128
131
  ]
129
132
  }
130
133
  ),
131
- /* @__PURE__ */ o(A, { children: [
134
+ /* @__PURE__ */ o(V, { children: [
132
135
  /* @__PURE__ */ o(
133
136
  m,
134
137
  {
@@ -145,7 +148,7 @@ function X({
145
148
  {
146
149
  defaultChecked: !0,
147
150
  label: "No Start Date",
148
- control: i,
151
+ control: l,
149
152
  errors: f,
150
153
  name: "noStartDate",
151
154
  onChange: () => b("startDate")
@@ -154,10 +157,10 @@ function X({
154
157
  /* @__PURE__ */ t(
155
158
  k,
156
159
  {
157
- control: i,
160
+ control: l,
158
161
  name: "startDate",
159
162
  errors: f,
160
- disabled: T,
163
+ disabled: v,
161
164
  format: "DD/MM/YYYY",
162
165
  maxDate: y || void 0
163
166
  }
@@ -168,7 +171,7 @@ function X({
168
171
  h,
169
172
  {
170
173
  label: "No End Date",
171
- control: i,
174
+ control: l,
172
175
  name: "noEndDate",
173
176
  errors: f,
174
177
  onChange: () => b("endDate")
@@ -177,10 +180,10 @@ function X({
177
180
  /* @__PURE__ */ t(
178
181
  k,
179
182
  {
180
- control: i,
183
+ control: l,
181
184
  name: "endDate",
182
185
  errors: f,
183
- disabled: Y,
186
+ disabled: O,
184
187
  format: "DD/MM/YYYY",
185
188
  minDate: x || void 0
186
189
  }
@@ -193,34 +196,34 @@ function X({
193
196
  h,
194
197
  {
195
198
  label: "Is Backend Only?",
196
- control: i,
199
+ control: l,
197
200
  name: "isBackendOnly"
198
201
  }
199
202
  ) })
200
203
  ] }),
201
204
  /* @__PURE__ */ o(
202
- F,
205
+ _,
203
206
  {
204
207
  sx: { px: 3, py: 2, borderTop: "1px solid", borderColor: "divider" },
205
208
  children: [
206
209
  /* @__PURE__ */ t(
207
- g,
210
+ E,
208
211
  {
209
212
  variant: "outlined",
210
213
  color: "inherit",
211
214
  size: "small",
212
215
  onClick: D,
213
216
  type: "button",
214
- children: l("Close")
217
+ children: i("Close")
215
218
  }
216
219
  ),
217
- /* @__PURE__ */ t(g, { variant: "contained", color: "primary", size: "small", type: "submit", children: l("Submit") })
220
+ /* @__PURE__ */ t(E, { variant: "contained", color: "primary", size: "small", type: "submit", children: i("Submit") })
218
221
  ]
219
222
  }
220
223
  )
221
224
  ] }) });
222
225
  }
223
- X.propTypes = {
226
+ U.propTypes = {
224
227
  isOpen: r.bool,
225
228
  onClose: r.func,
226
229
  pendingGrant: r.object,
@@ -231,6 +234,6 @@ X.propTypes = {
231
234
  showToast: r.func
232
235
  };
233
236
  export {
234
- X as default
237
+ U as default
235
238
  };
236
- //# sourceMappingURL=GrantPermissionModal-BDN66Atn.js.map
239
+ //# sourceMappingURL=GrantPermissionModal-D7iNZd0M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrantPermissionModal-D7iNZd0M.js","sources":["../src/views/Features/GrantPermissionModal.jsx"],"sourcesContent":["import React from \"react\";\nimport {\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n IconButton,\n Typography,\n} from \"@mui/material\";\nimport FontAwesomeIcons from \"@/common/fontAwesomeIcons/FontAwesomeIcons\";\nimport { useForm } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as Yup from \"yup\";\nimport CustomCheckBox from \"@/views/custom-components/CustomCheckBox\";\nimport CustomDatePicker from \"@/views/custom-components/CustomDatePicker\";\nimport PropTypes from \"prop-types\";\nimport { getFeatureDataV2 } from \"../../services/Features\";\nimport { showToast } from \"@/common/toaster/toaster\";\nimport { execute } from \"@/common/services/GlobalApis.js\";\nimport { useTranslateProvider } from \"@/common/languageTranslator/TranslationContext\";\n\nconst schema = Yup.object().shape({\n noStartDate: Yup.boolean().default(true),\n noEndDate: Yup.boolean().default(true),\n startDate: Yup.date()\n .nullable()\n .when(\"noStartDate\", {\n is: false,\n then: (schema) => schema.required(\"Start date is required\"),\n }),\n endDate: Yup.date()\n .nullable()\n .when(\"noEndDate\", {\n is: false,\n then: (schema) => schema.required(\"End date is required\"),\n })\n .test(\n \"endAfterStart\",\n \"End date must be after start date\",\n function (value) {\n const { startDate, noEndDate } = this.parent;\n if (!value || noEndDate || !startDate) return true;\n return new Date(value) >= new Date(startDate);\n }\n ),\n isBackendOnly: Yup.boolean().default(false),\n});\n\nexport default function GrantPermissionModal({\n isOpen,\n onClose,\n pendingGrant,\n subMenuId,\n newApiData,\n}) {\n const { translate } = useTranslateProvider();\n const {\n handleSubmit,\n control,\n reset,\n watch,\n formState: { errors },\n trigger,\n } = useForm({\n resolver: yupResolver(schema),\n defaultValues: {\n noStartDate: true,\n noEndDate: true,\n startDate: null,\n endDate: null,\n isBackendOnly: false,\n },\n mode: \"onChange\",\n });\n\n const noStartDate = watch(\"noStartDate\");\n const noEndDate = watch(\"noEndDate\");\n const startDate = watch(\"startDate\");\n const endDate = watch(\"endDate\");\n\n // Anchored so candrilldown (and any other) sub-rights of a report never match this —\n // matches the same pattern used in AccessRights.jsx's getBasicRightId.\n const REPORT_ROOT_PATTERN =\n /^view\\.report\\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n const handleFormSubmit = async (values) => {\n if (!pendingGrant) return;\n\n try {\n const roleIds = pendingGrant?.designationId\n ? String(pendingGrant?.designationId)\n : null;\n const userIds = pendingGrant?.userId ? String(pendingGrant.userId) : null;\n const startDate = values.noStartDate ? null : values.startDate;\n const endDate = values.noEndDate ? null : values.endDate;\n\n // Granting a report's root permission implicitly grants drill-down too, since\n // there is no separate UI control for it (candrilldown never appears as its own\n // toggleable row — only report roots do).\n const featureNames = REPORT_ROOT_PATTERN.test(pendingGrant.id)\n ? [pendingGrant.id, `${pendingGrant.id}.candrilldown`]\n : [pendingGrant.id];\n\n for (const featureName of featureNames) {\n await execute({\n code: \"grant_permission\",\n parameters: {\n featureName,\n roleIds,\n userIds,\n startDate,\n endDate,\n isBackendOnly: values.isBackendOnly,\n },\n });\n }\n\n showToast({\n type: \"success\",\n message: \"Permission Granted Successfully\",\n });\n\n // refresh data\n const { data: val } = await getFeatureDataV2(subMenuId);\n newApiData(val);\n } catch (error) {\n showToast({\n type: \"error\",\n message: `Error granting permission: ${error?.response?.data?.message}`,\n });\n }\n\n // cleanup\n reset();\n onClose();\n };\n\n const handleClose = () => {\n reset();\n onClose();\n };\n\n return (\n <Dialog open={Boolean(isOpen)} onClose={handleClose} fullWidth maxWidth=\"sm\">\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <DialogTitle\n sx={{\n display: \"flex\",\n alignItems: \"flex-start\",\n justifyContent: \"space-between\",\n gap: 2,\n py: 1.5,\n borderBottom: \"1px solid\",\n borderColor: \"divider\",\n }}\n >\n <Box>\n <Typography\n variant=\"subtitle1\"\n component=\"span\"\n sx={{ fontWeight: 700, display: \"block\" }}\n >\n {translate(\"Set Access Window\")}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {translate(\n \"Leave both dates off to grant access that never expires.\",\n )}\n </Typography>\n </Box>\n <IconButton\n size=\"small\"\n onClick={handleClose}\n aria-label={translate(\"Close\")}\n data-testid=\"grantpermission-close-button\"\n >\n <FontAwesomeIcons iconName=\"faXmark\" />\n </IconButton>\n </DialogTitle>\n\n <DialogContent>\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { xs: \"column\", sm: \"row\" },\n gap: 3,\n pt: 2,\n }}\n >\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <CustomCheckBox\n defaultChecked={true}\n label={\"No Start Date\"}\n control={control}\n errors={errors}\n name={\"noStartDate\"}\n onChange={() => trigger(\"startDate\")}\n />\n <CustomDatePicker\n control={control}\n name={\"startDate\"}\n errors={errors}\n disabled={noStartDate}\n format=\"DD/MM/YYYY\"\n maxDate={endDate ? endDate : undefined}\n />\n </Box>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <CustomCheckBox\n label={\"No End Date\"}\n control={control}\n name={\"noEndDate\"}\n errors={errors}\n onChange={() => trigger(\"endDate\")}\n />\n <CustomDatePicker\n control={control}\n name={\"endDate\"}\n errors={errors}\n disabled={noEndDate}\n format=\"DD/MM/YYYY\"\n minDate={startDate ? startDate : undefined}\n />\n </Box>\n </Box>\n\n <Box sx={{ mt: 1 }}>\n <CustomCheckBox\n label={\"Is Backend Only?\"}\n control={control}\n name={\"isBackendOnly\"}\n />\n </Box>\n </DialogContent>\n\n <DialogActions\n sx={{ px: 3, py: 2, borderTop: \"1px solid\", borderColor: \"divider\" }}\n >\n <Button\n variant=\"outlined\"\n color=\"inherit\"\n size=\"small\"\n onClick={handleClose}\n type=\"button\"\n >\n {translate(\"Close\")}\n </Button>\n <Button variant=\"contained\" color=\"primary\" size=\"small\" type=\"submit\">\n {translate(\"Submit\")}\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n );\n}\n\nGrantPermissionModal.propTypes = {\n isOpen: PropTypes.bool,\n onClose: PropTypes.func,\n pendingGrant: PropTypes.object,\n execute: PropTypes.func,\n getFeatureDataV2: PropTypes.func,\n subMenuId: PropTypes.string,\n newApiData: PropTypes.func,\n showToast: PropTypes.func,\n};\n"],"names":["schema","Yup","value","startDate","noEndDate","GrantPermissionModal","isOpen","onClose","pendingGrant","subMenuId","newApiData","translate","useTranslateProvider","handleSubmit","control","reset","watch","errors","trigger","useForm","yupResolver","noStartDate","endDate","REPORT_ROOT_PATTERN","handleFormSubmit","values","roleIds","userIds","featureNames","featureName","execute","showToast","val","getFeatureDataV2","error","_b","_a","handleClose","Dialog","jsxs","DialogTitle","Box","jsx","Typography","IconButton","FontAwesomeIcons","DialogContent","CustomCheckBox","CustomDatePicker","DialogActions","Button","PropTypes"],"mappings":";;;;;;;;;;;;;;AAuBA,MAAMA,IAASC,EAAI,OAAA,EAAS,MAAM;AAAA,EAChC,aAAaA,EAAI,UAAU,QAAQ,EAAI;AAAA,EACvC,WAAWA,EAAI,UAAU,QAAQ,EAAI;AAAA,EACrC,WAAWA,EAAI,KAAA,EACZ,SAAA,EACA,KAAK,eAAe;AAAA,IACnB,IAAI;AAAA,IACJ,MAAM,CAACD,MAAWA,EAAO,SAAS,wBAAwB;AAAA,EAAA,CAC3D;AAAA,EACH,SAASC,EAAI,KAAA,EACV,SAAA,EACA,KAAK,aAAa;AAAA,IACjB,IAAI;AAAA,IACJ,MAAM,CAACD,MAAWA,EAAO,SAAS,sBAAsB;AAAA,EAAA,CACzD,EACA;AAAA,IACC;AAAA,IACA;AAAA,IACA,SAAUE,GAAO;AACf,YAAM,EAAE,WAAAC,GAAW,WAAAC,EAAA,IAAc,KAAK;AACtC,aAAI,CAACF,KAASE,KAAa,CAACD,IAAkB,KACvC,IAAI,KAAKD,CAAK,KAAK,IAAI,KAAKC,CAAS;AAAA,IAC9C;AAAA,EAAA;AAAA,EAEJ,eAAeF,EAAI,QAAA,EAAU,QAAQ,EAAK;AAC5C,CAAC;AAED,SAAwBI,EAAqB;AAAA,EAC3C,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC;AAAA,EACA,YAAAC;AACF,GAAG;AACD,QAAM,EAAE,WAAAC,EAAA,IAAcC,EAAA,GAChB;AAAA,IACJ,cAAAC;AAAA,IACA,SAAAC;AAAA,IACA,OAAAC;AAAA,IACA,OAAAC;AAAA,IACA,WAAW,EAAE,QAAAC,EAAA;AAAA,IACb,SAAAC;AAAA,EAAA,IACEC,EAAQ;AAAA,IACV,UAAUC,EAAYpB,CAAM;AAAA,IAC5B,eAAe;AAAA,MACb,aAAa;AAAA,MACb,WAAW;AAAA,MACX,WAAW;AAAA,MACX,SAAS;AAAA,MACT,eAAe;AAAA,IAAA;AAAA,IAEjB,MAAM;AAAA,EAAA,CACP,GAEKqB,IAAcL,EAAM,aAAa,GACjCZ,IAAYY,EAAM,WAAW,GAC7Bb,IAAYa,EAAM,WAAW,GAC7BM,IAAUN,EAAM,SAAS,GAIzBO,IACJ,iFAEIC,IAAmB,OAAOC,MAAW;;AACzC,QAAKjB,GAEL;AAAA,UAAI;AACF,cAAMkB,IAAUlB,KAAA,QAAAA,EAAc,gBAC1B,OAAOA,KAAA,gBAAAA,EAAc,aAAa,IAClC,MACEmB,IAAUnB,KAAA,QAAAA,EAAc,SAAS,OAAOA,EAAa,MAAM,IAAI,MAC/DL,IAAYsB,EAAO,cAAc,OAAOA,EAAO,WAC/CH,IAAUG,EAAO,YAAY,OAAOA,EAAO,SAK3CG,IAAeL,EAAoB,KAAKf,EAAa,EAAE,IACzD,CAACA,EAAa,IAAI,GAAGA,EAAa,EAAE,eAAe,IACnD,CAACA,EAAa,EAAE;AAEpB,mBAAWqB,KAAeD;AACxB,gBAAME,EAAQ;AAAA,YACZ,MAAM;AAAA,YACN,YAAY;AAAA,cACV,aAAAD;AAAA,cACA,SAAAH;AAAA,cACA,SAAAC;AAAA,cACA,WAAAxB;AAAAA,cACA,SAAAmB;AAAAA,cACA,eAAeG,EAAO;AAAA,YAAA;AAAA,UACxB,CACD;AAGH,QAAAM,EAAU;AAAA,UACR,MAAM;AAAA,UACN,SAAS;AAAA,QAAA,CACV;AAGD,cAAM,EAAE,MAAMC,EAAA,IAAQ,MAAMC,EAAiBxB,CAAS;AACtD,QAAAC,EAAWsB,CAAG;AAAA,MAChB,SAASE,GAAO;AACd,QAAAH,EAAU;AAAA,UACR,MAAM;AAAA,UACN,SAAS,+BAA8BI,KAAAC,IAAAF,KAAA,gBAAAA,EAAO,aAAP,gBAAAE,EAAiB,SAAjB,gBAAAD,EAAuB,OAAO;AAAA,QAAA,CACtE;AAAA,MACH;AAGA,MAAApB,EAAA,GACAR,EAAA;AAAA;AAAA,EACF,GAEM8B,IAAc,MAAM;AACxB,IAAAtB,EAAA,GACAR,EAAA;AAAA,EACF;AAEA,2BACG+B,GAAA,EAAO,MAAM,EAAQhC,GAAS,SAAS+B,GAAa,WAAS,IAAC,UAAS,MACtE,UAAA,gBAAAE,EAAC,UAAK,UAAU1B,EAAaW,CAAgB,GAC3C,UAAA;AAAA,IAAA,gBAAAe;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,KAAK;AAAA,UACL,IAAI;AAAA,UACJ,cAAc;AAAA,UACd,aAAa;AAAA,QAAA;AAAA,QAGf,UAAA;AAAA,UAAA,gBAAAD,EAACE,GAAA,EACC,UAAA;AAAA,YAAA,gBAAAC;AAAA,cAACC;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,WAAU;AAAA,gBACV,IAAI,EAAE,YAAY,KAAK,SAAS,QAAA;AAAA,gBAE/B,YAAU,mBAAmB;AAAA,cAAA;AAAA,YAAA;AAAA,YAEhC,gBAAAD,EAACC,GAAA,EAAW,SAAQ,SAAQ,OAAM,kBAC/B,UAAAhC;AAAA,cACC;AAAA,YAAA,EACF,CACF;AAAA,UAAA,GACF;AAAA,UACA,gBAAA+B;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAASP;AAAA,cACT,cAAY1B,EAAU,OAAO;AAAA,cAC7B,eAAY;AAAA,cAEZ,UAAA,gBAAA+B,EAACG,GAAA,EAAiB,UAAS,UAAA,CAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACvC;AAAA,MAAA;AAAA,IAAA;AAAA,sBAGDC,GAAA,EACC,UAAA;AAAA,MAAA,gBAAAP;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,YACF,SAAS;AAAA,YACT,eAAe,EAAE,IAAI,UAAU,IAAI,MAAA;AAAA,YACnC,KAAK;AAAA,YACL,IAAI;AAAA,UAAA;AAAA,UAGN,UAAA;AAAA,YAAA,gBAAAF,EAACE,KAAI,IAAI,EAAE,MAAM,GAAG,UAAU,KAC5B,UAAA;AAAA,cAAA,gBAAAC;AAAA,gBAACK;AAAA,gBAAA;AAAA,kBACC,gBAAgB;AAAA,kBAChB,OAAO;AAAA,kBACP,SAAAjC;AAAA,kBACA,QAAAG;AAAA,kBACA,MAAM;AAAA,kBACN,UAAU,MAAMC,EAAQ,WAAW;AAAA,gBAAA;AAAA,cAAA;AAAA,cAErC,gBAAAwB;AAAA,gBAACM;AAAA,gBAAA;AAAA,kBACC,SAAAlC;AAAA,kBACA,MAAM;AAAA,kBACN,QAAAG;AAAA,kBACA,UAAUI;AAAA,kBACV,QAAO;AAAA,kBACP,SAASC,KAAoB;AAAA,gBAAA;AAAA,cAAA;AAAA,YAC/B,GACF;AAAA,YACA,gBAAAiB,EAACE,KAAI,IAAI,EAAE,MAAM,GAAG,UAAU,KAC5B,UAAA;AAAA,cAAA,gBAAAC;AAAA,gBAACK;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,kBACP,SAAAjC;AAAA,kBACA,MAAM;AAAA,kBACN,QAAAG;AAAA,kBACA,UAAU,MAAMC,EAAQ,SAAS;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEnC,gBAAAwB;AAAA,gBAACM;AAAA,gBAAA;AAAA,kBACC,SAAAlC;AAAA,kBACA,MAAM;AAAA,kBACN,QAAAG;AAAA,kBACA,UAAUb;AAAA,kBACV,QAAO;AAAA,kBACP,SAASD,KAAwB;AAAA,gBAAA;AAAA,cAAA;AAAA,YACnC,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,wBAGDsC,GAAA,EAAI,IAAI,EAAE,IAAI,KACb,UAAA,gBAAAC;AAAA,QAACK;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,UACP,SAAAjC;AAAA,UACA,MAAM;AAAA,QAAA;AAAA,MAAA,EACR,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAyB;AAAA,MAACU;AAAA,MAAA;AAAA,QACC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,aAAa,aAAa,UAAA;AAAA,QAEzD,UAAA;AAAA,UAAA,gBAAAP;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,MAAK;AAAA,cACL,SAASb;AAAA,cACT,MAAK;AAAA,cAEJ,YAAU,OAAO;AAAA,YAAA;AAAA,UAAA;AAAA,UAEpB,gBAAAK,EAACQ,GAAA,EAAO,SAAQ,aAAY,OAAM,WAAU,MAAK,SAAQ,MAAK,UAC3D,UAAAvC,EAAU,QAAQ,EAAA,CACrB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,EAAA,CACF,EAAA,CACF;AAEJ;AAEAN,EAAqB,YAAY;AAAA,EAC/B,QAAQ8C,EAAU;AAAA,EAClB,SAASA,EAAU;AAAA,EACnB,cAAcA,EAAU;AAAA,EACxB,SAASA,EAAU;AAAA,EACnB,kBAAkBA,EAAU;AAAA,EAC5B,WAAWA,EAAU;AAAA,EACrB,YAAYA,EAAU;AAAA,EACtB,WAAWA,EAAU;AACvB;"}