{"version":3,"file":"menuUtilities.mjs","names":["Icons","UdpPageEnums","isMobileOnly","isTablet","isDesktop","DeviceTypeEnums","MenuItemEnums","getAccessToken","TENANT_AWARE_MENU_TYPES","Page","Route","Inquiry","Report","MENU_ITEM_CONFIG_KEYS","getPageParams","parameters","Object","fromEntries","entries","filter","key","includes","getTenantAwareHref","link","user","menuItemId","currentTenantId","undefined","defaultTenantId","separator","getMenuItemsRecursively","menuItems","activeOnly","checkDeviceSize","reduce","formattedItems","item","menuItemInstance","isActive","JSON","parse","FluentIcon","WorkFlowIcon","Label","Slug","RedirectURL","AppendTokenToURL","DevicesHiddenOn","appendCurrentTenant","otherParams","redirectInfo","getFormattedSlug","formattedParameters","id","menuItemInstanceId","label","tenantHref","menuStructureId","parentId","productId","roleIds","tenantSsoId","devicesHiddenOn","params","iconName","icon","menuItemInstanceStructures","length","Desktop","Tablet","Mobile","push","slug","formattedSlug","PageId","Udp_Maintenance_Engine_Page","entityName","Udp_Data_Browser_Page","queryId","findHomeRouteInStructures","structures","isHomeRoute","state","found","findHomeRoute","menu","m","active","menuItemInstanceStructureViews","findHomeRouteSlug","getRouteRolesMapAndMenuActiveMap","updatedRolesMap","Map","updatedisMenuActiveMap","activeMenus","forEach","map","menuItemInstanceStructureView","Inner_Menu","menuparams","set","e","console","error","rolesMap","menuActiveMap"],"sources":["../../../src/utilities/menus/menuUtilities.js"],"sourcesContent":["import * as Icons from '@fluentui/react-icons';\nimport { UdpPageEnums } from '../../enums/pageEnums';\nimport { isMobileOnly, isTablet, isDesktop } from 'react-device-detect';\nimport { DeviceTypeEnums, MenuItemEnums } from '../../enums/unitySystemEnums';\nimport { getAccessToken } from '../apiHelpers';\n\n// Internal-route menu types that render as real <a href> links. For these we\n// build a tenant-carrying href variant; the menu swaps it in only on new-tab\n// interactions (right/middle/modified click) so normal SPA navigation keeps a\n// clean URL while opening in a new tab preserves the active tenant.\nconst TENANT_AWARE_MENU_TYPES = [\n  MenuItemEnums.Page,\n  MenuItemEnums.Route,\n  MenuItemEnums.Inquiry,\n  MenuItemEnums.Report\n];\n\n// Menu item parameters that configure the menu entry itself. Everything else in\n// a menu item's `parameters` blob is forwarded to the target page as params.\nconst MENU_ITEM_CONFIG_KEYS = [\n  'FluentIcon',\n  'WorkFlowIcon',\n  'AppIcon',\n  'Label',\n  'Slug',\n  'RedirectURL',\n  'AppendTokenToURL',\n  'DevicesHiddenOn',\n  'appendCurrentTenant'\n];\n\nconst getPageParams = (parameters) =>\n  Object.fromEntries(\n    Object.entries(parameters).filter(\n      ([key]) => !MENU_ITEM_CONFIG_KEYS.includes(key)\n    )\n  );\n\nconst getTenantAwareHref = (link, user, menuItemId) => {\n  if (!link || !user?.currentTenantId) return undefined;\n  if (user.currentTenantId === user.defaultTenantId) return undefined;\n  if (!TENANT_AWARE_MENU_TYPES.includes(menuItemId)) return undefined;\n  const separator = link.includes('?') ? '&' : '?';\n  return `${link}${separator}tenantId=${user.currentTenantId}`;\n};\n\nexport const getMenuItemsRecursively = (\n  menuItems,\n  activeOnly,\n  user,\n  checkDeviceSize = true\n) => {\n  return menuItems.reduce((formattedItems, item) => {\n    try {\n      if (activeOnly && !item.menuItemInstance.isActive) {\n        return formattedItems;\n      }\n      const parameters = JSON.parse(item.menuItemInstance.parameters);\n      const {\n        FluentIcon,\n        WorkFlowIcon,\n        Label,\n        Slug,\n        RedirectURL,\n        AppendTokenToURL,\n        DevicesHiddenOn,\n        appendCurrentTenant\n      } = parameters;\n      const otherParams = getPageParams(parameters);\n      let redirectInfo = '';\n      if (RedirectURL) {\n        redirectInfo = RedirectURL;\n        if (appendCurrentTenant) {\n          redirectInfo = `${RedirectURL}?tenantId=${\n            user?.currentTenantId || ''\n          }`;\n        }\n      }\n      const link = getFormattedSlug(Slug, { ...otherParams }) ?? '';\n      const formattedParameters = {\n        id: item.menuItemInstance.menuItemInstanceId,\n        label: Label ?? '',\n        link,\n        tenantHref: getTenantAwareHref(\n          link,\n          user,\n          item.menuItemInstance.menuItemId\n        ),\n        redirectInfo: redirectInfo,\n        getAccessToken:\n          getAccessToken && AppendTokenToURL ? getAccessToken : null,\n        menuItemId: item.menuItemInstance.menuItemId,\n        menuStructureId: item.menuStructureId,\n        parentId: item.parentId,\n        productId: item.menuItemInstance.productId,\n        isActive: item.menuItemInstance.isActive,\n        roleIds: item.menuItemInstance.roleIds,\n        tenantSsoId: item?.menuItemInstance?.tenantSsoId,\n        devicesHiddenOn: DevicesHiddenOn || [],\n        params: { ...otherParams }\n      };\n\n      let iconName = '';\n      if (FluentIcon) {\n        iconName = FluentIcon;\n      } else if (WorkFlowIcon) {\n        iconName = WorkFlowIcon;\n      }\n      formattedParameters.icon = iconName ? Icons[iconName] : null;\n      formattedParameters.iconName = iconName ? iconName : null;\n\n      formattedParameters['items'] = item.menuItemInstanceStructures.length\n        ? getMenuItemsRecursively(\n            item.menuItemInstanceStructures,\n            activeOnly,\n            user,\n            getAccessToken,\n            checkDeviceSize\n          )\n        : [];\n      if (checkDeviceSize) {\n        if (\n          !(\n            isDesktop &&\n            formattedParameters?.devicesHiddenOn?.includes(\n              DeviceTypeEnums.Desktop\n            )\n          ) &&\n          !(\n            isTablet &&\n            formattedParameters?.devicesHiddenOn?.includes(\n              DeviceTypeEnums.Tablet\n            )\n          ) &&\n          !(\n            isMobileOnly &&\n            formattedParameters?.devicesHiddenOn?.includes(\n              DeviceTypeEnums.Mobile\n            )\n          )\n        ) {\n          formattedItems.push(formattedParameters);\n        }\n      } else {\n        formattedItems.push(formattedParameters);\n      }\n    } catch {\n      // catching parse error\n    }\n    return formattedItems;\n  }, []);\n};\n\nconst getFormattedSlug = (slug, params) => {\n  let formattedSlug = slug;\n  if (params?.PageId === UdpPageEnums.Udp_Maintenance_Engine_Page) {\n    formattedSlug = `${slug}${\n      params?.entityName ? `?entityName=${params?.entityName}` : ''\n    }`;\n  } else if (params?.PageId === UdpPageEnums.Udp_Data_Browser_Page) {\n    formattedSlug = `${slug}?queryId=${params?.queryId}`;\n  }\n\n  return formattedSlug;\n};\n\nconst findHomeRouteInStructures = (structures) => {\n  for (const item of structures) {\n    try {\n      const parameters = JSON.parse(item.menuItemInstance.parameters);\n      if (parameters?.isHomeRoute) {\n        if (!parameters.Slug) return null;\n        // Mirror the location state a normal menu click pushes (see\n        // AppMenuItemComponent) so pages reached via the home redirect receive\n        // the same menu parameters — entityName, pbiReportCode, queryId, etc.\n        return {\n          slug: parameters.Slug,\n          state: {\n            label: parameters.Label ?? '',\n            params: getPageParams(parameters)\n          }\n        };\n      }\n    } catch {\n      // ignore parse errors\n    }\n    if (item.menuItemInstanceStructures?.length) {\n      const found = findHomeRouteInStructures(item.menuItemInstanceStructures);\n      if (found) return found;\n    }\n  }\n  return null;\n};\n\n/**\n * Locates the menu item flagged `isHomeRoute` and returns both its slug and the\n * location state to redirect with. Prefer this over findHomeRouteSlug when\n * building the `/` redirect, otherwise the home page loads without its menu\n * parameters.\n */\nexport const findHomeRoute = (menu) => {\n  for (const m of menu) {\n    if (!m.active) continue;\n    const found = findHomeRouteInStructures(\n      m.menuItemInstanceStructureViews ?? []\n    );\n    if (found) return found;\n  }\n  return null;\n};\n\nexport const findHomeRouteSlug = (menu) => findHomeRoute(menu)?.slug ?? null;\n\nexport const getRouteRolesMapAndMenuActiveMap = (menu) => {\n  const updatedRolesMap = new Map();\n  const updatedisMenuActiveMap = new Map();\n  const activeMenus = menu.filter((m) => m.active);\n  activeMenus.forEach((m) => {\n    m.menuItemInstanceStructureViews.map((menuItemInstanceStructureView) => {\n      let menuItemInstance = menuItemInstanceStructureView.menuItemInstance;\n      if (\n        menuItemInstance.menuItemId == MenuItemEnums.Route ||\n        menuItemInstance.menuItemId == MenuItemEnums.Page ||\n        menuItemInstance.menuItemId == MenuItemEnums.Report ||\n        menuItemInstance.menuItemId == MenuItemEnums.Inquiry ||\n        menuItemInstance.menuItemId == MenuItemEnums.Inner_Menu\n      ) {\n        try {\n          const menuparams = JSON.parse(menuItemInstance.parameters);\n          const slug = menuparams?.Slug;\n          updatedRolesMap.set(slug, menuItemInstance.roleIds);\n          updatedisMenuActiveMap.set(slug, menuItemInstance.isActive);\n        } catch (e) {\n          console.error('Failed to parse menu item parameters', e);\n        }\n      }\n    });\n  });\n  return { rolesMap: updatedRolesMap, menuActiveMap: updatedisMenuActiveMap };\n};\n"],"mappings":"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"}