@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.
- package/dist/{AccessRights-xrday-L1.js → AccessRights-DUgY6ewy.js} +151 -143
- package/dist/AccessRights-DUgY6ewy.js.map +1 -0
- package/dist/AddMenuConfiguration-c6ZKiN0i.js +8898 -0
- package/dist/AddMenuConfiguration-c6ZKiN0i.js.map +1 -0
- package/dist/{BrandsPage-DmRW5bhm-Bk1szrjI.js → BrandsPage-DMw2vT0u-BVhvhc6J.js} +14 -14
- package/dist/{BrandsPage-DmRW5bhm-Bk1szrjI.js.map → BrandsPage-DMw2vT0u-BVhvhc6J.js.map} +1 -1
- package/dist/{CategoriesPage-BsS5IQh3-B03lWRY5.js → CategoriesPage-D3ihx9Gi-CT58g0ry.js} +112 -105
- package/dist/CategoriesPage-D3ihx9Gi-CT58g0ry.js.map +1 -0
- package/dist/{ChangePasswordModalCore-BPsJquTS.js → ChangePasswordModalCore-lQ9GamH1.js} +3 -3
- package/dist/{ChangePasswordModalCore-BPsJquTS.js.map → ChangePasswordModalCore-lQ9GamH1.js.map} +1 -1
- package/dist/ConditionConfig-BQBmBHaM.js +408 -0
- package/dist/ConditionConfig-BQBmBHaM.js.map +1 -0
- package/dist/{DashboardPage-C3bKc5na-sBd9Yqbi.js → DashboardPage-asr2XDRu-uOOlX9Vq.js} +29 -29
- package/dist/{DashboardPage-C3bKc5na-sBd9Yqbi.js.map → DashboardPage-asr2XDRu-uOOlX9Vq.js.map} +1 -1
- package/dist/EventConfig-BY2cgGyx.js +27 -0
- package/dist/{EventConfig-BmLemzX3.js.map → EventConfig-BY2cgGyx.js.map} +1 -1
- package/dist/EventConfigurations-CUPEN5BV.js +544 -0
- package/dist/EventConfigurations-CUPEN5BV.js.map +1 -0
- package/dist/EventConfigurations.css +1 -1
- package/dist/EventsExceptionModal-BX-ArkBE.js +188 -0
- package/dist/EventsExceptionModal-BX-ArkBE.js.map +1 -0
- package/dist/EventsUi-D6O9S7BK.js +258 -0
- package/dist/EventsUi-D6O9S7BK.js.map +1 -0
- package/dist/{FacilityPicker-BiZeupmP-CyPHmj6b.js → FacilityPicker-DYl_PDyt-Cbwo2tAY.js} +10 -10
- package/dist/{FacilityPicker-BiZeupmP-CyPHmj6b.js.map → FacilityPicker-DYl_PDyt-Cbwo2tAY.js.map} +1 -1
- package/dist/{FeatureMenu-DYJmDt7q.js → FeatureMenu-CHsBbw3W.js} +9 -5
- package/dist/FeatureMenu-CHsBbw3W.js.map +1 -0
- package/dist/{FhirServerList-DuTwnngN.js → FhirServerList-iXBPkRVF.js} +11 -11
- package/dist/{FhirServerList-DuTwnngN.js.map → FhirServerList-iXBPkRVF.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-Di1KO3oW.js → ImmunizationConfigurationBase-aUtx0JEe.js} +3440 -3060
- package/dist/ImmunizationConfigurationBase-aUtx0JEe.js.map +1 -0
- package/dist/{InventoryPage-C_AxSy7A-QLvlL4rE.js → InventoryPage-DOotGZrj-CoPjOJEI.js} +10 -10
- package/dist/{InventoryPage-C_AxSy7A-QLvlL4rE.js.map → InventoryPage-DOotGZrj-CoPjOJEI.js.map} +1 -1
- package/dist/ManageEventConfiguration-DqW3krT6.js +1216 -0
- package/dist/ManageEventConfiguration-DqW3krT6.js.map +1 -0
- package/dist/ManageEventConfiguration.css +1 -1
- package/dist/{ManageUser-DCFkUMV9.js → ManageUser-DZltBina.js} +134 -134
- package/dist/{ManageUser-DCFkUMV9.js.map → ManageUser-DZltBina.js.map} +1 -1
- package/dist/{MemberProfileCard-BdUNgHRB-VywqQdFF.js → MemberProfileCard-D5CgkTdJ-D2NgDJl3.js} +25 -25
- package/dist/{MemberProfileCard-BdUNgHRB-VywqQdFF.js.map → MemberProfileCard-D5CgkTdJ-D2NgDJl3.js.map} +1 -1
- package/dist/MobileAnalytics-BLOionG_.js +17301 -0
- package/dist/MobileAnalytics-BLOionG_.js.map +1 -0
- package/dist/MobileMenuManagement-68Wijb0X.js +220 -0
- package/dist/MobileMenuManagement-68Wijb0X.js.map +1 -0
- package/dist/MobileTypeEventConfigModal-CMcj7Ozp.js +752 -0
- package/dist/MobileTypeEventConfigModal-CMcj7Ozp.js.map +1 -0
- package/dist/OtherTypeEventConfigModal-stNmuSv_.js +1812 -0
- package/dist/OtherTypeEventConfigModal-stNmuSv_.js.map +1 -0
- package/dist/{PaymentCreatePage-CIVe0P0p-25BQVpOX.js → PaymentCreatePage-DfvSZ-kB-CckogYoe.js} +14 -14
- package/dist/{PaymentCreatePage-CIVe0P0p-25BQVpOX.js.map → PaymentCreatePage-DfvSZ-kB-CckogYoe.js.map} +1 -1
- package/dist/{PaymentsPage-BvPe5Q9F-D2gfziwW.js → PaymentsPage-DMNjYWAJ-ChO9IXmk.js} +24 -24
- package/dist/{PaymentsPage-BvPe5Q9F-D2gfziwW.js.map → PaymentsPage-DMNjYWAJ-ChO9IXmk.js.map} +1 -1
- package/dist/{PickupBatchLinesEditor-DHmcAG23-DL2p6IKJ.js → PickupBatchLinesEditor-CE2RuyJT-BPceiJr8.js} +2 -2
- package/dist/{PickupBatchLinesEditor-DHmcAG23-DL2p6IKJ.js.map → PickupBatchLinesEditor-CE2RuyJT-BPceiJr8.js.map} +1 -1
- package/dist/{PickupCreatePage-CB0Sl0Hb-Mmj7zESG.js → PickupCreatePage-B4O_-vE5-DoOo9nJO.js} +64 -64
- package/dist/{PickupCreatePage-CB0Sl0Hb-Mmj7zESG.js.map → PickupCreatePage-B4O_-vE5-DoOo9nJO.js.map} +1 -1
- package/dist/{PickupsPage-Ctpghavs-CUp4uIZq.js → PickupsPage-D7zyioJB-bHKnARYw.js} +29 -29
- package/dist/PickupsPage-D7zyioJB-bHKnARYw.js.map +1 -0
- package/dist/{PmGuard-b10TGXEi-G3N0G_Wg.js → PmGuard-BZE-y4In-D_pUm5MP.js} +25 -25
- package/dist/{PmGuard-b10TGXEi-G3N0G_Wg.js.map → PmGuard-BZE-y4In-D_pUm5MP.js.map} +1 -1
- package/dist/{ProductEditPage-C1thoKHu-URQaZ6st.js → ProductEditPage-BVlVUCtD-BR-tJ5Wb.js} +475 -472
- package/dist/ProductEditPage-BVlVUCtD-BR-tJ5Wb.js.map +1 -0
- package/dist/{ProductsPage-CupVmOD4-D45a_hf-.js → ProductsPage-DvNHIeZt-BoOOJJtk.js} +36 -35
- package/dist/ProductsPage-DvNHIeZt-BoOOJJtk.js.map +1 -0
- package/dist/{PurchaseCreatePage-YD3NmhPQ-2j4etSjM.js → PurchaseCreatePage-Cq_i9snz-DRtHHFWw.js} +214 -187
- package/dist/PurchaseCreatePage-Cq_i9snz-DRtHHFWw.js.map +1 -0
- package/dist/{PurchaseRequestDetailPage-Dg_MRY_N-D1bgTEAn.js → PurchaseRequestDetailPage-CA9KFOfE-CtjG4Gx6.js} +80 -80
- package/dist/PurchaseRequestDetailPage-CA9KFOfE-CtjG4Gx6.js.map +1 -0
- package/dist/{PurchaseRequestsPage-DPAPzpmm-mDH2IrTl.js → PurchaseRequestsPage-DS9i4o0--TpoxA5Kd.js} +29 -29
- package/dist/{PurchaseRequestsPage-DPAPzpmm-mDH2IrTl.js.map → PurchaseRequestsPage-DS9i4o0--TpoxA5Kd.js.map} +1 -1
- package/dist/{PurchasesPage-It1GHiXl-eH4IsF_U.js → PurchasesPage-DgL5T6BY-DePUuE9l.js} +31 -31
- package/dist/{PurchasesPage-It1GHiXl-eH4IsF_U.js.map → PurchasesPage-DgL5T6BY-DePUuE9l.js.map} +1 -1
- package/dist/{SaleCreatePage-C9kFmTvm-B3Y0o4CX.js → SaleCreatePage-CZnIOydv-DKBw-qp7.js} +15 -15
- package/dist/{SaleCreatePage-C9kFmTvm-B3Y0o4CX.js.map → SaleCreatePage-CZnIOydv-DKBw-qp7.js.map} +1 -1
- package/dist/{SalesPage-D18DCseD-BxktGDRQ.js → SalesPage-DPIRrC_O-M8rqnK7z.js} +62 -62
- package/dist/SalesPage-DPIRrC_O-M8rqnK7z.js.map +1 -0
- package/dist/SettingsPage-BC_R6Z-Q-CKNt9zRu.js +676 -0
- package/dist/SettingsPage-BC_R6Z-Q-CKNt9zRu.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-BDRkdCjW-UF64rf7q.js} +195 -188
- package/dist/StorageUnitsPage-BDRkdCjW-UF64rf7q.js.map +1 -0
- package/dist/{SubMenu-eEDhZUvh.js → SubMenu-BdMTYtC1.js} +5 -3
- package/dist/SubMenu-BdMTYtC1.js.map +1 -0
- package/dist/{TransactionsPage-DrH53pVS-BkhIGB6C.js → TransactionsPage-CqWTMNU8-Df6eGFDW.js} +48 -48
- package/dist/{TransactionsPage-DrH53pVS-BkhIGB6C.js.map → TransactionsPage-CqWTMNU8-Df6eGFDW.js.map} +1 -1
- package/dist/{TransferCreatePage-CuvoMrYH-DTTfHjz-.js → TransferCreatePage-DF7FZaTJ-CL79V3aR.js} +8 -8
- package/dist/{TransferCreatePage-CuvoMrYH-DTTfHjz-.js.map → TransferCreatePage-DF7FZaTJ-CL79V3aR.js.map} +1 -1
- package/dist/{TransfersPage-Cf701t8s-BBbN7cBf.js → TransfersPage-CGrRFaBF-cTwBUv0o.js} +69 -69
- package/dist/TransfersPage-CGrRFaBF-cTwBUv0o.js.map +1 -0
- package/dist/TypeConfiguration-JbRCN6GR.js +114 -0
- package/dist/TypeConfiguration-JbRCN6GR.js.map +1 -0
- package/dist/{UserList-DgPxsnj2.js → UserList-L41Xw0Q6.js} +2 -2
- package/dist/{UserList-DgPxsnj2.js.map → UserList-L41Xw0Q6.js.map} +1 -1
- package/dist/Users-CsJ08Kjm.js +40 -0
- package/dist/{Users-Bpc4Sazd.js.map → Users-CsJ08Kjm.js.map} +1 -1
- package/dist/{VialsPage-8oAc1yFv-Cl3FUXBJ.js → VialsPage-rvvXjgZG-Oqo1v6kQ.js} +35 -35
- package/dist/{VialsPage-8oAc1yFv-Cl3FUXBJ.js.map → VialsPage-rvvXjgZG-Oqo1v6kQ.js.map} +1 -1
- package/dist/{constants-ClZJY2x1-MkSWn6TZ.js → constants-DpXnLsAB-D6lN5cjK.js} +58 -47
- package/dist/constants-DpXnLsAB-D6lN5cjK.js.map +1 -0
- package/dist/{dashboardLayoutUtils-D1xCAxp3.js → dashboardLayoutUtils-CJivzaU1.js} +95 -92
- package/dist/dashboardLayoutUtils-CJivzaU1.js.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.js +1 -1
- package/dist/index.lib-ETRQOzvE.js +894 -0
- package/dist/index.lib-ETRQOzvE.js.map +1 -0
- package/dist/listValueStore-BFQtDYIR-Bj0yX145.js +36 -0
- package/dist/listValueStore-BFQtDYIR-Bj0yX145.js.map +1 -0
- package/package.json +1 -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/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/FeatureMenu-DYJmDt7q.js.map +0 -1
- package/dist/GrantPermissionModal-BDN66Atn.js.map +0 -1
- package/dist/ImmunizationConfigurationBase-Di1KO3oW.js.map +0 -1
- package/dist/ManageEventConfiguration-CoYcpjR9.js +0 -1085
- package/dist/ManageEventConfiguration-CoYcpjR9.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/OtherTypeEventConfigModal-CM6VkdmY.js +0 -2046
- package/dist/OtherTypeEventConfigModal-CM6VkdmY.js.map +0 -1
- package/dist/PickupsPage-Ctpghavs-CUp4uIZq.js.map +0 -1
- 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.map +0 -1
- package/dist/PurchaseRequestDetailPage-Dg_MRY_N-D1bgTEAn.js.map +0 -1
- package/dist/SalesPage-D18DCseD-BxktGDRQ.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/TransfersPage-Cf701t8s-BBbN7cBf.js.map +0 -1
- package/dist/TypeConfiguration-3O6ABrK-.js +0 -117
- package/dist/TypeConfiguration-3O6ABrK-.js.map +0 -1
- package/dist/Users-Bpc4Sazd.js +0 -41
- package/dist/constants-ClZJY2x1-MkSWn6TZ.js.map +0 -1
- package/dist/dashboardLayoutUtils-D1xCAxp3.js.map +0 -1
- package/dist/index.lib-Dn8PMkeD.js +0 -862
- package/dist/index.lib-Dn8PMkeD.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessRights-DUgY6ewy.js","sources":["../src/views/Features/AccessPanel.jsx","../src/views/Features/AccessRights.jsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { Controller, useForm } from \"react-hook-form\";\nimport { execute } from \"@/common/services/GlobalApis\";\nimport { Autocomplete, Box, Button, TextField } from \"@mui/material\";\nimport { alpha } from \"@mui/material/styles\";\nimport PropTypes from \"prop-types\";\nimport FontAwesomeIcons from \"@/common/fontAwesomeIcons/FontAwesomeIcons\";\nimport CustomAutocomplete, {\n VirtualListbox,\n} from \"@/views/custom-components/CustomAutoComplete\";\nimport useCaching from \"@/hooks/useCaching\";\n\n/**\n * Option count past which a picker is windowed rather than fully rendered.\n * Below this the virtualization machinery costs more than the options do.\n */\nconst VIRTUALIZE_ABOVE = 200;\n\nexport default function AccessPanel({\n translate,\n onSubmit,\n roleList,\n featureData,\n}) {\n const [search, setSearch] = useState(\"\");\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\n const [userList, setUserList] = useState([]);\n const { control, handleSubmit, reset } = useForm({});\n const { getCachedData } = useCaching();\n\n /** Ids already granted access, as sets, so the pickers filter in O(1) per option. */\n const assignedIds = useMemo(() => {\n const roles = new Set();\n const users = new Set();\n (featureData || []).forEach((item) => {\n if (item?.designationId) roles.add(item.designationId);\n if (item?.userId) users.add(item.userId);\n });\n return { roles, users };\n }, [featureData]);\n\n const newRoleList = useMemo(\n () => roleList.filter((role) => !assignedIds.roles.has(role?.id)),\n [roleList, assignedIds]\n );\n\n /**\n * Debounces the `search` input by 300ms before updating `debouncedSearch`.\n * Ensures user input is throttled to avoid excessive API calls.\n */\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedSearch(search);\n }, 300);\n\n return () => clearTimeout(handler);\n }, [search]);\n\n /**\n * Triggers user list fetching when `debouncedSearch` is updated and non-empty.\n */\n useEffect(() => {\n if (debouncedSearch !== \"\") {\n userListFetch(debouncedSearch);\n }\n }, [debouncedSearch]);\n\n useEffect(() => {\n userListFetch(\"\");\n }, []);\n\n /**\n * Fetches a filtered list of users based on the provided search query.\n *\n * Calls the backend with the given query string, processes the response to ensure\n * only users with valid IDs are included, and maps each user to include a formatted\n * `displayName` used in UI dropdowns.\n *\n * @param {string} query - The search string used to filter users.\n */\n const userListFetch = async (query, currentFeatureData = featureData) => {\n try {\n const fetchUsers = async (searchString) => {\n const { data } = await execute({\n code: \"user_search_for_selectize\",\n parameters: { searchString },\n });\n return data;\n };\n\n // The unfiltered list is reference data — the same payload was refetched\n // on every mount and again after every grant. Keystroke searches stay\n // uncached: they are already debounced and each one is unique.\n const userData = query\n ? await fetchUsers(query)\n : await getCachedData({\n cacheKey: [\"user_search_for_selectize\", \"\"],\n fetchFn: () => fetchUsers(\"\"),\n staleTime: 5 * 60 * 1000,\n cacheTime: 30 * 60 * 1000,\n });\n\n const grantedUserIds =\n currentFeatureData === featureData\n ? assignedIds.users\n : new Set(\n (currentFeatureData || [])\n .map((item) => item?.userId)\n .filter(Boolean)\n );\n\n const newArray = (userData?.result || [])\n .filter((item) => item?.id && !grantedUserIds.has(item.id))\n .map((item) => ({\n ...item,\n displayName:\n `${item.firstName || \"\"} ${item.lastName || \"\"} (${item.userName || \"\"})`.trim(),\n }));\n\n setUserList(newArray);\n } catch (error) {\n console.error(error);\n }\n };\n\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { xs: \"column\", md: \"row\" },\n alignItems: { xs: \"stretch\", md: \"flex-start\" },\n gap: 1.5,\n flex: 1,\n minWidth: 0,\n }}\n >\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Controller\n name=\"roles\"\n id=\"roles\"\n control={control}\n defaultValue={null}\n render={({ field: { onChange, value, ref } }) => (\n <Autocomplete\n options={userList}\n size=\"small\"\n // `user_search_for_selectize` returns the whole directory when the\n // search box is empty; window the listbox once that runs long.\n slots={{\n listbox:\n userList.length > VIRTUALIZE_ABOVE ? VirtualListbox : undefined,\n }}\n getOptionLabel={(option) => option.displayName || \"\"}\n isOptionEqualToValue={(option, value) => option.id === value?.id}\n value={value || null}\n onChange={(event, newValue, reason) => {\n if (reason === \"clear\") {\n userListFetch(\"\");\n }\n onChange(newValue);\n }}\n onInputChange={(event, newInputValue, reason) => {\n if (reason === \"input\") {\n setSearch(newInputValue);\n }\n }}\n renderOption={(props, option) => {\n const label = option.displayName || \"\";\n const searchTerm = search.trim();\n\n const index = label\n .toLowerCase()\n .indexOf(searchTerm.toLowerCase());\n if (index === -1) {\n return (\n <li\n {...props}\n key={option.id}\n style={{ lineHeight: 1.5, fontSize: \"14px\" }}\n >\n {label}\n </li>\n );\n }\n\n const beforeMatch = label.substring(0, index);\n const match = label.substring(index, index + searchTerm.length);\n const afterMatch = label.substring(index + searchTerm.length);\n\n return (\n <li\n {...props}\n key={option.id}\n style={{ lineHeight: 1.5, fontSize: \"14px\" }}\n >\n <span>\n {beforeMatch}\n <Box\n component=\"span\"\n sx={{\n fontWeight: 700,\n borderRadius: \"2px\",\n backgroundColor: (theme) =>\n alpha(theme.palette.primary.main, 0.18),\n }}\n >\n {match}\n </Box>\n {afterMatch}\n </span>\n </li>\n );\n }}\n renderInput={(params) => (\n <TextField\n {...params}\n label={translate(\"User\")}\n variant=\"outlined\"\n size=\"small\"\n inputRef={ref}\n />\n )}\n />\n )}\n />\n </Box>\n\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <CustomAutocomplete\n id=\"selectedRoles\"\n name={\"selectedRoles\"}\n options={newRoleList}\n control={control}\n isVirtualized={newRoleList.length > VIRTUALIZE_ABOVE}\n getOptionLabel={(option) => option?.name}\n dataTestId=\"accessrights-select-role\"\n renderInput={(params) => (\n <TextField\n {...params}\n label={translate(\"Role\")}\n variant=\"outlined\"\n size=\"small\"\n />\n )}\n />\n </Box>\n\n <Button\n variant=\"contained\"\n size=\"small\"\n data-testid=\"accessrights-add-button\"\n startIcon={<FontAwesomeIcons iconName=\"faPlus\" />}\n sx={{ flexShrink: 0, alignSelf: { xs: \"flex-end\", md: \"center\" } }}\n onClick={handleSubmit((data) => {\n onSubmit(data);\n\n userListFetch(\"\", [...featureData, { userId: data.roles?.id }]);\n reset();\n })}\n >\n {translate(\"add\")}\n </Button>\n </Box>\n );\n}\n\nAccessPanel.propTypes = {\n translate: PropTypes.any,\n permissionDetailsList: PropTypes.any,\n getPermissionDetails: PropTypes.any,\n onSubmit: PropTypes.any,\n permissionTypes: PropTypes.any,\n roleList: PropTypes.any,\n featureData: PropTypes.any,\n};\n","import {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Box,\n Checkbox,\n Chip,\n FormControlLabel,\n IconButton,\n InputAdornment,\n Menu,\n MenuItem,\n Tooltip,\n Typography,\n} from \"@mui/material\";\nimport PropTypes from \"prop-types\";\nimport CustomConfirmationModal from \"@/views/custom-components/CustomConfirmationModal\";\nimport DebouncedSearchInput from \"@/views/custom-components/DebouncedSearchInput\";\nimport React, {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n useRef,\n} from \"react\";\nimport {\n deleteUserMenuItem,\n getFeatureAccessSummaryV2,\n getFeatureData,\n getFeatureDataV2,\n getFeaturePermissionsForIdentity,\n postMenuItem,\n updateUserMenuItem,\n} from \"../../services/Features\";\nimport { getRoleList, execute } from \"@/common/services/GlobalApis.js\";\nimport \"@/assets/scss/scrollBar.scss\";\nimport { useForm } from \"react-hook-form\";\nimport { showToast } from \"@/common/toaster/toaster\";\nimport useTrackEvent from \"@/hooks/useTrackEvent\";\nimport { useTranslateProvider } from \"@/common/languageTranslator/TranslationContext\";\nimport FontAwesomeIcons from \"@/common/fontAwesomeIcons/FontAwesomeIcons\";\nimport AccessPanel from \"./AccessPanel\";\nimport GeneralUtil from \"@/common/services/util/GeneralUtil\";\nimport useCaching from \"@/hooks/useCaching\";\nimport { AccessRightsSkeleton } from \"./Skeletons/FeatureSkeletons\";\n\n// Neither dialog is on screen at first paint, and GrantPermissionModal drags in\n// yup + the date picker, so both stay out of this chunk until they open.\nconst GrantPermissionModal = lazy(() => import(\"./GrantPermissionModal\"));\nconst PermissionsModal = lazy(() => import(\"./PermissionsModal\"));\n\nfunction RowActionMenu({ config, row }) {\n const [anchorEl, setAnchorEl] = useState(null);\n const openMenu = Boolean(anchorEl);\n\n const handleIconClick = (e) => {\n e.stopPropagation(); // keep the row/accordion from toggling\n setAnchorEl(e.currentTarget);\n\n if (typeof config.menuClick === \"function\") {\n config.menuClick(row);\n }\n };\n\n const handleClose = (e) => {\n if (e) {\n e.stopPropagation();\n }\n setAnchorEl(null);\n };\n\n const handleItemClick = (item) => (e) => {\n e.stopPropagation();\n if (typeof item.onClick === \"function\") {\n item.onClick(row);\n }\n setAnchorEl(null);\n };\n\n return (\n <>\n <Tooltip title={config.tooltip}>\n <IconButton\n size=\"small\"\n aria-label={config.tooltip}\n onClick={handleIconClick}\n data-testid={config.dataTestId}\n >\n {config.icon}\n </IconButton>\n </Tooltip>\n\n <Menu\n anchorEl={anchorEl}\n open={openMenu}\n onClose={handleClose}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n transformOrigin={{ vertical: \"top\", horizontal: \"right\" }}\n >\n {config.menuItems?.map((item, index) => (\n <MenuItem key={index} onClick={handleItemClick(item)}>\n {item.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n\nRowActionMenu.propTypes = {\n config: PropTypes.any,\n row: PropTypes.any,\n};\n\n/**\n * The `AccessRights` component displays access rights related to a specific sub-menu.\n *@module AccessRights\n * @param {Object} props - The component props.\n * @param {number} props.subMenuId - The ID of the sub-menu for which access rights are displayed or managed.\n * @param {number} props.subMenuGroupName - The name of the sub-menu group.\n */\nexport default function AccessRights({\n subMenuId,\n // subMenuGroupName,\n subMenuFeatureVal,\n // selectedTab,\n parentLoading,\n onNewAPIChange,\n rights,\n}) {\n const formRef = useRef(null);\n const submitRef = useRef(false);\n const trackEvent = useTrackEvent();\n // Was Techo-only (useRef(!GeneralUtil.isTecho)) while this lazy-load path was\n // being rolled out cautiously; now tried for every implementation, with the\n // existing runtime fallback below covering any backend without the new routes yet.\n const useLegacySummaryApiRef = useRef(false);\n const { getCachedData } = useCaching();\n const [featureNames, setFeatureNames] = useState([]);\n const [featureData, setFeatureData] = useState([]);\n const [initFeatureData, setinitFeatureData] = useState([]);\n const [roleData, setRoleData] = useState([]);\n const [initialROleData, setInitialRoleData] = useState([]);\n const [feature, setFeature] = useState(\"\");\n const [selectedUser, setSelectedUser] = useState({});\n const [open, setOpen] = useState(false);\n const [openPermissionModal, setOpenPermissionModal] = useState(false);\n const [deletedId, setDeletedId] = useState(\"\");\n const [selectedRow, setSelectedRow] = useState(null);\n const [allData, setAllData] = useState({});\n const [isLoading, setIsLoading] = useState(false);\n const [isNewApi, setIsNewApi] = useState(false);\n const [pendingGrant, setPendingGrant] = useState(null);\n const [permissionList, setPermissionList] = useState([]);\n const [isOpen, setIsOpen] = useState(0);\n const [search, setSearch] = useState(\"\");\n const { translate } = useTranslateProvider();\n const [selectedFeatureName, setSelectedFeatureName] = useState(\"\");\n const [selectedFeatureState, setSelectedFeatureState] = useState([]);\n\n const [expandedChildrenByRow, setExpandedChildrenByRow] = useState(null);\n\n const canUpdate = GeneralUtil.hasCheckRights(\n rights?.[\"update.manage.featurelist\"],\n undefined,\n true,\n );\n const canDelete = GeneralUtil.hasCheckRights(\n rights?.[\"delete.manage.featurelist\"],\n undefined,\n true,\n );\n\n /**\n * Permission metadata keyed by id. The render walks every permission of\n * every expanded row, so the old linear `find` per checkbox was O(rows ×\n * permissions²).\n */\n const permissionById = useMemo(() => {\n const map = new Map();\n (permissionList || []).forEach((perm) => map.set(String(perm.id), perm));\n return map;\n }, [permissionList]);\n\n /** Backend feature name → display name, for the same reason. */\n const displayNameByFeature = useMemo(() => {\n const map = new Map();\n (featureNames || []).forEach((entry) => {\n if (entry?.feature_name) map.set(entry.feature_name, entry.display_name);\n });\n return map;\n }, [featureNames]);\n\n const getBasicRightId = () => {\n if (!permissionList || permissionList.length === 0) return null;\n const views = permissionList.filter((rights) =>\n rights?.id?.startsWith(\"view\"),\n );\n if (views && views.length > 0) {\n // Case 2: view.report.<uuid> — anchored so candrilldown sub-rights don't match\n const reportUuidView = views.find((item) =>\n /^view\\.report\\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(item.id)\n );\n if (reportUuidView) return reportUuidView.id;\n\n // Case 1: view.report — exact match regardless of list order\n if (views.some((item) => item.id === \"view.report\")) return \"view.report\";\n\n // Case 3: view.x.x — three-segment\n const threeSegment = views.filter((item) => item.id.split(\".\").length === 3);\n if (threeSegment.length > 0) {\n return threeSegment[0].id;\n }\n }\n return permissionList[0]?.id;\n };\n\n useEffect(() => {\n let form = formRef.current;\n\n return () => {\n trackEvent(\"conversion_event\", {\n form,\n form_name: \"Access Rights\",\n submit: submitRef.current,\n }); // Use the current ref value\n };\n }, []);\n\n /**\n * Sorts an array of user menu items based on `designationId` and `userId`.\n * @param {Object} data - The data object containing `userMenuItemDtos` to be sorted.\n * @param {Object[]} data.userMenuItemDtos - An array of user menu items to sort.\n * @param {number} [data.userMenuItemDtos[].designationId] - The designation ID of a menu item.\n * @param {number} [data.userMenuItemDtos[].userId] - The user ID of a menu item.\n * @returns {Object[]} The sorted array of user menu items.\n */\n const sortData = (data) => {\n let sortedData;\n sortedData = data.userMenuItemDtos?.toSorted((a, b) => {\n if (a.designationId !== undefined && b.designationId !== undefined) {\n return a.designationId - b.designationId;\n }\n if (a.designationId !== undefined && b.designationId === undefined) {\n return -1;\n }\n if (a.designationId === undefined && b.designationId !== undefined) {\n return 1;\n }\n\n if (a.userId !== undefined && b.userId !== undefined) {\n return a.userId - b.userId;\n }\n if (a.userId !== undefined && b.userId === undefined) {\n return -1;\n }\n if (a.userId === undefined && b.userId !== undefined) {\n return 1;\n }\n\n return 0;\n });\n return sortedData;\n };\n\n /**\n * Handles the deletion of a user menu item and updates the feature data.\n * @async\n * @function handleDelete\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n * @throws {Error} Throws an error if the deletion or data retrieval fails.\n */\n\n const editUserMenuItem = (data) => {\n data?.userMenuItemDtos.forEach((right) => {\n right.featureJson = extendFeatureJson(\n JSON.parse(data.featureJson || \"{}\"),\n JSON.parse(right.featureJson || \"{}\"),\n );\n if (right.designationId) {\n right.code = \"Role\";\n right.displayName = right.roleName;\n } else {\n right.code = \"User\";\n right.displayName = right.fullName;\n }\n });\n return data;\n };\n\n const handleDelete = async () => {\n try {\n setIsLoading((cur) => !cur);\n if (isNewApi) {\n const response = [];\n Object.entries(JSON.parse(selectedRow?.featureJson)).forEach(\n ([id, value]) => {\n if (value === true) {\n response.push(id);\n }\n },\n );\n\n try {\n await execute({\n code: \"delete_permissions\",\n parameters: {\n permissionList: response,\n roleId: parseInt(selectedRow?.designationId),\n userId: parseInt(selectedRow?.userId),\n },\n });\n showToast({\n type: \"success\",\n message: \"Permission Deleted Successfully\",\n });\n const { data: val } = await getFeatureDataV2(subMenuId);\n newApiData(val);\n } catch {\n showToast({\n type: \"error\",\n message: \"error occurred\",\n });\n }\n } else {\n await deleteUserMenuItem(deletedId);\n let { data } = await getFeatureData(subMenuId);\n if (data?.userMenuItemDtos.length > 0) {\n data = editUserMenuItem(data);\n }\n\n setFeatureData(data.userMenuItemDtos);\n }\n setOpen(false);\n setIsLoading((cur) => !cur);\n } catch (error) {\n showToast({\n type: \"error\",\n message: `Error Deleting data: ${error?.response?.data?.message}`,\n });\n setIsLoading((cur) => !cur);\n setOpen(false);\n }\n };\n\n const diffPermissions = (permissions, featureJson) => {\n const assignedIds = new Set(permissions.map((p) => p.id));\n const response = [];\n\n // Check for grants (in featureJson but not in permissions)\n Object.entries(featureJson).forEach(([id, value]) => {\n if (value === true && !assignedIds.has(id)) {\n response.push({ id, action: \"grant\" });\n }\n });\n\n // Check for revokes (in permissions but not true in featureJson)\n permissions.forEach((p) => {\n if (!featureJson[p.id]) {\n response.push({ id: p.id, action: \"revoke\" });\n }\n });\n\n return response;\n };\n\n const { handleSubmit } = useForm({});\n /**\n * Updates a user menu item and refreshes the feature data.\n * @async\n * @function handleUpdateUserMenuItem\n * @param {Object} params - Parameters to update the user menu item.\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n * @throws {Error} Logs an error if the update or data retrieval fails.\n */\n\n const handleUpdateUserMenuItem = async (params) => {\n try {\n if (isNewApi) {\n params = { ...params, featureJson: JSON.parse(params?.featureJson) };\n const missing = diffPermissions(\n params.permissions,\n params?.featureJson,\n );\n if (missing[0]?.action === \"grant\") {\n setPendingGrant({\n ...params,\n id: missing[0]?.id,\n });\n setIsOpen(1);\n } else if (missing[0]?.action === \"revoke\") {\n try {\n await execute({\n code: \"revoke_permission\",\n parameters: {\n featureName: missing[0]?.id,\n roleId: parseInt(params?.designationId),\n userId: parseInt(params?.userId),\n },\n });\n showToast({\n type: \"success\",\n message: \"Permission Revoked Successfully\",\n });\n } catch {\n showToast({\n type: \"error\",\n message: \"Error in revoking permission\",\n });\n }\n }\n const { data: val } = await getFeatureDataV2(subMenuId);\n newApiData(val);\n } else {\n await updateUserMenuItem(params);\n }\n } catch (error) {\n showToast({\n type: \"error\",\n message: `Error Updating data: ${error?.response?.data?.message}`,\n });\n }\n };\n\n const handleCheckAllAndNone = async (params) => {\n try {\n params = {\n ...params,\n featureJson: JSON.parse(params?.featureJson),\n };\n\n if (params?.checkAll) {\n const uncheckedKeys = Object.keys(params?.featureJson).filter(\n (key) => params?.featureJson[key] === false,\n );\n\n // Granting a report's root permission implicitly grants drill-down too, since\n // there is no separate row for it (candrilldown never appears as its own\n // toggleable key — only report roots do). Anchored so candrilldown itself\n // (and any other sub-right) never re-matches — same pattern as\n // getBasicRightId's report-root check above.\n const reportRootPattern =\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 const falseKeys = uncheckedKeys\n .flatMap((key) =>\n reportRootPattern.test(key) ? [key, `${key}.candrilldown`] : [key],\n )\n .join(\",\");\n\n await execute({\n code: \"grant_permission_bulk\",\n parameters: {\n permission_id_list: falseKeys,\n role_id: parseInt(params?.designationId),\n user_id: parseInt(params?.userId),\n },\n });\n showToast({\n type: \"success\",\n message: \"Permission granted Successfully\",\n });\n }\n const { data: val } = await getFeatureDataV2(subMenuId);\n newApiData(val);\n } catch (error) {\n console.error(error);\n }\n };\n\n /**\n * Submits the selected roles and user data to add a menu item.\n * @async\n * @function onSubmit\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n * @throws {Error} Displays an error toast if the operation fails.\n */\n\n const onSubmit = async (formVal) => {\n if (!(formVal?.roles || formVal?.selectedRoles)) {\n showToast({\n message: \"Please select either user or role !!\",\n type: \"info\",\n });\n return;\n }\n if (isNewApi && featureNames.length < 1) {\n showToast({\n message: \"Please add permissions first for this feature !!\",\n type: \"info\",\n });\n return;\n }\n\n try {\n const selectedRoleIds =\n formVal?.selectedRoles?.map((item) => item?.id) || [];\n\n const isUserDuplicate = selectedUser?.id\n ? featureData.some((data) => data?.userId === selectedUser?.id)\n : false;\n const isRoleDuplicate =\n selectedRoleIds?.length > 0\n ? featureData.some((data) =>\n selectedRoleIds.includes(data?.designationId),\n )\n : false;\n const isDuplicate = isUserDuplicate || isRoleDuplicate;\n if (!isDuplicate) {\n const ids = selectedRoleIds?.join(\",\");\n const params = {\n userId: formVal?.roles?.id,\n designationId: ids || null,\n };\n const featureName = permissionList.filter((rights) =>\n rights?.id?.startsWith(\"view\"),\n );\n\n if (isNewApi) {\n\n const reportPermissionId = featureName.find(item =>\n /^view\\.report\\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(item.id)\n )?.id;\n\n if (reportPermissionId) {\n setPendingGrant({\n ...params,\n id: reportPermissionId\n });\n } else if (featureName.some(item => item.id === \"view.report\")) {\n setPendingGrant({\n ...params,\n id: \"view.report\"\n });\n } else {\n setPendingGrant({\n ...params,\n id:\n featureName\n ?.filter((item) => item.id.split(\".\").length === 3)\n .map((item) => item.id)[0] || permissionList[0]?.id,\n });\n }\n setIsOpen(1);\n const { data: val } = await getFeatureDataV2(subMenuId);\n newApiData(val);\n } else {\n await postMenuItem(subMenuId, params);\n let { data } = await getFeatureData(subMenuId);\n if (data?.userMenuItemDtos.length > 0) {\n if (data?.userMenuItemDtos.length > 0) {\n data = editUserMenuItem(data);\n }\n }\n setFeature(data?.featureJson);\n const sortedData = sortData(data);\n setFeatureData(sortedData);\n const featureList = data.featureJson\n ? Object.keys(JSON.parse(data.featureJson))\n : [];\n if (featureList.length > 0) {\n const { data: features } = await execute({\n code: \"retrieve_display_name_for_feature\",\n parameters: {\n menu_id: subMenuId,\n feature_name_list: featureList,\n },\n });\n setFeatureNames(features.result);\n } else {\n setFeatureNames([]);\n }\n showToast({\n message: \"menu item added successfully\",\n type: \"success\",\n });\n }\n\n submitRef.current = true;\n setSelectedUser({});\n } else {\n showToast({\n message: `Selected User Already found please select another id`,\n type: \"warning\",\n });\n }\n } catch (error) {\n console.error(error);\n showToast({\n message: \"cannot add menu item\",\n type: \"error\",\n });\n }\n };\n\n /**\n * Filters the assigned roles/users by name. The input debounces upstream\n * (`DebouncedSearchInput`), so this runs once the user pauses typing.\n * @function handleSearch\n * @param {string} value - The current value of the search input.\n */\n const handleSearch = useCallback(\n (value) => {\n const searchValue = (value || \"\").toLowerCase();\n setSearch(searchValue);\n\n if (!searchValue) {\n setFeatureData(initFeatureData);\n return;\n }\n\n const filteredData = initFeatureData?.filter((feature) =>\n feature?.designationId\n ? feature.roleName?.toLowerCase().includes(searchValue)\n : feature.fullName?.toLowerCase().includes(searchValue),\n );\n trackEvent(\"search_tracking\", {\n searchTerm: searchValue,\n results_count: filteredData.length,\n search_type: \"Page Search\",\n });\n setFeatureData(filteredData);\n },\n [initFeatureData, trackEvent],\n );\n\n /**\n * Merges a \"default\" feature set with any overrides, and returns the result as a JSON string.\n *\n * For every key in `defaultJson`, if `assignedJson` provides its own value for that key,\n * the assigned value is used; otherwise the default is preserved. Keys in `assignedJson`\n * that aren't in `defaultJson` are ignored.\n *\n * @param {Object<string, any>} defaultJson\n * An object whose keys are the full set of features, each mapped to its default value.\n * @param {Object<string, any>} [assignedJson={}]\n * An object mapping a subset of those same keys to override values. Defaults to `{}`.\n * @returns {string}\n * A JSON‐stringified representation of the merged feature set.\n */\n const extendFeatureJson = (defaultJson, assignedJson = {}) => {\n const newJson = {};\n\n Object.keys(defaultJson).forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(assignedJson, key)) {\n newJson[key] = assignedJson[key];\n } else {\n newJson[key] = defaultJson[key];\n }\n });\n\n return JSON.stringify(newJson);\n };\n\n const buildPermissionMap = (allPermissions, userPermissions) => {\n const userPermissionIds = new Set(userPermissions.map((p) => p.id));\n\n const result = {};\n allPermissions.forEach((p) => {\n result[p.id] = userPermissionIds.has(p.id);\n });\n\n return JSON.stringify(result);\n };\n\n const newApiData = (val) => {\n val?.userMenuItemDtos.forEach((right) => {\n right.id = right?.designationId || right?.userId;\n right.featureJson = buildPermissionMap(\n val?.permissions,\n right?.permissions,\n );\n\n if (right.designationId) {\n right.code = \"Role\";\n right.displayName = right.roleName;\n } else {\n right.code = \"User\";\n right.displayName = right.fullName;\n }\n });\n\n const featureList = [\n ...new Set(val.permissions.map((permission) => permission.id)),\n ];\n setFeatureNames(featureList);\n\n setPermissionList(val?.permissions);\n const sortedData = sortData(val);\n setFeatureData(sortedData);\n setinitFeatureData(sortedData);\n };\n\n /**\n * Effect hook to load initial data when `subMenuId` changes.\n * @function\n * @name useEffect\n * @returns {void}\n * @throws {Error} Logs an error to the console if any of the data fetching operations fail.\n */\n\n useEffect(() => {\n const loadInitialData = async () => {\n try {\n if (subMenuId) {\n setExpandedChildrenByRow(null);\n setExpanded(false);\n setIsLoading((cur) => !cur);\n setSearch(\"\");\n let data, isNewApi;\n if (subMenuFeatureVal) {\n // Names + permission tree only; each row's individual permission grants are\n // fetched on demand when that row is expanded (see handleChange). Falls back to\n // the full-bundle endpoint if this backend doesn't have the lazy-load routes yet.\n if (useLegacySummaryApiRef.current) {\n const res = await getFeatureDataV2(subMenuId);\n data = res.data;\n } else {\n try {\n const res = await getFeatureAccessSummaryV2(subMenuId);\n data = res.data;\n } catch (summaryError) {\n console.error(\"configtypesV2/summary unavailable, falling back to full bundle\", summaryError);\n useLegacySummaryApiRef.current = true;\n const res = await getFeatureDataV2(subMenuId);\n data = res.data;\n }\n }\n isNewApi = true;\n setIsNewApi(true);\n onNewAPIChange({ id: subMenuId, val: true });\n } else {\n const res = await getFeatureData(subMenuId);\n data = res.data;\n isNewApi = false;\n setIsNewApi(false);\n onNewAPIChange({ id: subMenuId, val: false });\n }\n\n if (isNewApi) {\n newApiData(data);\n } else {\n if (data?.userMenuItemDtos.length > 0) {\n data = editUserMenuItem(data);\n }\n setFeature(data?.featureJson);\n const sortedData = sortData(data);\n setFeatureData(sortedData);\n setinitFeatureData(sortedData);\n }\n\n let allRoles = initialROleData;\n if (!roleData || roleData.length === 0) {\n // Reference data: the same role list was refetched every time this\n // pane mounted for a different sub menu.\n const fetchedRoles = await getCachedData({\n cacheKey: [\"roleList\"],\n fetchFn: async () => (await getRoleList()).data,\n staleTime: 5 * 60 * 1000,\n cacheTime: 30 * 60 * 1000,\n });\n setInitialRoleData(fetchedRoles);\n allRoles = fetchedRoles;\n }\n\n let featureList;\n if (isNewApi) {\n featureList = data.permissions.map((permission) => permission.id);\n setFeatureNames(featureList);\n } else {\n featureList = data.featureJson\n ? Object.keys(JSON.parse(data.featureJson))\n : [];\n\n if (featureList.length > 0) {\n const [featuresRes] = await Promise.all([\n await execute({\n code: \"retrieve_display_name_for_feature\",\n parameters: {\n menu_id: subMenuId,\n feature_name_list: featureList,\n },\n }),\n ]);\n setFeatureNames(featuresRes.data?.result);\n } else {\n setFeatureNames([]);\n }\n }\n\n if (allRoles && allRoles.length > 0) {\n if (data.isDynamicFeature) {\n const copyAllRoles = JSON.parse(JSON.stringify(allRoles));\n const filteredRoles = copyAllRoles.filter((role) => {\n const roleType = role.roleType;\n if (roleType === null) return true;\n if (data?.isMobileFeature && data?.isWebFeature) return true;\n if (data.isMobileFeature)\n return roleType === \"MOBILE\" || roleType === \"BOTH\";\n if (data.isWebFeature)\n return roleType === \"WEB\" || roleType === \"BOTH\";\n return false;\n });\n setRoleData(filteredRoles);\n } else {\n setRoleData(allRoles);\n }\n }\n\n setIsLoading((cur) => !cur);\n }\n } catch (error) {\n showToast({\n type: \"error\",\n message: `Error loading initial data: ${error?.response?.data?.message}`,\n });\n setIsLoading((cur) => !cur);\n }\n };\n loadInitialData();\n }, [subMenuId, onNewAPIChange]);\n\n const findPermissionById = useCallback(\n (displayName) => permissionById.get(String(displayName)) || null,\n [permissionById],\n );\n\n /**\n * The right every grant implies; it is rendered disabled so it cannot be\n * revoked on its own. Derived from a filter + regex scan over the whole\n * permission list, so it is resolved once per list rather than once per\n * checkbox.\n */\n const basicRightId = useMemo(\n () => getBasicRightId(),\n [permissionList],\n );\n\n const [expanded, setExpanded] = useState(false);\n\n // Fetches this row's own permission grants the first time it's expanded, instead of\n // every row's permissions being fetched up front when the menu is selected.\n const handleChange = (row) => async (event, isExpanded) => {\n const panel = `panel${row?.id}`;\n // setExpandedChildrenByRow(null);\n setExpanded(isExpanded ? panel : false);\n\n if (isExpanded && isNewApi && row && !row._permissionsLoaded && !useLegacySummaryApiRef.current) {\n try {\n const { data: permissions } = await getFeaturePermissionsForIdentity(subMenuId, {\n userId: row.userId,\n roleId: row.designationId,\n });\n row.permissions = permissions;\n row.featureJson = buildPermissionMap(permissionList, permissions);\n row._permissionsLoaded = true;\n setFeatureData((cur) => [...cur]);\n } catch (error) {\n console.error(error);\n showToast({ type: \"error\", message: \"Error loading permissions for row\" });\n }\n }\n };\n\n /**\n * Renders one permission checkbox (plus its \"view child permissions\" eye,\n * when the permission has children).\n *\n * @param {Object} args\n * @param {Object} args.row - The role/user row the permission belongs to.\n * @param {Object} args.featureState - The row's parsed `featureJson`, parsed once by the caller.\n * @param {string} args.featureKey - The key inside the row's `featureJson`.\n * @param {string} args.lookupKey - The key used to resolve the permission's metadata.\n * @param {number} args.index - Index within the rendered list, for the React key.\n * @param {boolean} args.withModal - Whether the eye toggle also opens `PermissionsModal`.\n */\n const renderPermissionItem = ({\n row,\n featureState,\n featureKey,\n lookupKey,\n index,\n withModal,\n }) => {\n const isChecked = featureState[featureKey] || false;\n const permObj = findPermissionById(lookupKey);\n const hasChildren = (permObj?.child?.length || 0) > 0;\n const isBasicRight = featureKey === basicRightId;\n const isDisabled = !canUpdate || isBasicRight;\n const isChildrenOpen = expandedChildrenByRow?.id === permObj?.id;\n\n const checkbox = (\n <FormControlLabel\n sx={{ mr: 0, minWidth: 0, flex: 1 }}\n control={\n <Checkbox\n size=\"small\"\n disabled={isDisabled}\n checked={isChecked}\n name={featureKey}\n onClick={() => {\n const updatedFeatureState = {\n ...featureState,\n [featureKey]: !isChecked,\n };\n setFeatureData((prev) =>\n prev.map((item) =>\n item.id === row.id\n ? {\n ...item,\n featureJson: JSON.stringify(updatedFeatureState),\n }\n : item,\n ),\n );\n handleUpdateUserMenuItem({\n ...row,\n featureJson: JSON.stringify(updatedFeatureState),\n code: row.designationId ? \"Role\" : \"User\",\n menuConfigId: subMenuId,\n displayName: row.designationId ? row.roleName : row.fullName,\n });\n }}\n />\n }\n label={\n <Typography variant=\"body2\">\n {permObj ? permObj.name : lookupKey}\n </Typography>\n }\n />\n );\n\n return (\n <Box\n key={`featureName-${index}`}\n sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5, minWidth: 0 }}\n >\n {isBasicRight && canUpdate ? (\n <Tooltip\n title={translate(\n \"This is the base right for the sub menu and cannot be changed here.\",\n )}\n >\n <span style={{ display: \"flex\", flex: 1, minWidth: 0 }}>\n {checkbox}\n </span>\n </Tooltip>\n ) : (\n checkbox\n )}\n {hasChildren && (\n <Tooltip\n title={\n isChildrenOpen\n ? translate(\"Close Permissions\")\n : translate(\"View Permissions\")\n }\n >\n <IconButton\n size=\"small\"\n color=\"primary\"\n aria-label={\n isChildrenOpen\n ? translate(\"Close Permissions\")\n : translate(\"View Permissions\")\n }\n onClick={() => {\n if (isChildrenOpen) {\n setExpandedChildrenByRow(null);\n if (withModal) {\n setOpenPermissionModal(false);\n setSelectedFeatureName(\"\");\n setSelectedFeatureState([]);\n }\n return;\n }\n if (withModal) {\n setSelectedFeatureName(featureKey);\n setSelectedFeatureState(featureState);\n setOpenPermissionModal(true);\n }\n setExpandedChildrenByRow(permObj);\n }}\n >\n <FontAwesomeIcons\n iconName={isChildrenOpen ? \"faEyeSlash\" : \"faEye\"}\n size=\"sm\"\n />\n </IconButton>\n </Tooltip>\n )}\n </Box>\n );\n };\n\n const hasAnyPermission =\n featureNames.length > 0 ||\n Object.keys(JSON.parse(feature || \"{}\")).length > 0;\n\n // Both dialogs are code-split, so they must not be in the tree before first\n // use. Once opened they stay mounted, which keeps their close transition —\n // unmounting on close would make them vanish instead of animating out.\n const permissionsModalOpen = Boolean(\n openPermissionModal && expandedChildrenByRow,\n );\n const grantModalOpen = isOpen === 1;\n const permissionsModalUsed = useRef(false);\n const grantModalUsed = useRef(false);\n if (permissionsModalOpen) permissionsModalUsed.current = true;\n if (grantModalOpen) grantModalUsed.current = true;\n\n return (\n <AccessRightsSkeleton isLoading={isLoading || parentLoading}>\n <Box sx={{ width: \"100%\" }}>\n <CustomConfirmationModal\n description={\n selectedRow?.displayName\n ? `Remove all access to this sub menu for ${selectedRow.code === \"Role\" ? \"the role\" : \"\"} ${selectedRow.displayName}? Every right listed below will be revoked.`\n : \"Remove all access to this sub menu? Every right listed below will be revoked.\"\n }\n title={translate(\"Remove access\")}\n open={open && deletedId === selectedRow?.id}\n handleClick={handleDelete}\n handleClose={() => setOpen((cur) => !cur)}\n dataTestId=\"accessrights-delete-modal\"\n />\n <Suspense fallback={null}>\n {permissionsModalUsed.current && (\n <PermissionsModal\n isOpen={permissionsModalOpen}\n onClose={() => {\n setOpenPermissionModal((cur) => !cur);\n setExpandedChildrenByRow(null);\n setSelectedFeatureName(\"\");\n setSelectedFeatureState([]);\n }}\n featureState={selectedFeatureState}\n featureName={selectedFeatureName}\n permissions={expandedChildrenByRow}\n />\n )}\n {grantModalUsed.current && (\n <GrantPermissionModal\n isOpen={grantModalOpen}\n onClose={() => setIsOpen(0)}\n pendingGrant={pendingGrant}\n subMenuId={subMenuId}\n newApiData={newApiData}\n />\n )}\n </Suspense>\n\n {/* ── Toolbar: filter assigned access + grant new access ── */}\n <form ref={formRef} onSubmit={handleSubmit(onSubmit)}>\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { xs: \"column\", lg: \"row\" },\n alignItems: { xs: \"stretch\", lg: \"center\" },\n gap: 2,\n px: 2,\n py: 1.5,\n borderBottom: \"1px solid\",\n borderColor: \"divider\",\n }}\n >\n <DebouncedSearchInput\n value={search}\n onChange={handleSearch}\n placeholder={translate(\"Search roles and users\")}\n autoFocus={false}\n data-testid=\"access-rights-textfield-search\"\n sx={{ width: { xs: \"100%\", lg: 240 }, flexShrink: 0 }}\n slotProps={{\n htmlInput: {\n \"aria-label\": translate(\"Search roles and users\"),\n },\n }}\n inputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <Box sx={{ color: \"text.disabled\", display: \"flex\" }}>\n <FontAwesomeIcons iconName=\"faMagnifyingGlass\" size=\"sm\" />\n </Box>\n </InputAdornment>\n ),\n endAdornment: search ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n aria-label={translate(\"Clear search\")}\n onClick={() => handleSearch(\"\")}\n >\n <FontAwesomeIcons iconName=\"faXmark\" size=\"sm\" />\n </IconButton>\n </InputAdornment>\n ) : null,\n }}\n />\n {canUpdate && (\n <AccessPanel\n translate={translate}\n onSubmit={onSubmit}\n roleList={roleData}\n featureData={featureData}\n />\n )}\n </Box>\n </form>\n\n {/* ── Assigned roles & users ── */}\n {featureData.length === 0 ? (\n <Box\n data-testid=\"accessrights-empty-state\"\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n textAlign: \"center\",\n gap: 1,\n px: 3,\n py: 6,\n }}\n >\n <Box sx={{ color: \"text.disabled\" }}>\n <FontAwesomeIcons iconName=\"faUserShield\" size=\"2x\" />\n </Box>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 700 }}>\n {search\n ? translate(\"No roles or users match your search\")\n : translate(\"No access granted yet\")}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {search\n ? translate(\"Clear the search to see everyone with access.\")\n : translate(\n \"Pick a user or a role above and select Add to grant access to this sub menu.\",\n )}\n </Typography>\n </Box>\n ) : (\n <Box>\n {featureData.map((row) => (\n <Accordion\n key={row?.id}\n expanded={expanded === `panel${row?.id}`}\n onChange={handleChange(row)}\n // Only one panel is open at a time, so without this every row's\n // full permission grid stays mounted: rows × permissions\n // checkboxes in the DOM for a screen showing one row's worth.\n slotProps={{ transition: { unmountOnExit: true } }}\n >\n <AccordionSummary\n expandIcon={<FontAwesomeIcons iconName=\"faAngleDown\" />}\n aria-controls={`accessrights-panel-${row?.id}-content`}\n id={`accessrights-panel-${row?.id}-header`}\n sx={{\n \"& .MuiAccordionSummary-content\": {\n alignItems: \"center\",\n gap: 1.5,\n minWidth: 0,\n },\n }}\n >\n <Chip\n size=\"small\"\n label={translate(row.code)}\n color={row.code === \"Role\" ? \"primary\" : \"default\"}\n variant=\"outlined\"\n />\n <Typography\n variant=\"body2\"\n noWrap\n sx={{ fontWeight: 600, minWidth: 0 }}\n >\n {row.displayName}\n </Typography>\n <Box\n sx={{\n ml: \"auto\",\n mr: 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 0.5,\n }}\n >\n {canDelete && (\n <Tooltip title={translate(\"Remove access\")}>\n <IconButton\n size=\"small\"\n color=\"error\"\n aria-label={`${translate(\"Remove access\")}: ${row.displayName}`}\n data-testid=\"accessrights-delete-icon\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n setOpen(true);\n setDeletedId(row.id);\n setSelectedRow(row);\n }}\n >\n <FontAwesomeIcons iconName=\"faTrash\" size=\"sm\" />\n </IconButton>\n </Tooltip>\n )}\n {canUpdate && (\n <RowActionMenu\n config={{\n tooltip: translate(\"Bulk actions\"),\n icon: <FontAwesomeIcons iconName=\"faPen\" size=\"sm\" />,\n dataTestId: \"accessrights-edit-icon\",\n menuClick: (row) => {\n setAllData(() => {\n return {\n ...row,\n code: row.designationId ? \"Role\" : \"User\",\n menuConfigId: subMenuId,\n displayName: row.designationId\n ? row.roleName\n : row.fullName,\n };\n });\n },\n menuItems: [\n {\n label: \"Check All\",\n onClick: (row) => {\n if (isNewApi) {\n handleCheckAllAndNone({\n ...row,\n checkAll: true,\n });\n } else {\n let keys = JSON.parse(feature);\n const featureJson =\n featureNames?.length > 0\n ? featureNames.reduce(\n (acc, { feature_name }) => {\n acc[feature_name] = true;\n return acc;\n },\n {},\n )\n : Object.keys(keys).reduce((acc, key) => {\n acc[key] = true;\n return acc;\n }, {});\n setFeatureData((prev) =>\n prev.map((item) =>\n item.id === row.id\n ? {\n ...item,\n featureJson:\n JSON.stringify(featureJson),\n }\n : item,\n ),\n );\n handleUpdateUserMenuItem({\n ...allData,\n featureJson: JSON.stringify(featureJson),\n });\n }\n },\n },\n ],\n }}\n row={row}\n />\n )}\n </Box>\n </AccordionSummary>\n <AccordionDetails id={`accessrights-panel-${row?.id}-content`}>\n {!hasAnyPermission ? (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ fontStyle: \"italic\", px: 1, py: 0.5 }}\n >\n {translate(\"No rights configured for this sub menu yet\")}\n </Typography>\n ) : (\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: {\n xs: \"1fr\",\n sm: \"repeat(2, minmax(0, 1fr))\",\n lg: \"repeat(3, minmax(0, 1fr))\",\n },\n columnGap: 2,\n rowGap: 0.5,\n }}\n >\n {(() => {\n // Parsed once per expanded row instead of once per checkbox.\n const featureState = JSON.parse(row.featureJson || \"{}\");\n\n if (featureNames?.length > 0) {\n return Object.keys(featureState).map(\n (featureName, index) =>\n renderPermissionItem({\n row,\n featureState,\n featureKey: featureName,\n lookupKey:\n displayNameByFeature.get(featureName) ||\n featureName,\n index,\n withModal: true,\n }),\n );\n }\n\n return Object.keys(JSON.parse(feature || \"{}\")).map(\n (key, index) =>\n renderPermissionItem({\n row,\n featureState,\n featureKey: key,\n lookupKey: key,\n index,\n withModal: false,\n }),\n );\n })()}\n </Box>\n )}\n </AccordionDetails>\n </Accordion>\n ))}\n </Box>\n )}\n </Box>\n </AccessRightsSkeleton>\n );\n}\n\nAccessRights.propTypes = {\n subMenuId: PropTypes.any,\n subMenuGroupName: PropTypes.any,\n selectedTab: PropTypes.any,\n parentLoading: PropTypes.any,\n isNewApi: PropTypes.any,\n setIsNewApi: PropTypes.any,\n onNewAPIChange: PropTypes.any,\n subMenuFeatureVal: PropTypes.any,\n rights: PropTypes.any,\n};\n"],"names":["VIRTUALIZE_ABOVE","AccessPanel","translate","onSubmit","roleList","featureData","search","setSearch","useState","debouncedSearch","setDebouncedSearch","userList","setUserList","control","handleSubmit","reset","useForm","getCachedData","useCaching","assignedIds","useMemo","roles","users","item","newRoleList","role","useEffect","handler","userListFetch","query","currentFeatureData","fetchUsers","searchString","data","execute","userData","grantedUserIds","newArray","error","jsxs","Box","jsx","Controller","onChange","value","ref","Autocomplete","VirtualListbox","option","event","newValue","reason","newInputValue","props","label","searchTerm","index","createElement","beforeMatch","match","afterMatch","theme","alpha","params","TextField","CustomAutocomplete","Button","FontAwesomeIcons","_a","PropTypes","GrantPermissionModal","lazy","PermissionsModal","RowActionMenu","config","row","anchorEl","setAnchorEl","openMenu","handleIconClick","e","handleClose","handleItemClick","Fragment","Tooltip","IconButton","Menu","MenuItem","AccessRights","subMenuId","subMenuFeatureVal","parentLoading","onNewAPIChange","rights","formRef","useRef","submitRef","trackEvent","useTrackEvent","useLegacySummaryApiRef","featureNames","setFeatureNames","setFeatureData","initFeatureData","setinitFeatureData","roleData","setRoleData","initialROleData","setInitialRoleData","feature","setFeature","selectedUser","setSelectedUser","open","setOpen","openPermissionModal","setOpenPermissionModal","deletedId","setDeletedId","selectedRow","setSelectedRow","allData","setAllData","isLoading","setIsLoading","isNewApi","setIsNewApi","pendingGrant","setPendingGrant","permissionList","setPermissionList","isOpen","setIsOpen","useTranslateProvider","selectedFeatureName","setSelectedFeatureName","selectedFeatureState","setSelectedFeatureState","expandedChildrenByRow","setExpandedChildrenByRow","canUpdate","GeneralUtil","canDelete","permissionById","map","perm","displayNameByFeature","entry","getBasicRightId","views","reportUuidView","threeSegment","form","sortData","sortedData","a","b","editUserMenuItem","right","extendFeatureJson","handleDelete","cur","response","id","showToast","val","getFeatureDataV2","newApiData","deleteUserMenuItem","getFeatureData","_b","diffPermissions","permissions","featureJson","p","handleUpdateUserMenuItem","missing","_c","_d","updateUserMenuItem","_f","_e","handleCheckAllAndNone","uncheckedKeys","key","reportRootPattern","falseKeys","formVal","selectedRoleIds","isUserDuplicate","isRoleDuplicate","ids","featureName","reportPermissionId","postMenuItem","featureList","features","handleSearch","useCallback","searchValue","filteredData","defaultJson","assignedJson","newJson","buildPermissionMap","allPermissions","userPermissions","userPermissionIds","result","permission","setExpanded","getFeatureAccessSummaryV2","summaryError","allRoles","fetchedRoles","getRoleList","featuresRes","filteredRoles","roleType","findPermissionById","displayName","basicRightId","expanded","handleChange","isExpanded","panel","getFeaturePermissionsForIdentity","renderPermissionItem","featureState","featureKey","lookupKey","withModal","isChecked","permObj","hasChildren","isBasicRight","isDisabled","isChildrenOpen","checkbox","FormControlLabel","Checkbox","updatedFeatureState","prev","Typography","hasAnyPermission","permissionsModalOpen","grantModalOpen","permissionsModalUsed","grantModalUsed","AccessRightsSkeleton","CustomConfirmationModal","Suspense","DebouncedSearchInput","InputAdornment","Accordion","AccordionSummary","Chip","keys","acc","feature_name","AccordionDetails"],"mappings":"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"}
|