@argusoft/medplat-core 1.0.30 → 1.0.32
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.
- package/dist/{AccessRights-xrday-L1.js → AccessRights-DBjTQA1-.js} +395 -390
- package/dist/AccessRights-DBjTQA1-.js.map +1 -0
- package/dist/{AddFeatures-D1sU8RjY.js → AddFeatures-COj4ZTIM.js} +2 -2
- package/dist/{AddFeatures-D1sU8RjY.js.map → AddFeatures-COj4ZTIM.js.map} +1 -1
- package/dist/AddMenuConfiguration-Creeib5X.js +11223 -0
- package/dist/AddMenuConfiguration-Creeib5X.js.map +1 -0
- package/dist/AddMenuConfiguration.css +1 -1
- package/dist/{BrandsPage-DmRW5bhm-Bk1szrjI.js → BrandsPage-CdcAvaml-ZtVTX6vX.js} +43 -43
- package/dist/{BrandsPage-DmRW5bhm-Bk1szrjI.js.map → BrandsPage-CdcAvaml-ZtVTX6vX.js.map} +1 -1
- package/dist/{CategoriesPage-BsS5IQh3-B03lWRY5.js → CategoriesPage-BprQEYJw-CclreTv1.js} +109 -102
- package/dist/CategoriesPage-BprQEYJw-CclreTv1.js.map +1 -0
- package/dist/{ChangePasswordModalCore-BPsJquTS.js → ChangePasswordModalCore-DZGOkbRY.js} +3 -3
- package/dist/{ChangePasswordModalCore-BPsJquTS.js.map → ChangePasswordModalCore-DZGOkbRY.js.map} +1 -1
- package/dist/ConditionConfig-Bpm6OoV5.js +408 -0
- package/dist/ConditionConfig-Bpm6OoV5.js.map +1 -0
- package/dist/{DashboardPage-C3bKc5na-sBd9Yqbi.js → DashboardPage-CTiGSx71-CsYohJ5e.js} +32 -32
- package/dist/{DashboardPage-C3bKc5na-sBd9Yqbi.js.map → DashboardPage-CTiGSx71-CsYohJ5e.js.map} +1 -1
- package/dist/EntityManagement-BGwJGl9k.js +62 -0
- package/dist/EntityManagement-BGwJGl9k.js.map +1 -0
- package/dist/EventConfig-BY2cgGyx.js +27 -0
- package/dist/{EventConfig-BmLemzX3.js.map → EventConfig-BY2cgGyx.js.map} +1 -1
- package/dist/EventConfigurations-B-z7xHh_.js +544 -0
- package/dist/EventConfigurations-B-z7xHh_.js.map +1 -0
- package/dist/EventConfigurations.css +1 -1
- package/dist/EventsExceptionModal-DafomIv6.js +188 -0
- package/dist/EventsExceptionModal-DafomIv6.js.map +1 -0
- package/dist/EventsUi-Dl_yckSA.js +263 -0
- package/dist/EventsUi-Dl_yckSA.js.map +1 -0
- package/dist/FacilityPicker-BXa2VF7i-Dab_Jwa5.js +112 -0
- package/dist/FacilityPicker-BXa2VF7i-Dab_Jwa5.js.map +1 -0
- package/dist/{FeatureMenu-DYJmDt7q.js → FeatureMenu-Kc73yPHH.js} +9 -5
- package/dist/FeatureMenu-Kc73yPHH.js.map +1 -0
- package/dist/{FhirServerList-DuTwnngN.js → FhirServerList-CrIHMAxz.js} +16 -16
- package/dist/{FhirServerList-DuTwnngN.js.map → FhirServerList-CrIHMAxz.js.map} +1 -1
- package/dist/{FhirServerProfile-CUOwC6Wb.js → FhirServerProfile-D3aYcpwY.js} +8 -8
- package/dist/{FhirServerProfile-CUOwC6Wb.js.map → FhirServerProfile-D3aYcpwY.js.map} +1 -1
- package/dist/{FhirServerWizard-DZI8Olku.js → FhirServerWizard-Db6Hm4bQ.js} +15 -15
- package/dist/{FhirServerWizard-DZI8Olku.js.map → FhirServerWizard-Db6Hm4bQ.js.map} +1 -1
- package/dist/{GrantPermissionModal-BDN66Atn.js → GrantPermissionModal-D7iNZd0M.js} +54 -51
- package/dist/GrantPermissionModal-D7iNZd0M.js.map +1 -0
- package/dist/ImmunizationConfigurationBase-lKsJZMak.js +8060 -0
- package/dist/ImmunizationConfigurationBase-lKsJZMak.js.map +1 -0
- package/dist/InventoryPage-JadYMCzU-CzJQfQ2A.js +1017 -0
- package/dist/InventoryPage-JadYMCzU-CzJQfQ2A.js.map +1 -0
- package/dist/LocationWiseExpectedTargetPage-CjKk1aTF.js +1344 -0
- package/dist/LocationWiseExpectedTargetPage-CjKk1aTF.js.map +1 -0
- package/dist/{ManageDynamicFeature-BU0I45dd.js → ManageDynamicFeature-CuyYfx_P.js} +104 -97
- package/dist/ManageDynamicFeature-CuyYfx_P.js.map +1 -0
- package/dist/ManageEventConfiguration-DqPbn3Oi.js +1216 -0
- package/dist/ManageEventConfiguration-DqPbn3Oi.js.map +1 -0
- package/dist/ManageEventConfiguration.css +1 -1
- package/dist/ManageRole-CyfpySt9.js +981 -0
- package/dist/ManageRole-CyfpySt9.js.map +1 -0
- package/dist/{ManageUser-DCFkUMV9.js → ManageUser-Dm0l833u.js} +286 -286
- package/dist/{ManageUser-DCFkUMV9.js.map → ManageUser-Dm0l833u.js.map} +1 -1
- package/dist/{MemberProfileCard-BdUNgHRB-VywqQdFF.js → MemberProfileCard-01d_jz3w-DYHtbgMX.js} +46 -46
- package/dist/{MemberProfileCard-BdUNgHRB-VywqQdFF.js.map → MemberProfileCard-01d_jz3w-DYHtbgMX.js.map} +1 -1
- package/dist/MobileAnalytics-C9oc2yAo.js +18399 -0
- package/dist/MobileAnalytics-C9oc2yAo.js.map +1 -0
- package/dist/MobileMenuManagement-BmzTPXy7.js +231 -0
- package/dist/MobileMenuManagement-BmzTPXy7.js.map +1 -0
- package/dist/MobileTypeEventConfigModal-DodU3beR.js +752 -0
- package/dist/MobileTypeEventConfigModal-DodU3beR.js.map +1 -0
- package/dist/{NewServerManagement-Cxe0dV0O.js → NewServerManagement-BdayO78D.js} +368 -352
- package/dist/NewServerManagement-BdayO78D.js.map +1 -0
- package/dist/OtherTypeEventConfigModal-D_9S50aI.js +1414 -0
- package/dist/OtherTypeEventConfigModal-D_9S50aI.js.map +1 -0
- package/dist/{PaymentCreatePage-CIVe0P0p-25BQVpOX.js → PaymentCreatePage-D6NZBUC3-DxXf2kvH.js} +58 -58
- package/dist/{PaymentCreatePage-CIVe0P0p-25BQVpOX.js.map → PaymentCreatePage-D6NZBUC3-DxXf2kvH.js.map} +1 -1
- package/dist/{PaymentsPage-BvPe5Q9F-D2gfziwW.js → PaymentsPage-CHieGNrn-BnYCtqHd.js} +37 -37
- package/dist/{PaymentsPage-BvPe5Q9F-D2gfziwW.js.map → PaymentsPage-CHieGNrn-BnYCtqHd.js.map} +1 -1
- package/dist/{PermissionsModal-CCYkcKlC.js → PermissionsModal-Dxbkkrqe.js} +18 -18
- package/dist/PermissionsModal-Dxbkkrqe.js.map +1 -0
- package/dist/{PickupBatchLinesEditor-DHmcAG23-DL2p6IKJ.js → PickupBatchLinesEditor-QPaqFtUO-CY7BShYh.js} +2 -2
- package/dist/{PickupBatchLinesEditor-DHmcAG23-DL2p6IKJ.js.map → PickupBatchLinesEditor-QPaqFtUO-CY7BShYh.js.map} +1 -1
- package/dist/PickupCreatePage-C7_67u_u-OId8-e2a.js +801 -0
- package/dist/PickupCreatePage-C7_67u_u-OId8-e2a.js.map +1 -0
- package/dist/{PickupsPage-Ctpghavs-CUp4uIZq.js → PickupsPage-BWblMlic-CWkgeBw0.js} +132 -132
- package/dist/PickupsPage-BWblMlic-CWkgeBw0.js.map +1 -0
- package/dist/PmGuard-BvUUbU80-BpYNaDzl.js +641 -0
- package/dist/PmGuard-BvUUbU80-BpYNaDzl.js.map +1 -0
- package/dist/ProductEditPage-Dbq4vUAA-BoBmTPPL.js +1523 -0
- package/dist/ProductEditPage-Dbq4vUAA-BoBmTPPL.js.map +1 -0
- package/dist/{ProductsPage-CupVmOD4-D45a_hf-.js → ProductsPage-BI22nPb4-CQBjnc-n.js} +44 -43
- package/dist/ProductsPage-BI22nPb4-CQBjnc-n.js.map +1 -0
- package/dist/PurchaseCreatePage-C0EK9z4w-BQMTsjE7.js +724 -0
- package/dist/PurchaseCreatePage-C0EK9z4w-BQMTsjE7.js.map +1 -0
- package/dist/{PurchaseRequestDetailPage-Dg_MRY_N-D1bgTEAn.js → PurchaseRequestDetailPage-DhBuOGHZ-CWZPqzt9.js} +428 -418
- package/dist/PurchaseRequestDetailPage-DhBuOGHZ-CWZPqzt9.js.map +1 -0
- package/dist/{PurchaseRequestsPage-DPAPzpmm-mDH2IrTl.js → PurchaseRequestsPage-Bj9HUMxb-B7-AxT8m.js} +65 -65
- package/dist/{PurchaseRequestsPage-DPAPzpmm-mDH2IrTl.js.map → PurchaseRequestsPage-Bj9HUMxb-B7-AxT8m.js.map} +1 -1
- package/dist/{PurchasesPage-It1GHiXl-eH4IsF_U.js → PurchasesPage-Djl1AqD_-DXeYFMrX.js} +55 -55
- package/dist/{PurchasesPage-It1GHiXl-eH4IsF_U.js.map → PurchasesPage-Djl1AqD_-DXeYFMrX.js.map} +1 -1
- package/dist/{RoleManagement-s8iNx2Mu.js → RoleManagement-DVYufwy-.js} +3 -3
- package/dist/{RoleManagement-s8iNx2Mu.js.map → RoleManagement-DVYufwy-.js.map} +1 -1
- package/dist/Roles-BoNGJhtR.js +19 -0
- package/dist/Roles-BoNGJhtR.js.map +1 -0
- package/dist/{SaleCreatePage-C9kFmTvm-B3Y0o4CX.js → SaleCreatePage-DHBLmlBr-BlgjVsq6.js} +39 -39
- package/dist/{SaleCreatePage-C9kFmTvm-B3Y0o4CX.js.map → SaleCreatePage-DHBLmlBr-BlgjVsq6.js.map} +1 -1
- package/dist/{SalesPage-D18DCseD-BxktGDRQ.js → SalesPage-eF9Yr42z-BQ9FlXC3.js} +61 -61
- package/dist/{SalesPage-D18DCseD-BxktGDRQ.js.map → SalesPage-eF9Yr42z-BQ9FlXC3.js.map} +1 -1
- package/dist/SettingsPage-Cre-UE3r-9ntnLYsQ.js +741 -0
- package/dist/SettingsPage-Cre-UE3r-9ntnLYsQ.js.map +1 -0
- package/dist/{ShowFlywayQuery-D1y_4A1u.js → ShowFlywayQuery-DIOUdYfG.js} +26 -19
- package/dist/{ShowFlywayQuery-D1y_4A1u.js.map → ShowFlywayQuery-DIOUdYfG.js.map} +1 -1
- package/dist/{StorageUnitsPage-7EqwuMOI-BwUso1Th.js → StorageUnitsPage-CTEVuemZ-B4osG74N.js} +253 -223
- package/dist/StorageUnitsPage-CTEVuemZ-B4osG74N.js.map +1 -0
- package/dist/{SubMenu-eEDhZUvh.js → SubMenu-OO2zhKiu.js} +5 -3
- package/dist/SubMenu-OO2zhKiu.js.map +1 -0
- package/dist/{TableDetails-BtafRxXb.js → TableDetails-Cc40dEUs.js} +272 -267
- package/dist/TableDetails-Cc40dEUs.js.map +1 -0
- package/dist/{TableList-Dpo6dO7S.js → TableList-B5tX4wII.js} +316 -312
- package/dist/TableList-B5tX4wII.js.map +1 -0
- package/dist/{TransactionsPage-DrH53pVS-BkhIGB6C.js → TransactionsPage-Zuu7sjID-B-ACzvd1.js} +195 -180
- package/dist/TransactionsPage-Zuu7sjID-B-ACzvd1.js.map +1 -0
- package/dist/TransferCreatePage-DlT0nCDj-B2SdPgYB.js +635 -0
- package/dist/TransferCreatePage-DlT0nCDj-B2SdPgYB.js.map +1 -0
- package/dist/TransfersPage-DqaSvHda-G2tFa5Jq.js +600 -0
- package/dist/TransfersPage-DqaSvHda-G2tFa5Jq.js.map +1 -0
- package/dist/TypeConfiguration-EaFiOzRE.js +114 -0
- package/dist/TypeConfiguration-EaFiOzRE.js.map +1 -0
- package/dist/UserList-Cf5B-o_1.js +1904 -0
- package/dist/UserList-Cf5B-o_1.js.map +1 -0
- package/dist/Users-MC7txo1V.js +43 -0
- package/dist/{Users-Bpc4Sazd.js.map → Users-MC7txo1V.js.map} +1 -1
- package/dist/VaccineEducation-T_UE57Ef.js +231 -0
- package/dist/VaccineEducation-T_UE57Ef.js.map +1 -0
- package/dist/VaccineEducation.css +1 -0
- package/dist/VaccineEducationConfigurator-CWc20_rv.js +50948 -0
- package/dist/VaccineEducationConfigurator-CWc20_rv.js.map +1 -0
- package/dist/VaccineEducationConfigurator.css +4 -0
- package/dist/VaccineEducationList-Ok7_5EFb.js +334 -0
- package/dist/VaccineEducationList-Ok7_5EFb.js.map +1 -0
- package/dist/VialsPage-LoDaUqVv-DmMXbK8j.js +457 -0
- package/dist/VialsPage-LoDaUqVv-DmMXbK8j.js.map +1 -0
- package/dist/{constants-ClZJY2x1-MkSWn6TZ.js → constants-BTpJFQe_-CYPZIqQF.js} +166 -56
- package/dist/constants-BTpJFQe_-CYPZIqQF.js.map +1 -0
- package/dist/dashboardLayoutUtils--xUnoKPa.js +615 -0
- package/dist/dashboardLayoutUtils--xUnoKPa.js.map +1 -0
- package/dist/index-mfoqII2U.js +524 -0
- package/dist/index-mfoqII2U.js.map +1 -0
- package/dist/{index-D9YNFPn9.js → index-o8Pyt1Bt.js} +445 -439
- package/dist/index-o8Pyt1Bt.js.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.js +1 -1
- package/dist/index.lib-BySa9-Z-.js +936 -0
- package/dist/index.lib-BySa9-Z-.js.map +1 -0
- package/dist/listValueStore-5d4vNGQM-WclZ5nBG.js +43 -0
- package/dist/listValueStore-5d4vNGQM-WclZ5nBG.js.map +1 -0
- package/package.json +5 -1
- package/dist/AccessRights-xrday-L1.js.map +0 -1
- package/dist/AddMenuConfiguration-e5BVXhmw.js +0 -8547
- package/dist/AddMenuConfiguration-e5BVXhmw.js.map +0 -1
- package/dist/CategoriesPage-BsS5IQh3-B03lWRY5.js.map +0 -1
- package/dist/ConditionConfig-Ddz9halE.js +0 -395
- package/dist/ConditionConfig-Ddz9halE.js.map +0 -1
- package/dist/ConditionConfig.css +0 -1
- package/dist/EntityManagement-CPQL6qBj.js +0 -50
- package/dist/EntityManagement-CPQL6qBj.js.map +0 -1
- package/dist/EventConfig-BmLemzX3.js +0 -26
- package/dist/EventConfigurations-Bzh1qWXU.js +0 -450
- package/dist/EventConfigurations-Bzh1qWXU.js.map +0 -1
- package/dist/EventsExceptionModal-B2SRrnB1.js +0 -200
- package/dist/EventsExceptionModal-B2SRrnB1.js.map +0 -1
- package/dist/EventsSkeleton-BIcPks4T.js +0 -61
- package/dist/EventsSkeleton-BIcPks4T.js.map +0 -1
- package/dist/FacilityPicker-BiZeupmP-CyPHmj6b.js +0 -79
- package/dist/FacilityPicker-BiZeupmP-CyPHmj6b.js.map +0 -1
- package/dist/FeatureMenu-DYJmDt7q.js.map +0 -1
- package/dist/GrantPermissionModal-BDN66Atn.js.map +0 -1
- package/dist/ImmunizationConfigurationBase-Di1KO3oW.js +0 -7639
- package/dist/ImmunizationConfigurationBase-Di1KO3oW.js.map +0 -1
- package/dist/InventoryPage-C_AxSy7A-QLvlL4rE.js +0 -665
- package/dist/InventoryPage-C_AxSy7A-QLvlL4rE.js.map +0 -1
- package/dist/ManageDynamicFeature-BU0I45dd.js.map +0 -1
- package/dist/ManageEventConfiguration-CoYcpjR9.js +0 -1085
- package/dist/ManageEventConfiguration-CoYcpjR9.js.map +0 -1
- package/dist/ManageRole-CNZBRKGU.js +0 -776
- package/dist/ManageRole-CNZBRKGU.js.map +0 -1
- package/dist/MobileAnalytics-pQoE8cG1.js +0 -16888
- package/dist/MobileAnalytics-pQoE8cG1.js.map +0 -1
- package/dist/MobileMenuManagement-Cf8IZlla.js +0 -108
- package/dist/MobileMenuManagement-Cf8IZlla.js.map +0 -1
- package/dist/MobileTypeEventConfigModal-BeveaX0C.js +0 -783
- package/dist/MobileTypeEventConfigModal-BeveaX0C.js.map +0 -1
- package/dist/NewServerManagement-Cxe0dV0O.js.map +0 -1
- package/dist/OtherTypeEventConfigModal-CM6VkdmY.js +0 -2046
- package/dist/OtherTypeEventConfigModal-CM6VkdmY.js.map +0 -1
- package/dist/PermissionsModal-CCYkcKlC.js.map +0 -1
- package/dist/PickupCreatePage-CB0Sl0Hb-Mmj7zESG.js +0 -783
- package/dist/PickupCreatePage-CB0Sl0Hb-Mmj7zESG.js.map +0 -1
- package/dist/PickupsPage-Ctpghavs-CUp4uIZq.js.map +0 -1
- package/dist/PmGuard-b10TGXEi-G3N0G_Wg.js +0 -599
- package/dist/PmGuard-b10TGXEi-G3N0G_Wg.js.map +0 -1
- package/dist/ProductEditPage-C1thoKHu-URQaZ6st.js +0 -1302
- package/dist/ProductEditPage-C1thoKHu-URQaZ6st.js.map +0 -1
- package/dist/ProductsPage-CupVmOD4-D45a_hf-.js.map +0 -1
- package/dist/PurchaseCreatePage-YD3NmhPQ-2j4etSjM.js +0 -648
- package/dist/PurchaseCreatePage-YD3NmhPQ-2j4etSjM.js.map +0 -1
- package/dist/PurchaseRequestDetailPage-Dg_MRY_N-D1bgTEAn.js.map +0 -1
- package/dist/Roles-BIyiic67.js +0 -14
- package/dist/Roles-BIyiic67.js.map +0 -1
- package/dist/SettingsPage-VsxI-ano-DcmtUUEj.js +0 -747
- package/dist/SettingsPage-VsxI-ano-DcmtUUEj.js.map +0 -1
- package/dist/StorageUnitsPage-7EqwuMOI-BwUso1Th.js.map +0 -1
- package/dist/SubMenu-eEDhZUvh.js.map +0 -1
- package/dist/TableDetails-BtafRxXb.js.map +0 -1
- package/dist/TableList-Dpo6dO7S.js.map +0 -1
- package/dist/TransactionsPage-DrH53pVS-BkhIGB6C.js.map +0 -1
- package/dist/TransferCreatePage-CuvoMrYH-DTTfHjz-.js +0 -315
- package/dist/TransferCreatePage-CuvoMrYH-DTTfHjz-.js.map +0 -1
- package/dist/TransfersPage-Cf701t8s-BBbN7cBf.js +0 -476
- package/dist/TransfersPage-Cf701t8s-BBbN7cBf.js.map +0 -1
- package/dist/TypeConfiguration-3O6ABrK-.js +0 -117
- package/dist/TypeConfiguration-3O6ABrK-.js.map +0 -1
- package/dist/UserList-DgPxsnj2.js +0 -1129
- package/dist/UserList-DgPxsnj2.js.map +0 -1
- package/dist/Users-Bpc4Sazd.js +0 -41
- package/dist/VialsPage-8oAc1yFv-Cl3FUXBJ.js +0 -321
- package/dist/VialsPage-8oAc1yFv-Cl3FUXBJ.js.map +0 -1
- package/dist/constants-ClZJY2x1-MkSWn6TZ.js.map +0 -1
- package/dist/dashboardLayoutUtils-D1xCAxp3.js +0 -405
- package/dist/dashboardLayoutUtils-D1xCAxp3.js.map +0 -1
- package/dist/index-D9YNFPn9.js.map +0 -1
- package/dist/index.lib-Dn8PMkeD.js +0 -862
- package/dist/index.lib-Dn8PMkeD.js.map +0 -1
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { jsxs as t, jsx as e, Fragment as D } from "react/jsx-runtime";
|
|
2
|
+
import { useState as h, useEffect as A, useMemo as se } from "react";
|
|
3
|
+
import { useNavigate as oe } from "react-router";
|
|
4
|
+
import i from "prop-types";
|
|
5
|
+
import { Dialog as ce, DialogTitle as re, Typography as d, DialogContent as le, TextField as j, InputAdornment as M, Box as n, Button as V, Card as P, Skeleton as b, Pagination as de, Select as ue, MenuItem as he, Tooltip as me, IconButton as pe } from "@mui/material";
|
|
6
|
+
import { FontAwesomeIcon as m } from "@fortawesome/react-fontawesome";
|
|
7
|
+
import { faSearch as B, faChevronRight as G, faShieldHalved as ve, faPlus as ge, faFileLines as fe, faClock as U, faBan as H, faCircleCheck as xe, faSyringe as ye, faPen as Ne } from "@fortawesome/free-solid-svg-icons";
|
|
8
|
+
import { getAssignedFeatures as be } from "@/utils/feature";
|
|
9
|
+
import Ce from "@/common/services/util/GeneralUtil.js";
|
|
10
|
+
import { l as J, c as W, a as we, S as Se } from "./VaccineEducation-T_UE57Ef.js";
|
|
11
|
+
function Q({ open: s, onClose: o, onStarted: p }) {
|
|
12
|
+
const [c, v] = h([]), [r, x] = h("");
|
|
13
|
+
A(() => {
|
|
14
|
+
s && (x(""), J().then(v));
|
|
15
|
+
}, [s]);
|
|
16
|
+
const g = c.filter((l) => l.name.toLowerCase().includes(r.toLowerCase())), C = (l) => {
|
|
17
|
+
p(l.id);
|
|
18
|
+
};
|
|
19
|
+
return /* @__PURE__ */ t(ce, { open: s, onClose: o, maxWidth: "sm", fullWidth: !0, children: [
|
|
20
|
+
/* @__PURE__ */ t(re, { children: [
|
|
21
|
+
"Add Vaccine Education",
|
|
22
|
+
/* @__PURE__ */ e(d, { variant: "body2", sx: { color: "text.secondary", fontWeight: 400, mt: 0.5 }, children: "Choose a configured vaccine that doesn't have education content yet." })
|
|
23
|
+
] }),
|
|
24
|
+
/* @__PURE__ */ t(le, { dividers: !0, children: [
|
|
25
|
+
/* @__PURE__ */ e(
|
|
26
|
+
j,
|
|
27
|
+
{
|
|
28
|
+
size: "small",
|
|
29
|
+
fullWidth: !0,
|
|
30
|
+
autoFocus: !0,
|
|
31
|
+
placeholder: "Search vaccines…",
|
|
32
|
+
value: r,
|
|
33
|
+
onChange: (l) => x(l.target.value),
|
|
34
|
+
InputProps: {
|
|
35
|
+
startAdornment: /* @__PURE__ */ e(M, { position: "start", children: /* @__PURE__ */ e(m, { icon: B, size: "xs" }) })
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
),
|
|
39
|
+
/* @__PURE__ */ t(n, { sx: { display: "flex", flexDirection: "column", gap: 1, mt: 1.5 }, children: [
|
|
40
|
+
g.length === 0 && /* @__PURE__ */ e(d, { variant: "body2", sx: { color: "text.secondary", textAlign: "center", py: 3 }, children: c.length === 0 ? "Every configured vaccine already has education content." : `No vaccines match "${r}".` }),
|
|
41
|
+
g.map((l) => /* @__PURE__ */ t(
|
|
42
|
+
n,
|
|
43
|
+
{
|
|
44
|
+
onClick: () => C(l),
|
|
45
|
+
role: "button",
|
|
46
|
+
tabIndex: 0,
|
|
47
|
+
sx: {
|
|
48
|
+
display: "flex",
|
|
49
|
+
justifyContent: "space-between",
|
|
50
|
+
alignItems: "center",
|
|
51
|
+
gap: 1.5,
|
|
52
|
+
p: 1.25,
|
|
53
|
+
border: "1px solid var(--color-gray3)",
|
|
54
|
+
borderRadius: "8px",
|
|
55
|
+
cursor: "pointer",
|
|
56
|
+
"&:hover": { borderColor: "var(--ve-accent)", background: "var(--ve-accent-soft)" }
|
|
57
|
+
},
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ t(n, { children: [
|
|
60
|
+
/* @__PURE__ */ e(d, { variant: "body2", sx: { fontWeight: 600 }, children: l.name }),
|
|
61
|
+
/* @__PURE__ */ e(d, { variant: "caption", sx: { color: "text.secondary" }, children: l.category })
|
|
62
|
+
] }),
|
|
63
|
+
/* @__PURE__ */ e(m, { icon: G, size: "xs", style: { color: "var(--color-gray2)" } })
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
l.id
|
|
67
|
+
))
|
|
68
|
+
] })
|
|
69
|
+
] })
|
|
70
|
+
] });
|
|
71
|
+
}
|
|
72
|
+
Q.propTypes = {
|
|
73
|
+
open: i.bool.isRequired,
|
|
74
|
+
onClose: i.func.isRequired,
|
|
75
|
+
onStarted: i.func.isRequired
|
|
76
|
+
};
|
|
77
|
+
const Re = "techo.manage.immunizationConfiguration", Ee = "update.admin.immunizationConfiguration.vaccineEducation", O = Se.length, _ = [10, 25, 50], z = (s) => s === 0 ? { key: "empty", label: "Not started", className: "is-empty", icon: H } : s >= O ? { key: "complete", label: "Complete", className: "is-complete", icon: xe } : { key: "partial", label: "In progress", className: "is-partial", icon: U }, ke = (s) => {
|
|
78
|
+
if (!s) return null;
|
|
79
|
+
const o = new Date(s);
|
|
80
|
+
if (Number.isNaN(o.getTime())) return null;
|
|
81
|
+
const p = o.toLocaleDateString(void 0, { day: "numeric", month: "short", year: "numeric" }), c = o.toLocaleTimeString(void 0, { hour: "numeric", minute: "2-digit" });
|
|
82
|
+
return `${p} · ${c}`;
|
|
83
|
+
};
|
|
84
|
+
function Fe() {
|
|
85
|
+
const s = oe(), [o, p] = h([]), [c, v] = h(""), [r, x] = h(!0), [g, C] = h(!1), [l, X] = h(null), [w, L] = h(1), [y, Y] = h(_[0]), [f, k] = h(null), [T, $] = h(null), Z = async () => {
|
|
86
|
+
x(!0);
|
|
87
|
+
const [a, u] = await Promise.all([
|
|
88
|
+
we(),
|
|
89
|
+
be(Re)
|
|
90
|
+
]);
|
|
91
|
+
p(a), X(JSON.parse((u == null ? void 0 : u.data) || "{}")), x(!1), J().then((N) => $(N.length)).catch(() => $(null));
|
|
92
|
+
};
|
|
93
|
+
A(() => {
|
|
94
|
+
Z();
|
|
95
|
+
}, []);
|
|
96
|
+
const I = se(
|
|
97
|
+
() => o.filter((a) => {
|
|
98
|
+
var u, N;
|
|
99
|
+
return (N = (u = a.vaccine) == null ? void 0 : u.name) == null ? void 0 : N.toLowerCase().includes(c.toLowerCase());
|
|
100
|
+
}).filter((a) => !f || z(W(a.record)).key === f),
|
|
101
|
+
[o, c, f]
|
|
102
|
+
);
|
|
103
|
+
A(() => {
|
|
104
|
+
L(1);
|
|
105
|
+
}, [c, y, f, o.length]);
|
|
106
|
+
const S = I.length, ee = Math.max(1, Math.ceil(S / y)), te = I.slice((w - 1) * y, w * y), ae = S === 0 ? 0 : (w - 1) * y + 1, ne = Math.min(S, w * y), R = Ce.hasCheckRights(l == null ? void 0 : l[Ee]), q = o.reduce((a, { record: u }) => {
|
|
107
|
+
const N = z(W(u)).key;
|
|
108
|
+
return a[N] = (a[N] || 0) + 1, a;
|
|
109
|
+
}, {}), F = q.complete || 0, ie = q.partial || 0;
|
|
110
|
+
return /* @__PURE__ */ t(n, { className: "ve-list-page", children: [
|
|
111
|
+
/* @__PURE__ */ t(n, { sx: { display: "flex", justifyContent: "space-between", alignItems: "flex-start", gap: 2, mb: 3, flexWrap: "wrap" }, children: [
|
|
112
|
+
/* @__PURE__ */ t(n, { sx: { display: "flex", gap: 2, alignItems: "flex-start" }, children: [
|
|
113
|
+
/* @__PURE__ */ e(n, { className: "ve-header-icon", children: /* @__PURE__ */ e(m, { icon: ve }) }),
|
|
114
|
+
/* @__PURE__ */ t(n, { children: [
|
|
115
|
+
/* @__PURE__ */ e(d, { variant: "h5", sx: { fontWeight: 700, mb: 0.5 }, children: "Vaccine Education" }),
|
|
116
|
+
/* @__PURE__ */ e(d, { variant: "body2", sx: { color: "text.secondary", maxWidth: "62ch" }, children: "Write the education content stored against each vaccine — overview, safety guidance, FAQs, images and videos." })
|
|
117
|
+
] })
|
|
118
|
+
] }),
|
|
119
|
+
R && /* @__PURE__ */ e(
|
|
120
|
+
V,
|
|
121
|
+
{
|
|
122
|
+
variant: "contained",
|
|
123
|
+
className: "normal-case",
|
|
124
|
+
startIcon: /* @__PURE__ */ e(m, { icon: ge }),
|
|
125
|
+
onClick: () => C(!0),
|
|
126
|
+
"data-testid": "vaccineEducation-button-add",
|
|
127
|
+
children: "Add Vaccine Education"
|
|
128
|
+
}
|
|
129
|
+
)
|
|
130
|
+
] }),
|
|
131
|
+
!r && o.length > 0 && /* @__PURE__ */ t(n, { className: "ve-stat-strip", children: [
|
|
132
|
+
/* @__PURE__ */ e(
|
|
133
|
+
E,
|
|
134
|
+
{
|
|
135
|
+
value: F,
|
|
136
|
+
label: F === 1 ? "vaccine fully written" : "vaccines fully written",
|
|
137
|
+
tone: "complete",
|
|
138
|
+
icon: fe,
|
|
139
|
+
active: f === "complete",
|
|
140
|
+
onClick: () => k((a) => a === "complete" ? null : "complete")
|
|
141
|
+
}
|
|
142
|
+
),
|
|
143
|
+
/* @__PURE__ */ e(
|
|
144
|
+
E,
|
|
145
|
+
{
|
|
146
|
+
value: ie,
|
|
147
|
+
label: "still in progress",
|
|
148
|
+
tone: "partial",
|
|
149
|
+
icon: U,
|
|
150
|
+
active: f === "partial",
|
|
151
|
+
onClick: () => k((a) => a === "partial" ? null : "partial")
|
|
152
|
+
}
|
|
153
|
+
),
|
|
154
|
+
/* @__PURE__ */ e(
|
|
155
|
+
E,
|
|
156
|
+
{
|
|
157
|
+
value: T === null ? "—" : T,
|
|
158
|
+
label: T === 1 ? "vaccine with no content yet" : "vaccines with no content yet",
|
|
159
|
+
tone: "empty",
|
|
160
|
+
icon: H,
|
|
161
|
+
onClick: R ? () => C(!0) : void 0
|
|
162
|
+
}
|
|
163
|
+
)
|
|
164
|
+
] }),
|
|
165
|
+
/* @__PURE__ */ t(n, { sx: { display: "flex", alignItems: "center", gap: 1.5, mb: 2, flexWrap: "wrap" }, children: [
|
|
166
|
+
/* @__PURE__ */ e(
|
|
167
|
+
j,
|
|
168
|
+
{
|
|
169
|
+
size: "small",
|
|
170
|
+
placeholder: "Search vaccine name…",
|
|
171
|
+
value: c,
|
|
172
|
+
onChange: (a) => v(a.target.value),
|
|
173
|
+
sx: { minWidth: 260, maxWidth: 360, background: "var(--color-background)" },
|
|
174
|
+
InputProps: {
|
|
175
|
+
startAdornment: /* @__PURE__ */ e(M, { position: "start", children: /* @__PURE__ */ e(m, { icon: B, size: "xs" }) })
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
),
|
|
179
|
+
f && /* @__PURE__ */ t("span", { className: "ve-filter-chip", children: [
|
|
180
|
+
f === "complete" ? "Complete" : "In progress",
|
|
181
|
+
" only",
|
|
182
|
+
/* @__PURE__ */ e("button", { type: "button", onClick: () => k(null), "aria-label": "Clear filter", children: "×" })
|
|
183
|
+
] })
|
|
184
|
+
] }),
|
|
185
|
+
r ? /* @__PURE__ */ e(P, { className: "ve-list-table", variant: "outlined", children: [1, 2, 3].map((a) => /* @__PURE__ */ t(n, { className: "ve-list-row", children: [
|
|
186
|
+
/* @__PURE__ */ e(b, { variant: "rounded", width: 40, height: 40, sx: { borderRadius: "11px", flexShrink: 0 } }),
|
|
187
|
+
/* @__PURE__ */ t(n, { children: [
|
|
188
|
+
/* @__PURE__ */ e(b, { width: "55%", height: 18 }),
|
|
189
|
+
/* @__PURE__ */ e(b, { width: "35%", height: 14 })
|
|
190
|
+
] }),
|
|
191
|
+
/* @__PURE__ */ e(b, { height: 14 }),
|
|
192
|
+
/* @__PURE__ */ e(b, { variant: "rounded", height: 20, sx: { borderRadius: "999px" } }),
|
|
193
|
+
/* @__PURE__ */ e(b, { height: 14 }),
|
|
194
|
+
/* @__PURE__ */ e(b, { variant: "rounded", height: 32, sx: { borderRadius: "8px" } })
|
|
195
|
+
] }, a)) }) : I.length === 0 ? /* @__PURE__ */ t(P, { sx: { p: 6, textAlign: "center", boxShadow: "none", border: "1px solid var(--color-gray3)" }, children: [
|
|
196
|
+
/* @__PURE__ */ e(d, { variant: "subtitle1", sx: { fontWeight: 600, mb: 1 }, children: o.length === 0 ? "No vaccine education configured yet" : c ? `No vaccines match "${c}"` : "No vaccines match this filter" }),
|
|
197
|
+
o.length === 0 && /* @__PURE__ */ t(D, { children: [
|
|
198
|
+
/* @__PURE__ */ e(d, { variant: "body2", sx: { color: "text.secondary", mb: 2 }, children: "Add education content for a vaccine to get started." }),
|
|
199
|
+
R && /* @__PURE__ */ e(V, { variant: "contained", className: "normal-case", onClick: () => C(!0), children: "Add Vaccine Education" })
|
|
200
|
+
] })
|
|
201
|
+
] }) : /* @__PURE__ */ t(D, { children: [
|
|
202
|
+
/* @__PURE__ */ t(P, { className: "ve-list-table", variant: "outlined", children: [
|
|
203
|
+
/* @__PURE__ */ t(n, { className: "ve-list-head", children: [
|
|
204
|
+
/* @__PURE__ */ e("span", { className: "ve-list-head-vaccine", children: "Vaccine" }),
|
|
205
|
+
/* @__PURE__ */ e("span", { className: "ve-list-head-progress", children: "Completeness" }),
|
|
206
|
+
/* @__PURE__ */ e("span", { className: "ve-list-head-status", children: "Status" }),
|
|
207
|
+
/* @__PURE__ */ e("span", { className: "ve-list-head-updated", children: "Last updated" }),
|
|
208
|
+
/* @__PURE__ */ e("span", { className: "ve-list-head-actions", children: "Actions" })
|
|
209
|
+
] }),
|
|
210
|
+
te.map(({ vaccine: a, record: u }) => /* @__PURE__ */ e(K, { vaccine: a, record: u, navigate: s, canEdit: R }, a.id))
|
|
211
|
+
] }),
|
|
212
|
+
/* @__PURE__ */ t(n, { className: "ve-list-footer", children: [
|
|
213
|
+
/* @__PURE__ */ t(d, { variant: "body2", className: "ve-list-footer-count", children: [
|
|
214
|
+
"Showing ",
|
|
215
|
+
ae,
|
|
216
|
+
" to ",
|
|
217
|
+
ne,
|
|
218
|
+
" of ",
|
|
219
|
+
S,
|
|
220
|
+
" results"
|
|
221
|
+
] }),
|
|
222
|
+
/* @__PURE__ */ e(
|
|
223
|
+
de,
|
|
224
|
+
{
|
|
225
|
+
page: w,
|
|
226
|
+
count: ee,
|
|
227
|
+
onChange: (a, u) => L(u),
|
|
228
|
+
shape: "rounded",
|
|
229
|
+
size: "small",
|
|
230
|
+
className: "ve-list-pagination"
|
|
231
|
+
}
|
|
232
|
+
),
|
|
233
|
+
/* @__PURE__ */ e(
|
|
234
|
+
ue,
|
|
235
|
+
{
|
|
236
|
+
size: "small",
|
|
237
|
+
value: y,
|
|
238
|
+
onChange: (a) => Y(Number(a.target.value)),
|
|
239
|
+
className: "ve-list-rows-select",
|
|
240
|
+
children: _.map((a) => /* @__PURE__ */ t(he, { value: a, children: [
|
|
241
|
+
a,
|
|
242
|
+
" / page"
|
|
243
|
+
] }, a))
|
|
244
|
+
}
|
|
245
|
+
)
|
|
246
|
+
] })
|
|
247
|
+
] }),
|
|
248
|
+
/* @__PURE__ */ e(
|
|
249
|
+
Q,
|
|
250
|
+
{
|
|
251
|
+
open: g,
|
|
252
|
+
onClose: () => C(!1),
|
|
253
|
+
onStarted: (a) => s(`/ui/medplat/manage/vaccineEducation/${a}`)
|
|
254
|
+
}
|
|
255
|
+
)
|
|
256
|
+
] });
|
|
257
|
+
}
|
|
258
|
+
function K({ vaccine: s, record: o, navigate: p, canEdit: c }) {
|
|
259
|
+
const v = W(o), r = Math.round(v / O * 100), x = ke(o.updatedOn), g = z(v);
|
|
260
|
+
return /* @__PURE__ */ t(n, { className: "ve-list-row", children: [
|
|
261
|
+
/* @__PURE__ */ e(n, { className: "ve-list-avatar", children: /* @__PURE__ */ e(m, { icon: ye }) }),
|
|
262
|
+
/* @__PURE__ */ t(n, { className: "ve-list-vaccine", children: [
|
|
263
|
+
/* @__PURE__ */ e(d, { sx: { fontWeight: 700, fontSize: 14 }, children: s.name }),
|
|
264
|
+
/* @__PURE__ */ e(d, { variant: "caption", sx: { color: "text.secondary" }, children: s.category || "—" })
|
|
265
|
+
] }),
|
|
266
|
+
/* @__PURE__ */ t(n, { className: "ve-list-progress", children: [
|
|
267
|
+
/* @__PURE__ */ t(d, { variant: "caption", className: "ve-list-progress-label", children: [
|
|
268
|
+
v,
|
|
269
|
+
"/",
|
|
270
|
+
O
|
|
271
|
+
] }),
|
|
272
|
+
/* @__PURE__ */ e(n, { className: "ve-progress-track", children: /* @__PURE__ */ e(n, { className: `ve-progress-fill ${g.className}`, sx: { width: `${r}%` } }) }),
|
|
273
|
+
/* @__PURE__ */ t(d, { variant: "caption", className: "ve-list-progress-pct", children: [
|
|
274
|
+
r,
|
|
275
|
+
"%"
|
|
276
|
+
] })
|
|
277
|
+
] }),
|
|
278
|
+
/* @__PURE__ */ e(n, { className: "ve-list-status", children: /* @__PURE__ */ t("span", { className: `ve-status-pill ${g.className}`, children: [
|
|
279
|
+
/* @__PURE__ */ e(m, { icon: g.icon }),
|
|
280
|
+
g.label
|
|
281
|
+
] }) }),
|
|
282
|
+
/* @__PURE__ */ e(n, { className: "ve-list-updated", children: x || /* @__PURE__ */ e("span", { className: "ve-list-updated-empty", children: "—" }) }),
|
|
283
|
+
/* @__PURE__ */ e(n, { className: "ve-list-actions", children: c && /* @__PURE__ */ e(me, { title: "Edit", arrow: !0, children: /* @__PURE__ */ e(
|
|
284
|
+
pe,
|
|
285
|
+
{
|
|
286
|
+
size: "small",
|
|
287
|
+
className: "ve-list-icon-btn",
|
|
288
|
+
onClick: () => p(`/ui/medplat/manage/vaccineEducation/${s.id}`),
|
|
289
|
+
children: /* @__PURE__ */ e(m, { icon: Ne, size: "xs" })
|
|
290
|
+
}
|
|
291
|
+
) }) })
|
|
292
|
+
] });
|
|
293
|
+
}
|
|
294
|
+
function E({ value: s, label: o, tone: p, icon: c, active: v, onClick: r }) {
|
|
295
|
+
return /* @__PURE__ */ t(
|
|
296
|
+
n,
|
|
297
|
+
{
|
|
298
|
+
className: `ve-stat-tile tone-${p} ${v ? "is-active" : ""} ${r ? "is-clickable" : ""}`,
|
|
299
|
+
onClick: r,
|
|
300
|
+
role: r ? "button" : void 0,
|
|
301
|
+
tabIndex: r ? 0 : void 0,
|
|
302
|
+
children: [
|
|
303
|
+
/* @__PURE__ */ e(n, { className: "ve-stat-icon", children: /* @__PURE__ */ e(m, { icon: c }) }),
|
|
304
|
+
/* @__PURE__ */ t(n, { sx: { flex: 1, minWidth: 0 }, children: [
|
|
305
|
+
/* @__PURE__ */ e("span", { className: "ve-stat-value", children: s }),
|
|
306
|
+
/* @__PURE__ */ e("span", { className: "ve-stat-label", children: o })
|
|
307
|
+
] }),
|
|
308
|
+
r && /* @__PURE__ */ e(m, { icon: G, className: "ve-stat-chevron" })
|
|
309
|
+
]
|
|
310
|
+
}
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
E.propTypes = {
|
|
314
|
+
value: i.oneOfType([i.number, i.string]).isRequired,
|
|
315
|
+
label: i.string.isRequired,
|
|
316
|
+
tone: i.oneOf(["complete", "partial", "empty"]).isRequired,
|
|
317
|
+
icon: i.object.isRequired,
|
|
318
|
+
active: i.bool,
|
|
319
|
+
onClick: i.func
|
|
320
|
+
};
|
|
321
|
+
K.propTypes = {
|
|
322
|
+
vaccine: i.shape({
|
|
323
|
+
id: i.oneOfType([i.string, i.number]).isRequired,
|
|
324
|
+
name: i.string,
|
|
325
|
+
category: i.string
|
|
326
|
+
}).isRequired,
|
|
327
|
+
record: i.object.isRequired,
|
|
328
|
+
navigate: i.func.isRequired,
|
|
329
|
+
canEdit: i.bool
|
|
330
|
+
};
|
|
331
|
+
export {
|
|
332
|
+
Fe as default
|
|
333
|
+
};
|
|
334
|
+
//# sourceMappingURL=VaccineEducationList-Ok7_5EFb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VaccineEducationList-Ok7_5EFb.js","sources":["../src/views/VaccineEducation/components/AddVaccineEducationDialog.jsx","../src/views/VaccineEducation/components/VaccineEducationList.jsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n Box,\n TextField,\n InputAdornment,\n Typography,\n} from \"@mui/material\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faSearch, faChevronRight } from \"@fortawesome/free-solid-svg-icons\";\nimport { listVaccinesWithoutEducation } from \"../services/vaccineEducationService\";\n\nexport default function AddVaccineEducationDialog({ open, onClose, onStarted }) {\n const [vaccines, setVaccines] = useState([]);\n const [search, setSearch] = useState(\"\");\n\n useEffect(() => {\n if (!open) return;\n setSearch(\"\");\n listVaccinesWithoutEducation().then(setVaccines);\n }, [open]);\n\n const filtered = vaccines.filter((v) => v.name.toLowerCase().includes(search.toLowerCase()));\n\n // No DB write here — picking a vaccine just opens the configurator against it.\n // FETCH_VACCINE_EDUCATION's LEFT JOIN already returns an empty record for a\n // vaccine with no row yet, and the first real INSERT only happens on Save.\n const handlePick = (vaccine) => {\n onStarted(vaccine.id);\n };\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>\n Add Vaccine Education\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", fontWeight: 400, mt: 0.5 }}>\n Choose a configured vaccine that doesn't have education content yet.\n </Typography>\n </DialogTitle>\n <DialogContent dividers>\n <TextField\n size=\"small\"\n fullWidth\n autoFocus\n placeholder=\"Search vaccines…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <FontAwesomeIcon icon={faSearch} size=\"xs\" />\n </InputAdornment>\n ),\n }}\n />\n\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 1, mt: 1.5 }}>\n {filtered.length === 0 && (\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", textAlign: \"center\", py: 3 }}>\n {vaccines.length === 0\n ? \"Every configured vaccine already has education content.\"\n : `No vaccines match \"${search}\".`}\n </Typography>\n )}\n {filtered.map((vaccine) => (\n <Box\n key={vaccine.id}\n onClick={() => handlePick(vaccine)}\n role=\"button\"\n tabIndex={0}\n sx={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: 1.5,\n p: 1.25,\n border: \"1px solid var(--color-gray3)\",\n borderRadius: \"8px\",\n cursor: \"pointer\",\n \"&:hover\": { borderColor: \"var(--ve-accent)\", background: \"var(--ve-accent-soft)\" },\n }}\n >\n <Box>\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>\n {vaccine.name}\n </Typography>\n <Typography variant=\"caption\" sx={{ color: \"text.secondary\" }}>\n {vaccine.category}\n </Typography>\n </Box>\n <FontAwesomeIcon icon={faChevronRight} size=\"xs\" style={{ color: \"var(--color-gray2)\" }} />\n </Box>\n ))}\n </Box>\n </DialogContent>\n </Dialog>\n );\n}\n\nAddVaccineEducationDialog.propTypes = {\n open: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n onStarted: PropTypes.func.isRequired,\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport PropTypes from \"prop-types\";\nimport {\n Box,\n Typography,\n TextField,\n InputAdornment,\n Button,\n Card,\n Skeleton,\n Pagination,\n Select,\n MenuItem,\n IconButton,\n Tooltip,\n} from \"@mui/material\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n faSearch,\n faPlus,\n faPen,\n faSyringe,\n faShieldHalved,\n faFileLines,\n faClock,\n faBan,\n faCircleCheck,\n faChevronRight,\n} from \"@fortawesome/free-solid-svg-icons\";\nimport { getAssignedFeatures } from \"@/utils/feature\";\nimport GeneralUtil from \"@/common/services/util/GeneralUtil.js\";\nimport { listEducationRecords, listVaccinesWithoutEducation } from \"../services/vaccineEducationService\";\nimport { countCompletedSections, SECTION_DEFS } from \"../constants/sectionDefs\";\nimport AddVaccineEducationDialog from \"./AddVaccineEducationDialog\";\nimport \"../styles/VaccineEducation.scss\";\n\n// Same feature as Immunization Configuration (ImmunizationSummary.jsx) — not a\n// separate registration. The entry button there is already gated by\n// view.admin.immunizationConfiguration.vaccineEducation; this is the same feature's\n// update right, gating Add/Edit once you're actually on this screen.\nconst FEATURE_CODE = \"techo.manage.immunizationConfiguration\";\nconst EDIT_RIGHT = \"update.admin.immunizationConfiguration.vaccineEducation\";\n\nconst TOTAL_SECTIONS = SECTION_DEFS.length;\nconst ROWS_PER_PAGE_OPTIONS = [10, 25, 50];\n\nconst statusOf = (completed) => {\n if (completed === 0) return { key: \"empty\", label: \"Not started\", className: \"is-empty\", icon: faBan };\n if (completed >= TOTAL_SECTIONS) {\n return { key: \"complete\", label: \"Complete\", className: \"is-complete\", icon: faCircleCheck };\n }\n return { key: \"partial\", label: \"In progress\", className: \"is-partial\", icon: faClock };\n};\n\nconst formatUpdatedOn = (value) => {\n if (!value) return null;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n const datePart = date.toLocaleDateString(undefined, { day: \"numeric\", month: \"short\", year: \"numeric\" });\n const timePart = date.toLocaleTimeString(undefined, { hour: \"numeric\", minute: \"2-digit\" });\n return `${datePart} · ${timePart}`;\n};\n\nexport default function VaccineEducationList() {\n const navigate = useNavigate();\n const [rows, setRows] = useState([]);\n const [search, setSearch] = useState(\"\");\n const [isLoading, setIsLoading] = useState(true);\n const [addOpen, setAddOpen] = useState(false);\n const [rights, setRights] = useState(null);\n const [page, setPage] = useState(1);\n const [rowsPerPage, setRowsPerPage] = useState(ROWS_PER_PAGE_OPTIONS[0]);\n // \"complete\" | \"partial\" | null — set by clicking the matching stat tile below.\n // There's no \"empty\" option here: those vaccines have no row in this table at all,\n // so that tile opens the Add dialog instead of filtering to nothing.\n const [statusFilter, setStatusFilter] = useState(null);\n // Vaccines that exist in Immunization Configuration but have no education record at\n // all — the actual remaining work, which the table itself can't show since those\n // vaccines have no row here yet.\n const [notStartedCount, setNotStartedCount] = useState(null);\n\n const load = async () => {\n setIsLoading(true);\n const [data, assignedFeatures] = await Promise.all([\n listEducationRecords(),\n getAssignedFeatures(FEATURE_CODE),\n ]);\n setRows(data);\n setRights(JSON.parse(assignedFeatures?.data || \"{}\"));\n setIsLoading(false);\n listVaccinesWithoutEducation()\n .then((pending) => setNotStartedCount(pending.length))\n .catch(() => setNotStartedCount(null));\n };\n\n useEffect(() => {\n load();\n }, []);\n\n const filteredRows = useMemo(\n () =>\n rows\n .filter((r) => r.vaccine?.name?.toLowerCase().includes(search.toLowerCase()))\n .filter((r) => !statusFilter || statusOf(countCompletedSections(r.record)).key === statusFilter),\n [rows, search, statusFilter],\n );\n\n // Reset to page 1 whenever the result set changes shape, so a stale page number\n // can't leave the list showing an out-of-range (empty-looking) slice.\n useEffect(() => {\n setPage(1);\n }, [search, rowsPerPage, statusFilter, rows.length]);\n\n const totalResults = filteredRows.length;\n const totalPages = Math.max(1, Math.ceil(totalResults / rowsPerPage));\n const pagedRows = filteredRows.slice((page - 1) * rowsPerPage, page * rowsPerPage);\n const rangeFrom = totalResults === 0 ? 0 : (page - 1) * rowsPerPage + 1;\n const rangeTo = Math.min(totalResults, page * rowsPerPage);\n\n const canEdit = GeneralUtil.hasCheckRights(rights?.[EDIT_RIGHT]);\n\n // Same statusOf() the filter itself uses — computing these independently (e.g.\n // inProgress = total - complete) previously miscounted \"not started\" (0/12) rows as\n // \"in progress\", so a tile's own count didn't match what clicking it actually filtered to.\n const rowStatusCounts = rows.reduce((acc, { record }) => {\n const key = statusOf(countCompletedSections(record)).key;\n acc[key] = (acc[key] || 0) + 1;\n return acc;\n }, {});\n const completeCount = rowStatusCounts.complete || 0;\n const inProgressCount = rowStatusCounts.partial || 0;\n\n return (\n <Box className=\"ve-list-page\">\n <Box sx={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\", gap: 2, mb: 3, flexWrap: \"wrap\" }}>\n <Box sx={{ display: \"flex\", gap: 2, alignItems: \"flex-start\" }}>\n <Box className=\"ve-header-icon\">\n <FontAwesomeIcon icon={faShieldHalved} />\n </Box>\n <Box>\n <Typography variant=\"h5\" sx={{ fontWeight: 700, mb: 0.5 }}>\n Vaccine Education\n </Typography>\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", maxWidth: \"62ch\" }}>\n Write the education content stored against each vaccine — overview, safety\n guidance, FAQs, images and videos.\n </Typography>\n </Box>\n </Box>\n {canEdit && (\n <Button\n variant=\"contained\"\n className=\"normal-case\"\n startIcon={<FontAwesomeIcon icon={faPlus} />}\n onClick={() => setAddOpen(true)}\n data-testid=\"vaccineEducation-button-add\"\n >\n Add Vaccine Education\n </Button>\n )}\n </Box>\n\n {!isLoading && rows.length > 0 && (\n <Box className=\"ve-stat-strip\">\n <StatTile\n value={completeCount}\n label={completeCount === 1 ? \"vaccine fully written\" : \"vaccines fully written\"}\n tone=\"complete\"\n icon={faFileLines}\n active={statusFilter === \"complete\"}\n onClick={() => setStatusFilter((cur) => (cur === \"complete\" ? null : \"complete\"))}\n />\n <StatTile\n value={inProgressCount}\n label=\"still in progress\"\n tone=\"partial\"\n icon={faClock}\n active={statusFilter === \"partial\"}\n onClick={() => setStatusFilter((cur) => (cur === \"partial\" ? null : \"partial\"))}\n />\n <StatTile\n value={notStartedCount === null ? \"—\" : notStartedCount}\n label={notStartedCount === 1 ? \"vaccine with no content yet\" : \"vaccines with no content yet\"}\n tone=\"empty\"\n icon={faBan}\n onClick={canEdit ? () => setAddOpen(true) : undefined}\n />\n </Box>\n )}\n\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1.5, mb: 2, flexWrap: \"wrap\" }}>\n <TextField\n size=\"small\"\n placeholder=\"Search vaccine name…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n sx={{ minWidth: 260, maxWidth: 360, background: \"var(--color-background)\" }}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <FontAwesomeIcon icon={faSearch} size=\"xs\" />\n </InputAdornment>\n ),\n }}\n />\n {statusFilter && (\n <span className=\"ve-filter-chip\">\n {statusFilter === \"complete\" ? \"Complete\" : \"In progress\"} only\n <button type=\"button\" onClick={() => setStatusFilter(null)} aria-label=\"Clear filter\">\n ×\n </button>\n </span>\n )}\n </Box>\n\n {isLoading ? (\n <Card className=\"ve-list-table\" variant=\"outlined\">\n {[1, 2, 3].map((n) => (\n <Box key={n} className=\"ve-list-row\">\n <Skeleton variant=\"rounded\" width={40} height={40} sx={{ borderRadius: \"11px\", flexShrink: 0 }} />\n <Box>\n <Skeleton width=\"55%\" height={18} />\n <Skeleton width=\"35%\" height={14} />\n </Box>\n <Skeleton height={14} />\n <Skeleton variant=\"rounded\" height={20} sx={{ borderRadius: \"999px\" }} />\n <Skeleton height={14} />\n <Skeleton variant=\"rounded\" height={32} sx={{ borderRadius: \"8px\" }} />\n </Box>\n ))}\n </Card>\n ) : filteredRows.length === 0 ? (\n <Card sx={{ p: 6, textAlign: \"center\", boxShadow: \"none\", border: \"1px solid var(--color-gray3)\" }}>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 600, mb: 1 }}>\n {rows.length === 0\n ? \"No vaccine education configured yet\"\n : search\n ? `No vaccines match \"${search}\"`\n : \"No vaccines match this filter\"}\n </Typography>\n {rows.length === 0 && (\n <>\n <Typography variant=\"body2\" sx={{ color: \"text.secondary\", mb: 2 }}>\n Add education content for a vaccine to get started.\n </Typography>\n {canEdit && (\n <Button variant=\"contained\" className=\"normal-case\" onClick={() => setAddOpen(true)}>\n Add Vaccine Education\n </Button>\n )}\n </>\n )}\n </Card>\n ) : (\n <>\n <Card className=\"ve-list-table\" variant=\"outlined\">\n <Box className=\"ve-list-head\">\n <span className=\"ve-list-head-vaccine\">Vaccine</span>\n <span className=\"ve-list-head-progress\">Completeness</span>\n <span className=\"ve-list-head-status\">Status</span>\n <span className=\"ve-list-head-updated\">Last updated</span>\n <span className=\"ve-list-head-actions\">Actions</span>\n </Box>\n {pagedRows.map(({ vaccine, record }) => (\n <VaccineRow key={vaccine.id} vaccine={vaccine} record={record} navigate={navigate} canEdit={canEdit} />\n ))}\n </Card>\n\n <Box className=\"ve-list-footer\">\n <Typography variant=\"body2\" className=\"ve-list-footer-count\">\n Showing {rangeFrom} to {rangeTo} of {totalResults} results\n </Typography>\n\n <Pagination\n page={page}\n count={totalPages}\n onChange={(_e, value) => setPage(value)}\n shape=\"rounded\"\n size=\"small\"\n className=\"ve-list-pagination\"\n />\n\n <Select\n size=\"small\"\n value={rowsPerPage}\n onChange={(e) => setRowsPerPage(Number(e.target.value))}\n className=\"ve-list-rows-select\"\n >\n {ROWS_PER_PAGE_OPTIONS.map((n) => (\n <MenuItem key={n} value={n}>\n {n} / page\n </MenuItem>\n ))}\n </Select>\n </Box>\n </>\n )}\n\n <AddVaccineEducationDialog\n open={addOpen}\n onClose={() => setAddOpen(false)}\n onStarted={(vaccineId) => navigate(`/ui/medplat/manage/vaccineEducation/${vaccineId}`)}\n />\n </Box>\n );\n}\n\nfunction VaccineRow({ vaccine, record, navigate, canEdit }) {\n const completed = countCompletedSections(record);\n const pct = Math.round((completed / TOTAL_SECTIONS) * 100);\n const updated = formatUpdatedOn(record.updatedOn);\n const status = statusOf(completed);\n\n return (\n <Box className=\"ve-list-row\">\n <Box className=\"ve-list-avatar\">\n <FontAwesomeIcon icon={faSyringe} />\n </Box>\n\n <Box className=\"ve-list-vaccine\">\n <Typography sx={{ fontWeight: 700, fontSize: 14 }}>{vaccine.name}</Typography>\n <Typography variant=\"caption\" sx={{ color: \"text.secondary\" }}>{vaccine.category || \"—\"}</Typography>\n </Box>\n\n <Box className=\"ve-list-progress\">\n <Typography variant=\"caption\" className=\"ve-list-progress-label\">{completed}/{TOTAL_SECTIONS}</Typography>\n <Box className=\"ve-progress-track\">\n <Box className={`ve-progress-fill ${status.className}`} sx={{ width: `${pct}%` }} />\n </Box>\n <Typography variant=\"caption\" className=\"ve-list-progress-pct\">{pct}%</Typography>\n </Box>\n\n <Box className=\"ve-list-status\">\n <span className={`ve-status-pill ${status.className}`}>\n <FontAwesomeIcon icon={status.icon} />\n {status.label}\n </span>\n </Box>\n\n <Box className=\"ve-list-updated\">\n {updated || <span className=\"ve-list-updated-empty\">—</span>}\n </Box>\n\n <Box className=\"ve-list-actions\">\n {canEdit && (\n <Tooltip title=\"Edit\" arrow>\n <IconButton\n size=\"small\"\n className=\"ve-list-icon-btn\"\n onClick={() => navigate(`/ui/medplat/manage/vaccineEducation/${vaccine.id}`)}\n >\n <FontAwesomeIcon icon={faPen} size=\"xs\" />\n </IconButton>\n </Tooltip>\n )}\n </Box>\n </Box>\n );\n}\n\nfunction StatTile({ value, label, tone, icon, active, onClick }) {\n return (\n <Box\n className={`ve-stat-tile tone-${tone} ${active ? \"is-active\" : \"\"} ${onClick ? \"is-clickable\" : \"\"}`}\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <Box className=\"ve-stat-icon\">\n <FontAwesomeIcon icon={icon} />\n </Box>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <span className=\"ve-stat-value\">{value}</span>\n <span className=\"ve-stat-label\">{label}</span>\n </Box>\n {onClick && <FontAwesomeIcon icon={faChevronRight} className=\"ve-stat-chevron\" />}\n </Box>\n );\n}\n\nStatTile.propTypes = {\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n label: PropTypes.string.isRequired,\n tone: PropTypes.oneOf([\"complete\", \"partial\", \"empty\"]).isRequired,\n icon: PropTypes.object.isRequired,\n active: PropTypes.bool,\n onClick: PropTypes.func,\n};\n\nVaccineRow.propTypes = {\n vaccine: PropTypes.shape({\n id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\n name: PropTypes.string,\n category: PropTypes.string,\n }).isRequired,\n record: PropTypes.object.isRequired,\n navigate: PropTypes.func.isRequired,\n canEdit: PropTypes.bool,\n};\n"],"names":["AddVaccineEducationDialog","open","onClose","onStarted","vaccines","setVaccines","useState","search","setSearch","useEffect","listVaccinesWithoutEducation","filtered","v","handlePick","vaccine","Dialog","jsxs","DialogTitle","jsx","Typography","DialogContent","TextField","e","InputAdornment","FontAwesomeIcon","faSearch","Box","faChevronRight","PropTypes","FEATURE_CODE","EDIT_RIGHT","TOTAL_SECTIONS","SECTION_DEFS","ROWS_PER_PAGE_OPTIONS","statusOf","completed","faBan","faCircleCheck","faClock","formatUpdatedOn","value","date","datePart","timePart","VaccineEducationList","navigate","useNavigate","rows","setRows","isLoading","setIsLoading","addOpen","setAddOpen","rights","setRights","page","setPage","rowsPerPage","setRowsPerPage","statusFilter","setStatusFilter","notStartedCount","setNotStartedCount","load","data","assignedFeatures","listEducationRecords","getAssignedFeatures","pending","filteredRows","useMemo","r","_b","_a","countCompletedSections","totalResults","totalPages","pagedRows","rangeFrom","rangeTo","canEdit","GeneralUtil","rowStatusCounts","acc","record","key","completeCount","inProgressCount","faShieldHalved","Button","faPlus","StatTile","faFileLines","cur","Card","n","Skeleton","Fragment","VaccineRow","Pagination","_e","Select","MenuItem","vaccineId","pct","updated","status","faSyringe","Tooltip","IconButton","faPen","label","tone","icon","active","onClick"],"mappings":"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"}
|