udp-react-enterprise-component-library 25.18.4-beta.80 → 25.18.4-beta.82

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.
@@ -93,7 +93,7 @@ const MenuPage = (props) => {
93
93
  const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);
94
94
  const { setSubHeaderActionHasChildren, setNavigationExpanded } = useShellStore();
95
95
  const innerMenuId = location.pathname.replace("/menupage/", "");
96
- const [{ data: fetchedInnerMenu, loading: menuLoading }] = useAxiosGet(ConfigService.tenantV1ApiUrl, `menus/${innerMenuId}`, EMPTY_HEADERS, !innerMenuId, false);
96
+ const [{ data: fetchedInnerMenu, loading: menuLoading }] = useAxiosGet(ConfigService.tenantV1ApiUrl, `menus/${innerMenuId}`, EMPTY_HEADERS, !innerMenuId || innerMenuOverride, false);
97
97
  const innerMenu = innerMenuOverride ?? fetchedInnerMenu;
98
98
  const menuItemsList = useMemo(() => {
99
99
  if (!innerMenu) return [];
@@ -244,4 +244,4 @@ const MenuPage = (props) => {
244
244
  //#endregion
245
245
  export { MenuPage_exports as n, MenuPage as t };
246
246
 
247
- //# sourceMappingURL=MenuPage-DVw2d9oH.js.map
247
+ //# sourceMappingURL=MenuPage-vXB2NxxN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MenuPage-vXB2NxxN.js","names":[],"sources":["../src/menuPage/MenuPage.jsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useHistory, useLocation, Prompt } from 'react-router-dom';\nimport { useAxiosGet } from '../utilities/useAxiosGet';\nimport { UtilitySideBar } from '../UI/utilityDisplay/UtilitySideBar';\nimport { makeStyles } from '@material-ui/core';\nimport { PageContainer } from '../page/PageContainer';\nimport { transformMenuPageTree } from '../utilities/tree/TreeUtilities';\nimport { BaseTreeMenu } from '../treeMenu/BaseTreeMenu';\nimport { TreeViewModeEnums } from '../enums/unitySystemEnums';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { useUser } from '../utilities/auth/useUser';\nimport { useShellStore } from '../stores/shellStore';\nimport { NodeLoader } from '../UI/feedback/NodeLoader';\nimport {\n APP_RIBBON_SPACE,\n useBuildEnvironment\n} from '../shell/ui/useBuildEnvironment';\nimport { useSetLocationState } from '../hooks/useSetLocationState';\nimport { useTranslation } from 'react-i18next';\nimport { ConfigService } from '../configService';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flex: 1,\n height: '100%',\n minHeight: 0,\n display: 'grid',\n gridTemplateAreas: ['sidebar content'].map((line) => `\"${line}\"`).join(' '),\n gridTemplateColumns: 'auto 1fr',\n gridTemplateRows: 'auto 1fr'\n },\n sidebar: {\n gridArea: 'sidebar',\n marginRight: theme.spacing(1),\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0\n },\n content: {\n gridArea: 'content',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n zIndex: 1,\n height: `100%`,\n minHeight: 0,\n overflowY: 'auto'\n },\n menuContent: {\n marginTop: theme.spacing(1),\n flex: 1,\n minHeight: 0,\n overflowX: 'hidden',\n overflowY: 'auto'\n },\n loader: {\n marginRight: theme.spacing(1),\n marginLeft: theme.spacing(1)\n },\n loadingContent: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center'\n }\n}));\n\n// Define a stable constant for empty headers to prevent useEffect loops\nconst EMPTY_HEADERS = {};\n\n// Helper to find a node deep in the tree (Moved outside to ensure stability)\nconst findNodeById = (nodes, id) => {\n if (!nodes || !id) return null;\n for (const node of nodes) {\n if (String(node.id) === String(id)) return node;\n if (node.children) {\n const found = findNodeById(node.children, id);\n if (found) return found;\n }\n }\n return null;\n};\n\nconst MenuPage = (props) => {\n const buildEnv = useBuildEnvironment();\n const classes = useStyles({\n ...props,\n appRibbonSpace: buildEnv ? APP_RIBBON_SPACE : 0\n });\n const history = useHistory();\n const location = useLocation();\n const user = useUser();\n const { t } = useTranslation();\n const setLocationState = useSetLocationState();\n\n const {\n innerMenuOverride,\n mainContent,\n menuTitle,\n allowMissingPageParam = false,\n searchParamsTransformer\n } = props;\n\n // --- STATE ---\n const [sidebarExpanded, setSidebarExpanded] = useState(true);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n const { setSubHeaderActionHasChildren, setNavigationExpanded } =\n useShellStore();\n\n // --- DATA FETCHING ---\n const innerMenuId = location.pathname.replace('/menupage/', '');\n\n const [{ data: fetchedInnerMenu, loading: menuLoading }] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `menus/${innerMenuId}`,\n EMPTY_HEADERS,\n !innerMenuId || innerMenuOverride, //If no innerMenuId or an override dont make api call\n false\n );\n\n const innerMenu = innerMenuOverride ?? fetchedInnerMenu;\n\n // --- MEMOIZED DATA ---\n const menuItemsList = useMemo(() => {\n if (!innerMenu) return [];\n\n return (\n innerMenu.menuItemInstanceStructureViews?.reduce((acc, menuInstance) => {\n const updatedMenu = transformMenuPageTree(menuInstance);\n if (updatedMenu) acc.push(updatedMenu);\n return acc;\n }, []) ?? []\n );\n }, [innerMenu]);\n\n // --- CORE REFACTOR: DERIVE SELECTED NODE ---\n const pageId = new URLSearchParams(location.search).get('page');\n\n const selectedNode = useMemo(() => {\n if (!menuItemsList.length) return null;\n\n // 1. Try to find the node requested in URL\n const found = findNodeById(menuItemsList, pageId);\n if (found) return found;\n\n // 2. Default to first item\n // Even if allowMissingPageParam is true, we still want to RETURN the node for rendering,\n // we just don't want the Redirector useEffect to force it into the URL.\n return menuItemsList[0];\n }, [menuItemsList, pageId]);\n\n // Fetch Page Data based on the derived node\n const [{ data: pageData, loading: pageLoading }] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `page/${selectedNode?.properties?.page?.id}`,\n EMPTY_HEADERS,\n !selectedNode?.properties?.page?.id,\n false\n );\n\n // --- ACTIONS ---\n\n const buildSearchString = useCallback(\n (params, node, menuIndex) => {\n if (typeof searchParamsTransformer === 'function') {\n const result = searchParamsTransformer({\n searchParams: params,\n node,\n menuIndex,\n location\n });\n if (result === null) return '';\n if (result instanceof URLSearchParams) return result.toString();\n if (typeof result === 'string') return result;\n if (result !== undefined) return String(result);\n }\n return params.toString();\n },\n [location, searchParamsTransformer]\n );\n\n const handleSelectedNode = useCallback(\n (node, menuIndex) => {\n // 1. Check if we are \"selecting\" the current node to clear query params if needed\n if (allowMissingPageParam) {\n const firstNode = menuItemsList?.[0];\n if (firstNode && String(node?.id) === String(firstNode.id)) {\n if (location.search) {\n history.replace({ pathname: location.pathname, search: '' });\n }\n setHasUnsavedChanges(false);\n return;\n }\n }\n\n // 2. Build URL\n const searchParams = new URLSearchParams(location.search);\n searchParams.set('page', node.id);\n const searchString = buildSearchString(searchParams, node, menuIndex);\n\n // 3. Navigate (The URL change will trigger the re-render & selectedNode update)\n history.push({\n pathname: location.pathname,\n search: searchString\n });\n\n // Note: We don't set 'selectedNode' manually anymore. It is derived.\n },\n [history, location, allowMissingPageParam, menuItemsList, buildSearchString]\n );\n\n const handleSidebarExpandClick = useCallback(() => {\n setSidebarExpanded((expanded) => !expanded);\n }, []);\n\n const handleDropNode = useCallback(() => {\n // TODO: Implement if we need to for next Phase\n }, []);\n\n // --- EFFECTS ---\n\n // 1. URL SYNCHRONIZATION (The \"Redirector\")\n // Ensures URL matches the selected node (e.g. on initial load or default selection)\n useEffect(() => {\n if (selectedNode && !allowMissingPageParam) {\n const currentUrlId = new URLSearchParams(location.search).get('page');\n\n if (String(selectedNode.id) !== String(currentUrlId)) {\n const newParams = new URLSearchParams(location.search);\n newParams.set('page', selectedNode.id);\n\n history.replace({\n pathname: location.pathname,\n search: newParams.toString()\n });\n }\n }\n }, [selectedNode?.id, location.search, history, allowMissingPageParam]);\n\n // 2. UI CLEANUP (The \"Reactor\")\n // Runs only when the ACTUAL selected ID changes to reset UI state\n useEffect(() => {\n if (selectedNode?.id) {\n setNavigationExpanded(false);\n setHasUnsavedChanges(false);\n setSubHeaderActionHasChildren(false);\n }\n }, [selectedNode?.id, setNavigationExpanded, setSubHeaderActionHasChildren]);\n\n // 3. BREADCRUMB / LABEL SYNC\n useEffect(() => {\n if (innerMenu && location.state?.label !== t(innerMenu?.name)) {\n setLocationState({ label: t(innerMenu?.name) });\n }\n }, [setLocationState, t, innerMenu, location.state?.label]);\n\n // --- RENDER ---\n return (\n <DndProvider backend={HTML5Backend}>\n <Prompt\n when={hasUnsavedChanges}\n message='You have unsaved changes. Are you sure you want to leave this page?'\n />\n <div className={classes.root}>\n <div className={classes.sidebar}>\n <UtilitySideBar\n title={innerMenu?.name || menuTitle}\n isUsingChildren={true}\n resizable={true}\n removePadding={true}\n removeTopLayoutUnit={true}\n onUtilitySidebarToggleExpandClick={handleSidebarExpandClick}\n collapsedWidth={64}\n >\n <div className={classes.menuContent} key={innerMenuId}>\n {menuItemsList?.length > 0 &&\n !menuLoading &&\n menuItemsList.map((menuItems, index) => (\n <div key={menuItems.id} className={classes.nodeContainer}>\n <BaseTreeMenu\n menuItems={menuItems}\n onSelectNode={handleSelectedNode}\n onDropNode={handleDropNode}\n menuIndex={index}\n selectedNodeId={selectedNode?.id}\n selectedNodeParentId={selectedNode?.parentId}\n sidebarExpanded={sidebarExpanded}\n treeViewMode={TreeViewModeEnums.Classic}\n />\n </div>\n ))}\n {menuLoading && (\n <div className={classes.loader}>\n <NodeLoader loading={menuLoading} />\n </div>\n )}\n </div>\n </UtilitySideBar>\n </div>\n <div className={classes.content}>\n {mainContent\n ? typeof mainContent === 'function'\n ? mainContent({ selectedNode, menuItemsList })\n : mainContent\n : selectedNode?.properties?.page?.id && (\n <PageContainer\n user={user}\n key={selectedNode?.id}\n pageData={pageData}\n pageLoading={pageLoading}\n widgetParams={{\n pageId: pageData?.pageId,\n entityName:\n selectedNode?.properties?.page?.entity?.entityName,\n pbiReportCode:\n selectedNode?.properties?.page?.pbiReportCode,\n requiredFieldsMap:\n selectedNode?.properties?.page?.requiredFieldMapping,\n udpTagId: selectedNode?.properties?.page?.udpTagId,\n queryId: selectedNode?.properties?.page?.queryId,\n inquiryTreeId:\n selectedNode?.properties?.page?.inquiryTreeId,\n setHasUnsavedChanges: setHasUnsavedChanges\n }}\n disableMargins={true}\n fromMenu={true}\n />\n )}\n </div>\n </div>\n </DndProvider>\n );\n};\n\nexport default MenuPage;\n"],"mappings":"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"}
@@ -8,8 +8,8 @@ import { t as PageActionWrapper } from "./PageActionWrapper-BXBLPsC2.js";
8
8
  import { r as useRouteRegistry } from "./routeRegistryStore-BmhhxWS1.js";
9
9
  import { n as getMenuItemsRecursively, t as findHomeRouteSlug } from "./menuUtilities-BIiFWeWA.js";
10
10
  import { s as useMenuContext } from "./TenantProvider-r35vfTMk.js";
11
- import { t as UdpRoutes } from "./UdpRoutes-ClaIhJIi.js";
12
- import { c as NavigationSidebar, t as SiteHeader } from "./SiteHeader-vNgnheR6.js";
11
+ import { t as UdpRoutes } from "./UdpRoutes-DHN5R9Dm.js";
12
+ import { c as NavigationSidebar, t as SiteHeader } from "./SiteHeader-H3c5jsnA.js";
13
13
  import { t as FUIAppSwitcher } from "./FUIAppSwitcher-C6xv_T7_.js";
14
14
  import { t as ActionProvider } from "./ActionProvider-CEt8Z5bT.js";
15
15
  import { t as ChatBotProvider } from "./ChatBotProvider-C7FFww7I.js";
@@ -320,4 +320,4 @@ Shell.propTypes = {
320
320
  //#endregion
321
321
  export { Shell as t };
322
322
 
323
- //# sourceMappingURL=Shell-B09X7AWm.js.map
323
+ //# sourceMappingURL=Shell-BuVPO9y8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Shell-B09X7AWm.js","names":["Switch"],"sources":["../src/shell/useShellVisibility.js","../src/shell/Shell.jsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useShellStore, useSetInitialShellVisibility } from '../stores/shellStore';\n\n/**\n * Controls shell visibility based on layout flags, user presence, and route metadata.\n * Returns the effective hidden state that callers should use for rendering.\n */\nexport const useShellVisibility = ({ hideLayout, isPublicRoute, hasUser }) => {\n const { shellHidden, setShellHidden } = useShellStore();\n const shellHiddenBaselineRef = useRef();\n\n // Respect ?withoutShell on initial load\n useSetInitialShellVisibility();\n\n const syncShellHiddenWithRouteState = () => {\n const shouldForceHideShell = hideLayout || isPublicRoute || !hasUser;\n\n if (shouldForceHideShell) {\n if (shellHiddenBaselineRef.current === undefined) {\n shellHiddenBaselineRef.current = shellHidden;\n }\n if (!shellHidden) {\n setShellHidden(true);\n }\n } else if (shellHiddenBaselineRef.current !== undefined) {\n if (shellHidden !== shellHiddenBaselineRef.current) {\n setShellHidden(shellHiddenBaselineRef.current);\n } else {\n setShellHidden(false);\n }\n shellHiddenBaselineRef.current = undefined;\n } else if (shellHidden) {\n setShellHidden(false);\n }\n };\n\n useEffect(syncShellHiddenWithRouteState, [\n hideLayout,\n isPublicRoute,\n hasUser,\n setShellHidden,\n shellHidden\n ]);\n\n return shellHidden || hideLayout || isPublicRoute || !hasUser;\n};\n","import React, {\n useState,\n useEffect,\n useMemo,\n useCallback,\n Suspense\n} from 'react';\nimport { makeStyles, Drawer, useMediaQuery, useTheme } from '@material-ui/core';\nimport NavigationSidebar from './ui/NavigationSidebar';\nimport SiteHeader from './ui/SiteHeader';\nimport { UtilityBar } from '../UI/utilityDisplay/UtilityBar';\nimport { useTranslation } from 'react-i18next';\nimport FUIAppSwitcher from './ui/appSwitcher/FUIAppSwitcher';\nimport { getMenuItemsRecursively, findHomeRouteSlug } from '../utilities/menus/menuUtilities';\nimport clsx from 'clsx';\nimport { UtilitySideBar } from '../UI/utilityDisplay/UtilitySideBar';\nimport PropTypes from 'prop-types';\nimport { useUser } from '../utilities/auth/useUser';\nimport { ActionProvider } from '../utilities/provider/ActionProvider';\nimport { PageActionWrapper } from '../actions/PageActionWrapper';\nimport { useInquiryStore } from '../stores/inquiryStore';\nimport { useShellStore } from '../stores/shellStore';\n\nimport {\n useBuildEnvironment,\n APP_RIBBON_SPACE\n} from './ui/useBuildEnvironment';\nimport { ChatBotProvider } from '../utilities/chatBot/ChatBotProvider';\nimport { UserProfileMenuWrapper } from '../shell/ui/profile';\nimport { useMenuContext } from '../utilities/menus/MenuProvider';\n//import { usePreloadPages } from '../hooks/usePreloadPages';\nimport { Switch } from 'react-router-dom';\nimport { UdpRoutes } from '../routes/UdpRoutes';\nimport { useRouteRegistry } from '../routes/routeRegistryStore';\nimport { useShellVisibility } from './useShellVisibility';\nimport { PageLoading } from '../UI';\n// load the page container module so its loaded when we need it\nvoid import('../page/PageContainer');\nconst MenuTypeEnums = {\n Left_Menu: 1,\n Application_Menu: 2,\n Builders_Menu: 3,\n Favorites_Menu: 4\n};\n\nconst useStyles = makeStyles(\n (theme) => ({\n '@global': {\n html: {\n minHeight: '100%'\n },\n 'html, body, #root': {\n display: 'flex',\n flexDirection: 'column'\n },\n 'body, #root': {\n flex: 1\n }\n },\n root: {\n flex: 1,\n minHeight: '100vh',\n display: 'grid',\n gridTemplateAreas: ['sidebar header', 'sidebar content']\n .map((line) => `\"${line}\"`)\n .join(' '),\n gridTemplateColumns: 'auto 1fr',\n gridTemplateRows: 'auto 1fr'\n },\n header: {\n gridArea: 'header'\n },\n sidebar: {\n gridArea: 'sidebar'\n },\n content: {\n gridArea: 'content',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n zIndex: 1,\n height: ({ appRibbonSpace }) => `calc(100vh - ${56 + appRibbonSpace}px)`,\n overflowY: 'auto'\n },\n paper: {\n width: '100%',\n [theme.breakpoints.up('sm')]: {\n width: (props) => props.drawerWidth || 520\n }\n }\n }),\n { name: 'Layout' }\n);\n\n/**\n * Core site layout common to all pages\n */\nexport const Shell = (props) => {\n const buildEnv = useBuildEnvironment();\n const classes = useStyles({\n ...props,\n ribbonSpace: buildEnv ? APP_RIBBON_SPACE : 0\n });\n const {\n children,\n userAvatar = <UserProfileMenuWrapper />,\n appContent,\n leftMenu,\n appSelectorMenus,\n siteName,\n className,\n navRoot,\n hideToggle,\n useMockData,\n mockMenus,\n user: passedInUser,\n unityUrl,\n expander,\n sidebarTitle,\n navMenuHoverOn = false,\n secondExtended,\n toggleOne,\n toggleTwo,\n closePrimary,\n closeSecondary,\n panelExpanded,\n panelExpandedSecondary,\n setPanelExpanded = false,\n setPanelExpandedSecondary = false,\n breadCrumbAltLabelList = [],\n currentLocation,\n utilitySidebarResizable,\n utilitySidebarToggleOverride,\n onUtilitySidebarToggleExpandClick,\n hideLayout = false,\n getAccessToken,\n switcherData,\n selectedItem,\n switcherWidth,\n languages,\n projectSwitcherColor,\n getWidget,\n isValidWidget,\n appSwitcherHeader,\n hamburgerMenuAccessRole,\n hideLanguageSwitcher = false,\n subheader,\n hideHelpCenter = false,\n leftMenuLoading = false\n } = props;\n const contextUser = useUser();\n const user = passedInUser ?? contextUser;\n const { setGetWidget, setIsValidWidget } = useShellStore();\n const routeConfig = useRouteRegistry(\n (state) => state.routeMap[state.currentPath]\n );\n const isPublicRoute = routeConfig?.isPublic !== false;\n const [appSwitcherMobile, setAppSwitcherMobile] = useState(false);\n const [appSwitcherDesktop, setAppSwitcherDesktop] = useState(false);\n const { i18n } = useTranslation();\n const inquiryTitle = useInquiryStore((state) => state.title);\n\n //usePreloadPages();\n\n const menuContext = useMenuContext?.();\n const resolvedLeftMenu = useMemo(\n () => (leftMenuLoading ? [] : leftMenu ?? menuContext?.leftMenu),\n [leftMenuLoading, leftMenu, menuContext]\n );\n const homeRoute = useMemo(\n () => (leftMenu?.length ? findHomeRouteSlug(leftMenu) : menuContext?.homeRoute),\n [leftMenu, menuContext]\n );\n const resolvedAppSelectorMenus =\n appSelectorMenus ?? menuContext?.appSelectorMenus;\n const providedLanguages = languages ?? menuContext?.languages;\n const resolvedLanguages = Array.isArray(providedLanguages)\n ? providedLanguages\n : [];\n useEffect(() => {\n setGetWidget(getWidget);\n return () => setGetWidget(null);\n }, [getWidget, setGetWidget]);\n\n useEffect(() => {\n setIsValidWidget(isValidWidget);\n return () => setIsValidWidget(null);\n }, [isValidWidget, setIsValidWidget]);\n\n const effectiveShellHidden = useShellVisibility({\n hideLayout,\n isPublicRoute,\n hasUser: Boolean(user?.id)\n });\n\n const getMenuItems = useCallback(\n (menuTypeId, menus) => {\n if (!menus && !useMockData) {\n return [];\n }\n const menusToFilter = useMockData ? mockMenus : menus;\n\n const foundMenus = menusToFilter.filter(\n (menu) => menu.menuTypeId === menuTypeId && menu.active\n );\n\n if (foundMenus) {\n return foundMenus.reduce((menuItemInstanceStructureViews, menu) => {\n return [\n ...menuItemInstanceStructureViews,\n ...menu.menuItemInstanceStructureViews\n ];\n }, []);\n } else {\n return [];\n }\n },\n [useMockData, mockMenus]\n );\n\n const menus = useMemo(() => {\n const menuItems = getMenuItems(1, resolvedLeftMenu);\n return getMenuItemsRecursively(menuItems, true, user);\n }, [getMenuItems, user, resolvedLeftMenu]);\n\n const theme = useTheme();\n const mobile = useMediaQuery(theme.breakpoints.up('sm'));\n\n const handleAppSwitcher = (type, bool) => {\n if (type === 'mobile') {\n setAppSwitcherMobile(bool);\n } else {\n setAppSwitcherDesktop(bool);\n }\n };\n\n const builderMenu = useMemo(() => {\n const menuItems = getMenuItems(\n MenuTypeEnums.Builders_Menu,\n resolvedAppSelectorMenus\n );\n return getMenuItemsRecursively(menuItems, true, user, getAccessToken);\n }, [getMenuItems, user, resolvedAppSelectorMenus, getAccessToken]);\n\n const favoriteMenu = useMemo(() => {\n const menuItems = getMenuItems(\n MenuTypeEnums.Favorites_Menu,\n resolvedAppSelectorMenus\n );\n return getMenuItemsRecursively(menuItems, true, user, getAccessToken);\n }, [getMenuItems, user, resolvedAppSelectorMenus, getAccessToken]);\n\n const appMenu = useMemo(() => {\n const menuItems = getMenuItems(\n MenuTypeEnums.Application_Menu,\n resolvedAppSelectorMenus\n );\n return getMenuItemsRecursively(menuItems, true, user, getAccessToken);\n }, [getMenuItems, user, resolvedAppSelectorMenus, getAccessToken]);\n\n const hideAppMenu = useMemo(\n () =>\n !resolvedAppSelectorMenus ||\n (hamburgerMenuAccessRole &&\n !user?.roleNames.includes(hamburgerMenuAccessRole)),\n [user, resolvedAppSelectorMenus, hamburgerMenuAccessRole]\n );\n\n useEffect(() => {\n i18n.changeLanguage('en-US');\n }, [i18n]);\n\n return (\n <ChatBotProvider>\n <ActionProvider>\n <div className={classes.root}>\n {!effectiveShellHidden && (\n <SiteHeader\n className={classes.header}\n siteName={siteName}\n appContent={appContent}\n userAvatar={userAvatar}\n breadCrumbRoot={navRoot}\n setAppSwitcherOpen={(type, bool) => handleAppSwitcher(type, bool)}\n breadCrumbAltLabelList={breadCrumbAltLabelList}\n currentLocation={currentLocation}\n switcherData={switcherData}\n selectedItem={selectedItem}\n switcherWidth={switcherWidth}\n hideAppLaunch={hideAppMenu}\n languages={resolvedLanguages}\n hideLanguageSwitcher={hideLanguageSwitcher}\n backgroundColor={projectSwitcherColor}\n hideHelpCenter={hideHelpCenter}\n />\n )}\n\n <div style={{ display: 'flex' }} className={classes.sidebar}>\n {!effectiveShellHidden && mobile && (\n <NavigationSidebar\n className={classes.sidebar}\n data={menus}\n navMenuHoverOn={navMenuHoverOn}\n user={user}\n useGlobalState={true}\n leftMenuLoading={leftMenuLoading || menuContext?.leftMenuLoading}\n />\n )}\n {expander && (\n <div>\n <UtilitySideBar\n title={inquiryTitle || sidebarTitle}\n resizable={utilitySidebarResizable}\n utilitySidebarToggleOverride={utilitySidebarToggleOverride}\n onUtilitySidebarToggleExpandClick={\n onUtilitySidebarToggleExpandClick\n }\n sidebarHidden={effectiveShellHidden}\n {...props}\n />\n </div>\n )}\n </div>\n\n <div className={classes.content}>\n {!effectiveShellHidden && subheader}\n <UtilityBar\n className={clsx(className)}\n gutters={false}\n hideToggle={hideToggle}\n expander={expander}\n secondExtended={secondExtended}\n toggleOne={toggleOne}\n toggleTwo={toggleTwo}\n closePrimary={closePrimary}\n closeSecondary={closeSecondary}\n expanded={panelExpanded}\n expandedSecondary={panelExpandedSecondary}\n setExpanded={setPanelExpanded}\n setExpandedSecondary={setPanelExpandedSecondary}\n />\n\n <PageActionWrapper>\n <Suspense fallback={<PageLoading />}>\n <Switch>\n {children}\n <UdpRoutes homeRoute={homeRoute} />\n </Switch>\n </Suspense>\n </PageActionWrapper>\n </div>\n <Drawer\n variant='temporary'\n anchor='left'\n open={appSwitcherDesktop}\n classes={\n !mobile\n ? {}\n : !resolvedAppSelectorMenus\n ? {}\n : { paper: classes.paper }\n }\n onClose={() => handleAppSwitcher('desktop', false)}\n >\n {mobile && resolvedAppSelectorMenus && (\n <FUIAppSwitcher\n onClose={() => handleAppSwitcher('desktop', false)}\n favoriteMenu={favoriteMenu}\n builderMenu={builderMenu}\n appMenu={appMenu}\n unityUrl={unityUrl}\n user={user}\n header={\n appSwitcherHeader && typeof appSwitcherHeader === 'function'\n ? appSwitcherHeader(() => {\n handleAppSwitcher('desktop', false);\n })\n : appSwitcherHeader\n }\n />\n )}\n {(!mobile || (mobile && !resolvedAppSelectorMenus)) && (\n <NavigationSidebar\n toggle={false}\n className={classes.sidebar}\n data={menus}\n navMenuHoverOn={navMenuHoverOn}\n user={user}\n useGlobalState={true}\n leftMenuLoading={leftMenuLoading || menuContext?.leftMenuLoading}\n />\n )}\n </Drawer>\n\n <Drawer\n variant='temporary'\n anchor='right'\n open={appSwitcherMobile}\n classes={{ paper: classes.paper }}\n onClose={() => handleAppSwitcher('mobile', false)}\n >\n <FUIAppSwitcher\n onClose={() => handleAppSwitcher('mobile', false)}\n favoriteMenu={favoriteMenu}\n builderMenu={builderMenu}\n appMenu={appMenu}\n unityUrl={unityUrl}\n user={user}\n header={\n appSwitcherHeader && typeof appSwitcherHeader === 'function'\n ? appSwitcherHeader(() => {\n handleAppSwitcher('mobile', false);\n })\n : appSwitcherHeader\n }\n />\n </Drawer>\n </div>\n </ActionProvider>\n </ChatBotProvider>\n );\n};\n\nShell.propTypes = {\n /**\n * The newest propTypes have been added but older ones are missing @todo: add missing propTypes for Shell.\n */\n\n /**\n * The array used to map for label and functions to list items.\n */\n switcherData: PropTypes.array,\n /**\n * The active label displayed.\n */\n selectedItem: PropTypes.string,\n /**\n * Provides a method set the selector width. Default is 100.\n */\n switcherWidth: PropTypes.number,\n /**\n * Children nodes\n */\n children: PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.node),\n PropTypes.node\n ]).isRequired,\n\n /**\n * Name of site\n */\n siteName: PropTypes.string,\n\n /**\n * Component to render for the user Avatar\n */\n userAvatar: PropTypes.element,\n\n appContent: PropTypes.element,\n\n leftMenu: PropTypes.array,\n\n appSelectorMenus: PropTypes.array,\n\n className: PropTypes.object,\n\n navRoot: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.element,\n PropTypes.node\n ]),\n\n /**\n * Should the shell use mock data\n */\n useMockData: PropTypes.bool,\n\n mockMenus: PropTypes.array,\n\n unityUrl: PropTypes.string,\n\n expander: PropTypes.bool,\n\n sidebarTitle: PropTypes.string,\n\n navMenuHoverOn: PropTypes.bool,\n\n toggleOne: PropTypes.bool,\n\n toggleTwo: PropTypes.bool,\n\n closePrimary: PropTypes.bool,\n\n closeSecondary: PropTypes.bool,\n\n panelExpanded: PropTypes.bool,\n\n panelExpandedSecondary: PropTypes.bool,\n\n setPanelExpanded: PropTypes.func,\n\n setPanelExpandedSecondary: PropTypes.func,\n\n breadCrumbAltLabelList: PropTypes.array,\n\n currentLocation: PropTypes.object,\n\n utilitySidebarResizable: PropTypes.bool,\n\n utilitySidebarToggleOverride: PropTypes.bool,\n\n onUtilitySidebarToggleExpandClick: PropTypes.func,\n\n hideLayout: PropTypes.bool,\n\n languages: PropTypes.arrayOf(PropTypes.object),\n\n /**\n * Passes the background color on the project switcher (default: theme secondary)\n */\n projectSwitcherColor: PropTypes.string,\n getWidget: PropTypes.func,\n isValidWidget: PropTypes.func,\n currentTenant: PropTypes.object,\n hamburgerMenuAccessRole: PropTypes.string\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"Shell-BuVPO9y8.js","names":["Switch"],"sources":["../src/shell/useShellVisibility.js","../src/shell/Shell.jsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useShellStore, useSetInitialShellVisibility } from '../stores/shellStore';\n\n/**\n * Controls shell visibility based on layout flags, user presence, and route metadata.\n * Returns the effective hidden state that callers should use for rendering.\n */\nexport const useShellVisibility = ({ hideLayout, isPublicRoute, hasUser }) => {\n const { shellHidden, setShellHidden } = useShellStore();\n const shellHiddenBaselineRef = useRef();\n\n // Respect ?withoutShell on initial load\n useSetInitialShellVisibility();\n\n const syncShellHiddenWithRouteState = () => {\n const shouldForceHideShell = hideLayout || isPublicRoute || !hasUser;\n\n if (shouldForceHideShell) {\n if (shellHiddenBaselineRef.current === undefined) {\n shellHiddenBaselineRef.current = shellHidden;\n }\n if (!shellHidden) {\n setShellHidden(true);\n }\n } else if (shellHiddenBaselineRef.current !== undefined) {\n if (shellHidden !== shellHiddenBaselineRef.current) {\n setShellHidden(shellHiddenBaselineRef.current);\n } else {\n setShellHidden(false);\n }\n shellHiddenBaselineRef.current = undefined;\n } else if (shellHidden) {\n setShellHidden(false);\n }\n };\n\n useEffect(syncShellHiddenWithRouteState, [\n hideLayout,\n isPublicRoute,\n hasUser,\n setShellHidden,\n shellHidden\n ]);\n\n return shellHidden || hideLayout || isPublicRoute || !hasUser;\n};\n","import React, {\n useState,\n useEffect,\n useMemo,\n useCallback,\n Suspense\n} from 'react';\nimport { makeStyles, Drawer, useMediaQuery, useTheme } from '@material-ui/core';\nimport NavigationSidebar from './ui/NavigationSidebar';\nimport SiteHeader from './ui/SiteHeader';\nimport { UtilityBar } from '../UI/utilityDisplay/UtilityBar';\nimport { useTranslation } from 'react-i18next';\nimport FUIAppSwitcher from './ui/appSwitcher/FUIAppSwitcher';\nimport { getMenuItemsRecursively, findHomeRouteSlug } from '../utilities/menus/menuUtilities';\nimport clsx from 'clsx';\nimport { UtilitySideBar } from '../UI/utilityDisplay/UtilitySideBar';\nimport PropTypes from 'prop-types';\nimport { useUser } from '../utilities/auth/useUser';\nimport { ActionProvider } from '../utilities/provider/ActionProvider';\nimport { PageActionWrapper } from '../actions/PageActionWrapper';\nimport { useInquiryStore } from '../stores/inquiryStore';\nimport { useShellStore } from '../stores/shellStore';\n\nimport {\n useBuildEnvironment,\n APP_RIBBON_SPACE\n} from './ui/useBuildEnvironment';\nimport { ChatBotProvider } from '../utilities/chatBot/ChatBotProvider';\nimport { UserProfileMenuWrapper } from '../shell/ui/profile';\nimport { useMenuContext } from '../utilities/menus/MenuProvider';\n//import { usePreloadPages } from '../hooks/usePreloadPages';\nimport { Switch } from 'react-router-dom';\nimport { UdpRoutes } from '../routes/UdpRoutes';\nimport { useRouteRegistry } from '../routes/routeRegistryStore';\nimport { useShellVisibility } from './useShellVisibility';\nimport { PageLoading } from '../UI';\n// load the page container module so its loaded when we need it\nvoid import('../page/PageContainer');\nconst MenuTypeEnums = {\n Left_Menu: 1,\n Application_Menu: 2,\n Builders_Menu: 3,\n Favorites_Menu: 4\n};\n\nconst useStyles = makeStyles(\n (theme) => ({\n '@global': {\n html: {\n minHeight: '100%'\n },\n 'html, body, #root': {\n display: 'flex',\n flexDirection: 'column'\n },\n 'body, #root': {\n flex: 1\n }\n },\n root: {\n flex: 1,\n minHeight: '100vh',\n display: 'grid',\n gridTemplateAreas: ['sidebar header', 'sidebar content']\n .map((line) => `\"${line}\"`)\n .join(' '),\n gridTemplateColumns: 'auto 1fr',\n gridTemplateRows: 'auto 1fr'\n },\n header: {\n gridArea: 'header'\n },\n sidebar: {\n gridArea: 'sidebar'\n },\n content: {\n gridArea: 'content',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n zIndex: 1,\n height: ({ appRibbonSpace }) => `calc(100vh - ${56 + appRibbonSpace}px)`,\n overflowY: 'auto'\n },\n paper: {\n width: '100%',\n [theme.breakpoints.up('sm')]: {\n width: (props) => props.drawerWidth || 520\n }\n }\n }),\n { name: 'Layout' }\n);\n\n/**\n * Core site layout common to all pages\n */\nexport const Shell = (props) => {\n const buildEnv = useBuildEnvironment();\n const classes = useStyles({\n ...props,\n ribbonSpace: buildEnv ? APP_RIBBON_SPACE : 0\n });\n const {\n children,\n userAvatar = <UserProfileMenuWrapper />,\n appContent,\n leftMenu,\n appSelectorMenus,\n siteName,\n className,\n navRoot,\n hideToggle,\n useMockData,\n mockMenus,\n user: passedInUser,\n unityUrl,\n expander,\n sidebarTitle,\n navMenuHoverOn = false,\n secondExtended,\n toggleOne,\n toggleTwo,\n closePrimary,\n closeSecondary,\n panelExpanded,\n panelExpandedSecondary,\n setPanelExpanded = false,\n setPanelExpandedSecondary = false,\n breadCrumbAltLabelList = [],\n currentLocation,\n utilitySidebarResizable,\n utilitySidebarToggleOverride,\n onUtilitySidebarToggleExpandClick,\n hideLayout = false,\n getAccessToken,\n switcherData,\n selectedItem,\n switcherWidth,\n languages,\n projectSwitcherColor,\n getWidget,\n isValidWidget,\n appSwitcherHeader,\n hamburgerMenuAccessRole,\n hideLanguageSwitcher = false,\n subheader,\n hideHelpCenter = false,\n leftMenuLoading = false\n } = props;\n const contextUser = useUser();\n const user = passedInUser ?? contextUser;\n const { setGetWidget, setIsValidWidget } = useShellStore();\n const routeConfig = useRouteRegistry(\n (state) => state.routeMap[state.currentPath]\n );\n const isPublicRoute = routeConfig?.isPublic !== false;\n const [appSwitcherMobile, setAppSwitcherMobile] = useState(false);\n const [appSwitcherDesktop, setAppSwitcherDesktop] = useState(false);\n const { i18n } = useTranslation();\n const inquiryTitle = useInquiryStore((state) => state.title);\n\n //usePreloadPages();\n\n const menuContext = useMenuContext?.();\n const resolvedLeftMenu = useMemo(\n () => (leftMenuLoading ? [] : leftMenu ?? menuContext?.leftMenu),\n [leftMenuLoading, leftMenu, menuContext]\n );\n const homeRoute = useMemo(\n () => (leftMenu?.length ? findHomeRouteSlug(leftMenu) : menuContext?.homeRoute),\n [leftMenu, menuContext]\n );\n const resolvedAppSelectorMenus =\n appSelectorMenus ?? menuContext?.appSelectorMenus;\n const providedLanguages = languages ?? menuContext?.languages;\n const resolvedLanguages = Array.isArray(providedLanguages)\n ? providedLanguages\n : [];\n useEffect(() => {\n setGetWidget(getWidget);\n return () => setGetWidget(null);\n }, [getWidget, setGetWidget]);\n\n useEffect(() => {\n setIsValidWidget(isValidWidget);\n return () => setIsValidWidget(null);\n }, [isValidWidget, setIsValidWidget]);\n\n const effectiveShellHidden = useShellVisibility({\n hideLayout,\n isPublicRoute,\n hasUser: Boolean(user?.id)\n });\n\n const getMenuItems = useCallback(\n (menuTypeId, menus) => {\n if (!menus && !useMockData) {\n return [];\n }\n const menusToFilter = useMockData ? mockMenus : menus;\n\n const foundMenus = menusToFilter.filter(\n (menu) => menu.menuTypeId === menuTypeId && menu.active\n );\n\n if (foundMenus) {\n return foundMenus.reduce((menuItemInstanceStructureViews, menu) => {\n return [\n ...menuItemInstanceStructureViews,\n ...menu.menuItemInstanceStructureViews\n ];\n }, []);\n } else {\n return [];\n }\n },\n [useMockData, mockMenus]\n );\n\n const menus = useMemo(() => {\n const menuItems = getMenuItems(1, resolvedLeftMenu);\n return getMenuItemsRecursively(menuItems, true, user);\n }, [getMenuItems, user, resolvedLeftMenu]);\n\n const theme = useTheme();\n const mobile = useMediaQuery(theme.breakpoints.up('sm'));\n\n const handleAppSwitcher = (type, bool) => {\n if (type === 'mobile') {\n setAppSwitcherMobile(bool);\n } else {\n setAppSwitcherDesktop(bool);\n }\n };\n\n const builderMenu = useMemo(() => {\n const menuItems = getMenuItems(\n MenuTypeEnums.Builders_Menu,\n resolvedAppSelectorMenus\n );\n return getMenuItemsRecursively(menuItems, true, user, getAccessToken);\n }, [getMenuItems, user, resolvedAppSelectorMenus, getAccessToken]);\n\n const favoriteMenu = useMemo(() => {\n const menuItems = getMenuItems(\n MenuTypeEnums.Favorites_Menu,\n resolvedAppSelectorMenus\n );\n return getMenuItemsRecursively(menuItems, true, user, getAccessToken);\n }, [getMenuItems, user, resolvedAppSelectorMenus, getAccessToken]);\n\n const appMenu = useMemo(() => {\n const menuItems = getMenuItems(\n MenuTypeEnums.Application_Menu,\n resolvedAppSelectorMenus\n );\n return getMenuItemsRecursively(menuItems, true, user, getAccessToken);\n }, [getMenuItems, user, resolvedAppSelectorMenus, getAccessToken]);\n\n const hideAppMenu = useMemo(\n () =>\n !resolvedAppSelectorMenus ||\n (hamburgerMenuAccessRole &&\n !user?.roleNames.includes(hamburgerMenuAccessRole)),\n [user, resolvedAppSelectorMenus, hamburgerMenuAccessRole]\n );\n\n useEffect(() => {\n i18n.changeLanguage('en-US');\n }, [i18n]);\n\n return (\n <ChatBotProvider>\n <ActionProvider>\n <div className={classes.root}>\n {!effectiveShellHidden && (\n <SiteHeader\n className={classes.header}\n siteName={siteName}\n appContent={appContent}\n userAvatar={userAvatar}\n breadCrumbRoot={navRoot}\n setAppSwitcherOpen={(type, bool) => handleAppSwitcher(type, bool)}\n breadCrumbAltLabelList={breadCrumbAltLabelList}\n currentLocation={currentLocation}\n switcherData={switcherData}\n selectedItem={selectedItem}\n switcherWidth={switcherWidth}\n hideAppLaunch={hideAppMenu}\n languages={resolvedLanguages}\n hideLanguageSwitcher={hideLanguageSwitcher}\n backgroundColor={projectSwitcherColor}\n hideHelpCenter={hideHelpCenter}\n />\n )}\n\n <div style={{ display: 'flex' }} className={classes.sidebar}>\n {!effectiveShellHidden && mobile && (\n <NavigationSidebar\n className={classes.sidebar}\n data={menus}\n navMenuHoverOn={navMenuHoverOn}\n user={user}\n useGlobalState={true}\n leftMenuLoading={leftMenuLoading || menuContext?.leftMenuLoading}\n />\n )}\n {expander && (\n <div>\n <UtilitySideBar\n title={inquiryTitle || sidebarTitle}\n resizable={utilitySidebarResizable}\n utilitySidebarToggleOverride={utilitySidebarToggleOverride}\n onUtilitySidebarToggleExpandClick={\n onUtilitySidebarToggleExpandClick\n }\n sidebarHidden={effectiveShellHidden}\n {...props}\n />\n </div>\n )}\n </div>\n\n <div className={classes.content}>\n {!effectiveShellHidden && subheader}\n <UtilityBar\n className={clsx(className)}\n gutters={false}\n hideToggle={hideToggle}\n expander={expander}\n secondExtended={secondExtended}\n toggleOne={toggleOne}\n toggleTwo={toggleTwo}\n closePrimary={closePrimary}\n closeSecondary={closeSecondary}\n expanded={panelExpanded}\n expandedSecondary={panelExpandedSecondary}\n setExpanded={setPanelExpanded}\n setExpandedSecondary={setPanelExpandedSecondary}\n />\n\n <PageActionWrapper>\n <Suspense fallback={<PageLoading />}>\n <Switch>\n {children}\n <UdpRoutes homeRoute={homeRoute} />\n </Switch>\n </Suspense>\n </PageActionWrapper>\n </div>\n <Drawer\n variant='temporary'\n anchor='left'\n open={appSwitcherDesktop}\n classes={\n !mobile\n ? {}\n : !resolvedAppSelectorMenus\n ? {}\n : { paper: classes.paper }\n }\n onClose={() => handleAppSwitcher('desktop', false)}\n >\n {mobile && resolvedAppSelectorMenus && (\n <FUIAppSwitcher\n onClose={() => handleAppSwitcher('desktop', false)}\n favoriteMenu={favoriteMenu}\n builderMenu={builderMenu}\n appMenu={appMenu}\n unityUrl={unityUrl}\n user={user}\n header={\n appSwitcherHeader && typeof appSwitcherHeader === 'function'\n ? appSwitcherHeader(() => {\n handleAppSwitcher('desktop', false);\n })\n : appSwitcherHeader\n }\n />\n )}\n {(!mobile || (mobile && !resolvedAppSelectorMenus)) && (\n <NavigationSidebar\n toggle={false}\n className={classes.sidebar}\n data={menus}\n navMenuHoverOn={navMenuHoverOn}\n user={user}\n useGlobalState={true}\n leftMenuLoading={leftMenuLoading || menuContext?.leftMenuLoading}\n />\n )}\n </Drawer>\n\n <Drawer\n variant='temporary'\n anchor='right'\n open={appSwitcherMobile}\n classes={{ paper: classes.paper }}\n onClose={() => handleAppSwitcher('mobile', false)}\n >\n <FUIAppSwitcher\n onClose={() => handleAppSwitcher('mobile', false)}\n favoriteMenu={favoriteMenu}\n builderMenu={builderMenu}\n appMenu={appMenu}\n unityUrl={unityUrl}\n user={user}\n header={\n appSwitcherHeader && typeof appSwitcherHeader === 'function'\n ? appSwitcherHeader(() => {\n handleAppSwitcher('mobile', false);\n })\n : appSwitcherHeader\n }\n />\n </Drawer>\n </div>\n </ActionProvider>\n </ChatBotProvider>\n );\n};\n\nShell.propTypes = {\n /**\n * The newest propTypes have been added but older ones are missing @todo: add missing propTypes for Shell.\n */\n\n /**\n * The array used to map for label and functions to list items.\n */\n switcherData: PropTypes.array,\n /**\n * The active label displayed.\n */\n selectedItem: PropTypes.string,\n /**\n * Provides a method set the selector width. Default is 100.\n */\n switcherWidth: PropTypes.number,\n /**\n * Children nodes\n */\n children: PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.node),\n PropTypes.node\n ]).isRequired,\n\n /**\n * Name of site\n */\n siteName: PropTypes.string,\n\n /**\n * Component to render for the user Avatar\n */\n userAvatar: PropTypes.element,\n\n appContent: PropTypes.element,\n\n leftMenu: PropTypes.array,\n\n appSelectorMenus: PropTypes.array,\n\n className: PropTypes.object,\n\n navRoot: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.element,\n PropTypes.node\n ]),\n\n /**\n * Should the shell use mock data\n */\n useMockData: PropTypes.bool,\n\n mockMenus: PropTypes.array,\n\n unityUrl: PropTypes.string,\n\n expander: PropTypes.bool,\n\n sidebarTitle: PropTypes.string,\n\n navMenuHoverOn: PropTypes.bool,\n\n toggleOne: PropTypes.bool,\n\n toggleTwo: PropTypes.bool,\n\n closePrimary: PropTypes.bool,\n\n closeSecondary: PropTypes.bool,\n\n panelExpanded: PropTypes.bool,\n\n panelExpandedSecondary: PropTypes.bool,\n\n setPanelExpanded: PropTypes.func,\n\n setPanelExpandedSecondary: PropTypes.func,\n\n breadCrumbAltLabelList: PropTypes.array,\n\n currentLocation: PropTypes.object,\n\n utilitySidebarResizable: PropTypes.bool,\n\n utilitySidebarToggleOverride: PropTypes.bool,\n\n onUtilitySidebarToggleExpandClick: PropTypes.func,\n\n hideLayout: PropTypes.bool,\n\n languages: PropTypes.arrayOf(PropTypes.object),\n\n /**\n * Passes the background color on the project switcher (default: theme secondary)\n */\n projectSwitcherColor: PropTypes.string,\n getWidget: PropTypes.func,\n isValidWidget: PropTypes.func,\n currentTenant: PropTypes.object,\n hamburgerMenuAccessRole: PropTypes.string\n};\n"],"mappings":"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"}
@@ -247,7 +247,7 @@ function getDisplayName(item) {
247
247
  }
248
248
  const ShellDropdown = (props) => {
249
249
  const classes = useStyles$4();
250
- const { componentName = "Item", data = [], value = null, onChange, optionLabelDisplayFunction = getDisplayName, placeholder, className, classProps, ...other } = props;
250
+ const { componentName = "Item", data = [], value = null, onChange, optionLabelDisplayFunction = getDisplayName, groupBy, placeholder, className, classProps, ...other } = props;
251
251
  const placeholderText = placeholder ?? (!value ? `All ${componentName}s` : void 0);
252
252
  return /* @__PURE__ */ React.createElement("div", { className: `${classes.root} ${className || ""}` }, /* @__PURE__ */ React.createElement(FluentTextFieldAutoComplete, {
253
253
  className: classes.field,
@@ -257,6 +257,7 @@ const ShellDropdown = (props) => {
257
257
  },
258
258
  options: data,
259
259
  optionLabelDisplayFunction,
260
+ groupBy,
260
261
  onChange,
261
262
  value,
262
263
  placeholder: placeholderText,
@@ -624,6 +625,7 @@ const SiteHeader = (props) => {
624
625
  value: breadCrumbRoot.value,
625
626
  onChange: breadCrumbRoot.onChange,
626
627
  optionLabelDisplayFunction: breadCrumbRoot.optionLabelDisplayFunction,
628
+ groupBy: breadCrumbRoot.groupBy,
627
629
  placeholder: breadCrumbRoot.placeholder,
628
630
  className: breadCrumbRoot.className,
629
631
  classProps: breadCrumbRoot.classProps
@@ -654,4 +656,4 @@ SiteHeader.propTypes = {
654
656
  //#endregion
655
657
  export { LanguageSwitcher as a, NavigationSidebar as c, HelpCenter as i, SiteHeaderSpacer as n, ShellDropdown as o, EnvironmentRibbon as r, AmbientProjectSwitcher as s, SiteHeader as t };
656
658
 
657
- //# sourceMappingURL=SiteHeader-vNgnheR6.js.map
659
+ //# sourceMappingURL=SiteHeader-H3c5jsnA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SiteHeader-H3c5jsnA.js","names":["useStyles","useStyles","useStyles","useStyles","useStyles","useStyles","HelpOutlineIcon","CloseIcon","ChatIcon","useStyles","Typography"],"sources":["../src/shell/ui/MiniCollapsibleSidebar.jsx","../src/shell/ui/NavigationSidebar.jsx","../src/shell/ui/AmbientProjectSwitcher.jsx","../src/shell/ui/ShellDropdown.jsx","../src/shell/ui/LanguageSwitcher.jsx","../src/shell/ui/HelpCenter.jsx","../src/shell/ui/EnvironmentRibbon.tsx","../src/shell/ui/SiteHeader.jsx"],"sourcesContent":["import { Drawer, makeStyles } from '@material-ui/core'\nimport clsx from 'clsx'\nimport React from 'react'\n\nconst useStyles = makeStyles(\n (theme) => ({\n root: {\n width: theme?.dimensions?.drawerWidth,\n flexShrink: 0,\n whiteSpace: 'nowrap'\n },\n expanded: {\n '&, & > $paper': {\n // width: theme.dimensions.drawerWidth,\n width: theme.spacing(32),\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen\n })\n }\n },\n collapsed: {\n '&, & > $paper': {\n overflowX: 'hidden',\n width: theme.spacing(7) + 1,\n transition: theme?.transitions?.create('width', {\n easing: theme?.transitions?.easing?.sharp,\n duration: theme?.transitions?.duration?.leavingScreen\n })\n }\n },\n paper: {}\n }),\n { name: 'MiniCollapsibleSidebar' }\n)\n\nconst MiniCollapsibleSidebar = (props) => {\n const classes = useStyles(props)\n const { expanded = true, className, children, ...other } = props\n\n return (\n <Drawer\n variant='permanent'\n open\n {...other}\n className={clsx(\n className,\n classes.root,\n expanded ? classes.expanded : classes.collapsed\n )}\n classes={{\n root: classes.root,\n paper: classes.paper\n }}\n >\n {children}\n </Drawer>\n )\n}\n\nexport default MiniCollapsibleSidebar\n","import React, { useState, useCallback } from 'react';\nimport { makeStyles, Toolbar, lighten } from '@material-ui/core';\nimport MiniCollapsibleSidebar from './MiniCollapsibleSidebar';\nimport { SidebarCollapseButton } from './SidebarCollapseButton';\nimport { AppMenu } from '../../UI/navigation/menus/AppMenu';\nimport { useShellStore } from '../../stores/shellStore';\nimport { useBuildEnvironment, APP_RIBBON_SPACE } from './useBuildEnvironment';\nimport { MenuLoader } from '../../UI/feedback/MenuLoader';\n\nconst useStyles = makeStyles(\n (theme) => ({\n root: {\n marginTop: 400\n },\n paper: {\n backgroundColor:\n theme?.getThemeData()?.mode === 'dark'\n ? ''\n : lighten(theme?.palette?.primary?.main, 0.9),\n overflowX: 'hidden'\n },\n list: {\n flex: 1,\n paddingTop: 0,\n overflowY: 'auto',\n WebkitOverflowScrolling: 'touch'\n },\n spacer: {\n flex: 1,\n minHeight: theme.spacing(2)\n },\n footer: {},\n toolbar: {\n padding: 0,\n minHeight: ({appRibbonSpace}) => theme.spacing(6) + appRibbonSpace\n }\n }),\n { name: 'NavigationSidebar' }\n);\n\nconst NavigationSidebar = (props) => {\n const buildEnv = useBuildEnvironment()\n const classes = useStyles({appRibbonSpace: buildEnv ? APP_RIBBON_SPACE : 0});\n const {\n data,\n toggleExpandClick,\n navMenuHoverOn,\n user,\n toggle = true,\n useGlobalState = false,\n leftMenuLoading = false,\n ...other\n } = props;\n const [expanded, setExpanded] = useState(true);\n const { navigationExpanded, setNavigationExpanded } = useShellStore();\n\n let navExpanded = useGlobalState ? navigationExpanded : expanded;\n\n const [hoverExpand, setHoverExpand] = useState(false);\n\n // ** Remove for now to deal with programmatic toggle **\n // const wide = useMediaQuery(theme.breakpoints.up('sm'))\n // useEffect(() => {\n // // Set the bar to be expanded/collapsed depending on the breakpoint size\n // // This works on load and also when resizing crosses the breakpoint\n // setExpanded(wide)\n // }, [wide])\n\n const handleHoverToggle = () => {\n if (!navExpanded && navMenuHoverOn) {\n setHoverExpand(true);\n }\n };\n const handleHoverLeave = () => {\n if (!navExpanded && navMenuHoverOn) {\n setHoverExpand(false);\n }\n };\n\n const handleToggleClick = useCallback(() => {\n if (useGlobalState) {\n setNavigationExpanded(!navigationExpanded);\n } else {\n setExpanded((expanded) => !expanded);\n }\n }, [setNavigationExpanded, useGlobalState, navigationExpanded]);\n\n return (\n <MiniCollapsibleSidebar\n classes={{ root: classes.root, paper: classes.paper }}\n expanded={navExpanded || hoverExpand}\n onMouseEnter={handleHoverToggle}\n onMouseLeave={handleHoverLeave}\n PaperProps={{ elevation: 0, variant: 'outlined' }}\n {...other}\n >\n <Toolbar className={classes.toolbar} />\n\n {toggle && (\n <SidebarCollapseButton\n id='udpRecord-NavigationSidebar'\n udprecordid='udpRecord-NavigationSidebar'\n expanded={navExpanded}\n onClick={handleToggleClick}\n />\n )}\n {leftMenuLoading || !data ?\n <MenuLoader numOfPlaceholderNodes={6}/>\n :\n <AppMenu menuItems={data} sidebarExpanded={navExpanded} user={user} />\n }\n </MiniCollapsibleSidebar>\n );\n};\n\nexport default NavigationSidebar;\n","import React, { useState } from 'react'\nimport { makeStyles, Popover, Typography, useTheme } from '@material-ui/core'\nimport { ChevronDownIcon } from '@fluentui/react-icons'\nimport { FluentIconButton } from '../../UI/inputs/buttons/FluentIconButton'\nimport {AmbientPopoverMenuItem} from '../../UI/inputs/buttons/AmbientPopoverMenuItem'\nimport PropTypes from 'prop-types'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: 'flex',\n // border: '1px solid white',\n background: props => props.backgroundColor ? props.backgroundColor : theme.palette.secondary.main,\n borderRadius: 50,\n padding: 6,\n paddingLeft:16\n },\n popoverRoot: {},\n icon: {\n color: theme.palette.primary.main,\n borderRadius: 50\n }, \n label: {\n display: 'block',\n width: props => props.width ? props.width : 100,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis'\n }, \n listWrapper: {\n marginRight: theme.spacing(2)\n }\n}))\n\nexport const AmbientProjectSwitcher = (props) => {\n \n const classes = useStyles(props)\n\n const theme = useTheme()\n\n const { data, selectedItem } = props\n\n const [anchorEl, setAnchorEl] = useState(null)\n\n const handleClick = (event) => {\n setAnchorEl(event.currentTarget)\n }\n\n const handleClose = () => {\n setAnchorEl(null)\n }\n\n const open = Boolean(anchorEl)\n const id = open ? 'open' : undefined\n\n return (\n <div className={classes.root}>\n <div className={classes.listWrapper}>\n <Typography className={classes.label} > \n {selectedItem} \n </Typography>\n </div>\n \n <FluentIconButton\n className={classes.icon}\n icon={ChevronDownIcon}\n onClick={handleClick}\n style={{background: theme.palette.common.white}}\n />\n\n <Popover\n classes={{ root: classes.popoverRoot }}\n square\n elevation={6}\n id={id}\n open={open}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right'\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right'\n }}\n >\n <div >\n <div>\n {data && data.map((item) => {\n return (\n <AmbientPopoverMenuItem\n label={item.label}\n component={ChevronDownIcon}\n click={()=>item.click(item.label)}\n />\n )\n })}\n </div>\n </div>\n </Popover>\n </div>\n )\n}\n\nAmbientProjectSwitcher.propTypes = {\n /**\n * The array used to map for label and functions to list items. (array).\n */\n data: PropTypes.array,\n /**\n * The active label displayed.\n */\n selectedItem: PropTypes.string,\n /**\n * Change the background color on the project switcher (default: theme secondary)\n */\n backgroundColor: PropTypes.string\n}","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/core';\nimport { FluentTextFieldAutoComplete } from '../../UI/inputs/textField/FluentTextFieldAutoComplete';\n\nconst useStyles = makeStyles(theme => ({\n root: { display: 'flex', alignItems: 'center' },\n field: {\n minWidth: 300,\n maxWidth: 400,\n width: '100%',\n alignSelf: 'left',\n color: '#fff',\n '& .MuiOutlinedInput-root': {\n color: '#fff',\n backgroundColor: 'transparent',\n '& fieldset': {\n borderColor: 'rgba(255,255,255,0.6)',\n },\n '&:hover fieldset': {\n borderColor: 'rgba(255,255,255,0.85)',\n },\n '&.Mui-focused fieldset': {\n borderColor: '#fff',\n },\n '& input': {\n paddingTop: 4,\n paddingBottom: 4,\n height: 20,\n boxSizing: 'border-box',\n color: '#fff',\n },\n '& .MuiAutocomplete-input': {\n color: '#fff',\n },\n },\n '& .MuiInputBase-root': {\n color: '#fff',\n },\n '& .MuiAutocomplete-popupIndicator, & .MuiAutocomplete-clearIndicator': {\n color: '#fff',\n opacity: 0.95,\n },\n '& input::placeholder': {\n color: 'rgba(255,255,255,0.7)',\n },\n },\n}));\n\nfunction getDisplayName(item) {\n if (!item && item !== 0) return '';\n if (typeof item === 'string' || typeof item === 'number') return String(item);\n if (typeof item === 'object') {\n const name = item.name ?? item.label ?? item.title ?? item.displayName;\n return name !== undefined && name !== null ? String(name) : '';\n }\n return String(item);\n}\n\nexport const ShellDropdown = (props) => {\n const classes = useStyles();\n const {\n componentName = 'Item',\n data = [],\n value = null,\n onChange,\n optionLabelDisplayFunction = getDisplayName,\n groupBy,\n placeholder,\n className,\n classProps,\n ...other\n } = props;\n\n const placeholderText = placeholder ?? (!value ? `All ${componentName}s` : undefined);\n\n return (\n <div className={`${classes.root} ${className || ''}`}>\n <FluentTextFieldAutoComplete\n className={classes.field}\n classProps={{ autocompleteRoot: classes.field, ...classProps }}\n options={data}\n optionLabelDisplayFunction={optionLabelDisplayFunction}\n groupBy={groupBy}\n onChange={onChange}\n value={value}\n placeholder={placeholderText}\n {...other}\n />\n </div>\n );\n};\n\nShellDropdown.propTypes = {\n componentName: PropTypes.string,\n data: PropTypes.array,\n value: PropTypes.any,\n onChange: PropTypes.func,\n optionLabelDisplayFunction: PropTypes.func,\n placeholder: PropTypes.string,\n className: PropTypes.string,\n classProps: PropTypes.object,\n};\n\nexport default ShellDropdown;\n","import React, { useState, useRef, useEffect } from 'react'\nimport {\n ClickAwayListener,\n Grow,\n Paper,\n Popper,\n MenuList,\n makeStyles,\n IconButton,\n MenuItem\n} from '@material-ui/core'\nimport { TranslateIcon } from '@fluentui/react-icons'\nimport i18n from 'i18next';\n\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: 'flex'\n },\n paper: {\n marginRight: theme.spacing(2)\n }\n}))\n\nexport const LanguageSwitcher = (props) => {\n const classes = useStyles()\n const [open, setOpen] = useState(false)\n const anchorRef = useRef(null)\n const { languages } = props\n\n const handleToggle = () => {\n setOpen((prevOpen) => !prevOpen)\n }\n\n const handleClose = (event) => {\n if (anchorRef.current && anchorRef.current.contains(event.target)) {\n return\n }\n setOpen(false)\n }\n\n function handleListKeyDown(event) {\n if (event.key === 'Tab') {\n event.preventDefault()\n setOpen(false)\n }\n }\n\n // return focus to the button when we transitioned from !open -> open\n const prevOpen = useRef(open)\n useEffect(() => {\n if (prevOpen.current === true && open === false) {\n anchorRef.current.focus()\n }\n prevOpen.current = open\n }, [open])\n\n const handleLanguageChange = (event) => {\n const currentLanguage = event;\n //setLangKey(currentLanguage.languageCode);\n languageSelector(currentLanguage.languageCode);\n };\n\n const languageSelector = (defaultLang) => {\n i18n.changeLanguage(defaultLang);\n }\n\n if (languages != null) {\n return (\n <div id='udpRecord-LanguageSwitcher' className={classes.root}>\n <div>\n <IconButton\n id='udpRecord-LanguageSwitcher-IconButton'\n udprecordid='udpRecord-LanguageSwitcher-IconButton'\n ref={anchorRef}\n aria-controls={open ? 'menu-list-grow' : undefined}\n aria-haspopup='true'\n onClick={handleToggle}\n >\n <TranslateIcon style={{ color: 'white', opacity: 0.8 }} />\n </IconButton>\n <Popper\n open={open}\n anchorEl={anchorRef.current}\n role={undefined}\n transition\n disablePortal\n >\n {({ TransitionProps, placement }) => (\n <Grow\n {...TransitionProps}\n style={{\n transformOrigin:\n placement === 'bottom' ? 'center top' : 'center bottom'\n }}\n >\n <Paper>\n <ClickAwayListener \n id='udpRecord-LanguageSwitcher-ClickAway' \n udprecordid='udpRecord-LanguageSwitcher-ClickAway' \n onClickAway={handleClose}\n >\n <MenuList\n autoFocusItem={open}\n id='menu-list-grow'\n udprecordid='udpRecord-LanguageSwitcher-MenuList'\n onKeyDown={handleListKeyDown}\n onClick={() => setOpen(false)}\n >\n {languages.map((data) =>\n <MenuItem\n id={'udpRecord-LanguageSwitcher-MenuItem-'+data.languageLabel}\n udprecordid={'udpRecord-LanguageSwitcher-MenuItem-'+data.languageLabel}\n onClick={() => handleLanguageChange(data)}\n value={data.languageCode}\n key={data.languageId}\n >\n {data.languageLabel}\n </MenuItem>)}\n </MenuList>\n </ClickAwayListener>\n </Paper>\n </Grow>\n )}\n </Popper>\n </div>\n </div>\n )\n } else {\n return (\n null\n )\n }\n\n}","import React, { useState, useCallback, useEffect, useRef, Suspense, lazy } from 'react';\nimport {\n makeStyles,\n IconButton,\n Popover,\n Typography,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Dialog,\n DialogTitle,\n DialogContent\n} from '@material-ui/core';\nimport { HelpOutline as HelpOutlineIcon, Chat as ChatIcon, Close as CloseIcon } from '@material-ui/icons';\nimport { useActions } from '../../hooks/useActions';\nimport { useTranslation } from 'react-i18next';\nimport { useUser } from '../../../src/utilities/auth/useUser';\nimport { apiMutate } from '../../utilities/useAxiosMutate';\nimport { ConfigService } from '../../configService';\n\n// Lazy-load side sheets so they aren't imported until needed. Keep\n// module-level lazy declarations so the imports are deduped and cached.\nconst UserFormSideSheet = lazy(() => import('./user/UserFormSideSheet'));\nconst SupportCaseSideSheet = lazy(() => import('../../UI/support/SupportCaseSideSheet'));\n\n// Preload helpers (return the dynamic import promise). Calling these\n// will start fetching the chunk in the background and populate the\n// module cache so React.lazy resolves quickly later.\nconst preloadUserFormSideSheet = () => import('./user/UserFormSideSheet');\nconst preloadSupportCaseSideSheet = () => import('../../UI/support/SupportCaseSideSheet');\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: 'flex'\n },\n popover: {\n padding: theme.spacing(2),\n maxWidth: 300\n },\n icon: {\n minWidth: 40\n },\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500]\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between'\n },\n dialog: {\n minWidth: '80vw',\n minHeight: '80vh'\n }\n}));\n\nexport const HelpCenter = () => {\n const classes = useStyles();\n const { t } = useTranslation();\n const { triggerAction } = useActions();\n const user = useUser();\n const productId = Number(ConfigService.config.UNITY_PRODUCT_ID);\n\n const udpaiAPI = ConfigService.config.UDPAI_API_BASE;\n const udpaisearch = ConfigService.config.AI_SEARCH_URL;\n const udpaisearchkey = ConfigService.config.AI_SEARCH_KEY;\n const udpaisearchindex = ConfigService.config.AI_SEARCH_INDEX_NAME;\n\n const [anchorEl, setAnchorEl] = useState(null);\n const [isSupportCaseSideSheetOpen, setSupportCaseSideSheetOpen] =\n useState(false);\n const [isUserFormOpen, setUserFormOpen] = useState(false);\n const [supportCaseHealthOk, setSupportCaseHealthOk] = useState(false);\n\n const hasPreloadedRef = useRef(false);\n\n const handleOpenPopover = (event) => {\n setAnchorEl(event.currentTarget);\n\n // Preload both side sheets in the background the first time the popover opens.\n // We assume that if the user opened the popover, they might open one of the sheets.\n if (!hasPreloadedRef.current) {\n hasPreloadedRef.current = true;\n // Start background fetches but don't await them.\n try {\n preloadUserFormSideSheet();\n } catch (e) {\n // ignore preload errors\n }\n try {\n preloadSupportCaseSideSheet();\n } catch (e) {\n // ignore preload errors\n }\n }\n };\n\n const handleClosePopover = () => {\n setAnchorEl(null);\n };\n\n const handleLaunchAction = useCallback(() => {\n setAnchorEl(null);\n triggerAction('CEE75B36-01B0-4FAC-9AE7-C1AC8A2A194F');\n }, [triggerAction]);\n\n const handleOpenSupportCaseSideSheet = () => {\n setSupportCaseSideSheetOpen(true);\n setAnchorEl(null);\n };\n\n const handleCloseSupportCaseSideSheet = () => {\n setSupportCaseSideSheetOpen(false);\n };\n\n const handleOpenUserForm = () => {\n setUserFormOpen(true); // Open UserForm modal\n setAnchorEl(null);\n };\n\n const handleCloseUserForm = () => {\n setUserFormOpen(false); // Close UserForm modal\n };\n\n const open = Boolean(anchorEl);\n const id = open ? 'help-center-popover' : undefined;\n\n // Conditions for rendering buttons\n // 2 assets, 41 sandbox, 51 assets, 53 mm, 68 timesheets\n const shouldShowAddUsers = (productId) => {\n const isValidProduct = [41, 53].includes(productId);\n const isSecurityApiConfigured = !!ConfigService.securityV1ApiUrl;\n const isValidUser =\n user.can.CAN_MANAGE_ROLES_USERS &&\n user.can.CAN_MANAGE_USERS &&\n user.can.CAN_VIEW_USERS;\n return isValidProduct && isSecurityApiConfigured && isValidUser;\n };\n\n const getSupportCaseStatus = useCallback(\n async () =>\n apiMutate(\n ConfigService.productV1ApiUrl,\n `udpunitysupport/healthCheck`,\n {\n method: 'get',\n headers: {\n currentTenantId: user?.currentTenantId\n }\n }\n ),\n [user?.currentTenantId]\n );\n\n const getSupportCaseStatusUnity = useCallback(\n async () =>\n apiMutate(\n ConfigService.supportV1ApiUrl,\n `ServiceHealth/Support`,\n {\n method: 'get',\n headers: {\n currentTenantId: user?.currentTenantId\n }\n }\n ),\n [user?.currentTenantId]\n );\n\n const showAddUsers = shouldShowAddUsers(productId);\n const shouldShowChatAssistant =\n [2, 41, 51, 68].includes(productId) &&\n udpaiAPI &&\n udpaisearch &&\n udpaisearchkey &&\n udpaisearchindex;\n const shouldShowSupportTicket = productId && supportCaseHealthOk;\n\n useEffect(() => {\n const supportCaseStatus = async () => {\n try {\n if (ConfigService.config.UNITY_PRODUCT_ID === \"1\") {\n const response = await getSupportCaseStatusUnity();\n setSupportCaseHealthOk(response?.status === 200);\n } else {\n const response = await getSupportCaseStatus();\n setSupportCaseHealthOk(response?.status === 200);\n }\n } catch (error) {\n setSupportCaseHealthOk(false);\n }\n };\n supportCaseStatus();\n }, [getSupportCaseStatus, getSupportCaseStatusUnity]);\n\n // Hide the entire help center if neither button should be rendered\n if (!showAddUsers && !shouldShowChatAssistant && !shouldShowSupportTicket) {\n return <div id='udpRecord-HelpCenter' />;\n }\n\n return (\n <div id='udpRecord-HelpCenter' className={classes.root}>\n <IconButton\n id='udpRecord-HelpCenter-IconButton'\n aria-controls={id}\n aria-haspopup='true'\n onClick={handleOpenPopover}\n >\n <HelpOutlineIcon style={{ color: 'white', opacity: 0.8 }} />\n </IconButton>\n <Popover\n id={id}\n open={open}\n anchorEl={anchorEl}\n onClose={handleClosePopover}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center'\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'center'\n }}\n >\n <div className={classes.popover}>\n <div className={classes.header}>\n <Typography variant='h6'>{t('Help')}</Typography>\n <IconButton\n size='small'\n className={classes.closeButton}\n onClick={handleClosePopover}\n >\n <CloseIcon />\n </IconButton>\n </div>\n <List component='nav' aria-label='Help options'>\n {/* First Button: Add User */}\n {showAddUsers && (\n <ListItem\n button\n id='udpRecord-HelpCenter-AddUsers'\n onClick={handleOpenUserForm}\n >\n <ListItemIcon className={classes.icon}>\n <HelpOutlineIcon />\n </ListItemIcon>\n <ListItemText primary={t('Add User')} />\n </ListItem>\n )}\n\n {/* Second Button: Chat Assistant */}\n {shouldShowChatAssistant && (\n <ListItem\n button\n id='udpRecord-HelpCenter-ChatAssistant'\n onClick={handleLaunchAction}\n >\n <ListItemIcon className={classes.icon}>\n <ChatIcon />\n </ListItemIcon>\n <ListItemText primary={t('Chat Assistant')} />\n </ListItem>\n )}\n\n {/* Third Button: Submit Support Ticket */}\n {shouldShowSupportTicket && (\n <ListItem\n button\n id='udpRecord-HelpCenter-SupportTicket'\n onClick={handleOpenSupportCaseSideSheet}\n >\n <ListItemIcon className={classes.icon}>\n <HelpOutlineIcon />\n </ListItemIcon>\n <ListItemText primary={t('Submit Support Ticket')} />\n </ListItem>\n )}\n </List>\n </div>\n </Popover>\n\n {/* Modal for UserForm (lazy-loaded) */}\n <Suspense fallback={null}>\n <UserFormSideSheet open={isUserFormOpen} onClose={handleCloseUserForm} />\n </Suspense>\n\n {/* Side Sheet for Support Ticket (lazy-loaded) */}\n <Suspense fallback={null}>\n <SupportCaseSideSheet\n open={isSupportCaseSideSheetOpen}\n onClose={handleCloseSupportCaseSideSheet}\n handleCloseSupportCaseSideSheet={handleCloseSupportCaseSideSheet}\n onSubmit={(values) => {\n console.log('Form submitted', values);\n }}\n initialValues={{}}\n />\n </Suspense>\n </div>\n );\n};\n","import React, { useMemo } from 'react';\nimport { useUser } from '../../utilities/auth/useUser';\n// @ts-ignore\nimport { makeStyles } from '@material-ui/core';\nimport { useTenant } from '../../utilities/tenant/useTenant';\nimport { Typography } from '../../UI/dataDisplay/typography/Typography';\nimport { APP_RIBBON_SPACE, useBuildEnvironment } from './useBuildEnvironment';\n\n\n\nconst useStyles = makeStyles({\n root: {\n width: '100vw',\n height: APP_RIBBON_SPACE,\n backgroundColor: ({environment}: {environment: string | undefined}) => `var(--env-ribbon-${environment})`,\n color: '#ffffff', // Default white text\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n // Use CSS to handle staging text color\n '&.staging': {\n color: '#000000'\n }\n },\n\tcenterText: {\n position: 'absolute',\n left: '50%',\n transform: 'translateX(-50%)',\n fontWeight: 600\n\t},\n\trightText: {\n position: 'absolute',\n right: '10px',\n fontWeight: 500\n\t}\n});\n\nexport const EnvironmentRibbon = () => {\n\tconst tenantInfo = useTenant()\n\tconst buildEnvironment = useBuildEnvironment()\n\n const classes = useStyles({environment: buildEnvironment});\n if(!buildEnvironment) return null;\n\n return (\n <div\n className={`${classes.root} ${buildEnvironment === 'staging' ? 'staging' : ''}`}\n id='udp-environment-banner'\n >\n <Typography className={classes.centerText}>\n {buildEnvironment?.charAt(0).toUpperCase()+buildEnvironment?.slice(1) || ''}\n </Typography>\n\t\t\t<Typography className={classes.rightText}>\n {tenantInfo?.activeTenant?.tenantName}\n </Typography>\n </div>\n );\n};\n","import React from 'react';\nimport {\n AppBar,\n makeStyles,\n Toolbar,\n Typography,\n IconButton,\n useMediaQuery,\n useTheme\n} from '@material-ui/core';\nimport clsx from 'clsx';\nimport { WaffleIcon, CollapseMenuIcon } from '@fluentui/react-icons';\nimport { BreadCrumbMenu } from '../../UI/inputs/link/BreadCrumbMenu';\nimport { AmbientProjectSwitcher } from './AmbientProjectSwitcher';\nimport ShellDropdown from './ShellDropdown';\nimport { LanguageSwitcher } from './LanguageSwitcher';\nimport { HelpCenter } from './HelpCenter';\nimport { SiteHeaderRightComponentTarget } from './SiteHeaderRightComponent';\nimport PropTypes from 'prop-types';\nimport {\n useBuildEnvironment,\n APP_RIBBON_SPACE\n} from './useBuildEnvironment';\nimport { EnvironmentRibbon } from './EnvironmentRibbon';\nconst useStyles = makeStyles(\n (theme) => ({\n root: {\n color: theme?.palette?.appBar?.contrastText,\n zIndex: theme?.zIndex?.drawer + 1\n // Assume the drawer is always expanded unless the screen is too small for it and inset the left to account for it\n },\n spacer: {\n flex: 1\n },\n headerSpacer: {\n padding: 0,\n minHeight: ({ appRibbonSpace }) => 56 + appRibbonSpace\n },\n toolbar: {\n padding: 0,\n minHeight: theme.spacing(6)\n },\n appLaunch: {\n color: theme?.palette?.getContrastText(theme?.palette?.primary?.main)\n },\n avatar: {\n width: 25,\n height: 25,\n backgroundColor: theme?.palette?.secondary?.main\n },\n search: {\n marginLeft: theme.spacing(2),\n marginTop: theme.spacing(-1.35)\n },\n children: {\n flex: 1,\n minWidth: 5\n }\n }),\n { name: 'SiteHeader' }\n);\n\n/**\n * A spacing component with the same height as the SiteHeader\n */\nexport const SiteHeaderSpacer = (props) => {\n const buildEnv = useBuildEnvironment();\n const classes = useStyles({\n appRibbonSpace: buildEnv ? APP_RIBBON_SPACE : 0\n });\n const { className } = props;\n\n return <div className={clsx(className, classes.headerSpacer)} />;\n};\n\n/**\n * Site header including app bar\n */\nconst SiteHeader = (props) => {\n const classes = useStyles(props);\n const {\n className,\n returnTo,\n appContent,\n userAvatar,\n siteName,\n breadCrumbRoot = 'home',\n color = 'primary',\n setAppSwitcherOpen,\n breadCrumbAltLabelList,\n currentLocation,\n switcherData,\n selectedItem,\n switcherWidth,\n hideAppLaunch,\n languages,\n backgroundColor,\n hideLanguageSwitcher =false,\n hideHelpCenter = false,\n ...other\n } = props;\n\n const theme = useTheme();\n const mobile = useMediaQuery(theme.breakpoints.up('sm'));\n\n return (\n <>\n <AppBar\n elevation={0}\n position='fixed'\n color={color}\n {...other}\n className={className}\n classes={{ root: classes.root }}\n >\n <EnvironmentRibbon />\n <Toolbar className={classes.toolbar}>\n {mobile && !hideAppLaunch && (\n <IconButton\n className={classes.appLaunch}\n aria-label='App Launcher Menu'\n onClick={() => setAppSwitcherOpen('desktop', true)}\n >\n <WaffleIcon />\n </IconButton>\n )}\n {!mobile && (\n <IconButton\n className={classes.appLaunch}\n aria-label='App Launcher Menu'\n onClick={() => setAppSwitcherOpen('desktop', true)}\n >\n <CollapseMenuIcon />\n </IconButton>\n )}\n\n <Typography\n component='h1'\n variant='h6'\n style={{ marginLeft: hideAppLaunch && 16 }}\n >\n {siteName}\n </Typography>\n\n {mobile && (\n <div style={{ marginLeft: 70 }}>\n {React.isValidElement(breadCrumbRoot) ? (\n breadCrumbRoot\n ) : breadCrumbRoot && typeof breadCrumbRoot === 'object' && (breadCrumbRoot.data || breadCrumbRoot.componentName) ? (\n <ShellDropdown\n componentName={breadCrumbRoot.componentName}\n data={breadCrumbRoot.data}\n value={breadCrumbRoot.value}\n onChange={breadCrumbRoot.onChange}\n optionLabelDisplayFunction={breadCrumbRoot.optionLabelDisplayFunction}\n groupBy={breadCrumbRoot.groupBy}\n placeholder={breadCrumbRoot.placeholder}\n className={breadCrumbRoot.className}\n classProps={breadCrumbRoot.classProps}\n />\n ) : (\n <BreadCrumbMenu\n color='primary'\n root={breadCrumbRoot}\n breadCrumbAltLabelList={breadCrumbAltLabelList}\n />\n )}\n </div>\n )}\n <div className={classes.children}>{appContent}</div>\n {switcherData && (\n <AmbientProjectSwitcher\n data={switcherData}\n selectedItem={selectedItem}\n width={switcherWidth}\n backgroundColor={backgroundColor}\n />\n )}\n\n {!mobile && !hideAppLaunch && (\n <IconButton\n className={classes.appLaunch}\n aria-label='App Launcher Menu'\n onClick={() => setAppSwitcherOpen('mobile', true)}\n >\n <WaffleIcon />\n </IconButton>\n )}\n <div className={classes.additionalRightComponent}>\n <SiteHeaderRightComponentTarget />\n </div>\n {!hideHelpCenter && <HelpCenter />}\n {!hideLanguageSwitcher && <LanguageSwitcher languages={languages} />}\n <div>{userAvatar}</div>\n </Toolbar>\n </AppBar>\n <SiteHeaderSpacer className={className} />\n </>\n );\n};\n\nexport default SiteHeader;\n\nSiteHeader.propTypes = {\n breadCrumbRoot: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.element,\n PropTypes.node,\n PropTypes.object\n ]),\n /**\n * Passes the background color on the project switcher (default: theme secondary)\n */\n backgroundColor: PropTypes.string\n};\n"],"mappings":"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"}
@@ -135,7 +135,7 @@ const PublicRoute = ({ attemptSilentAuth = false, ...props }) => {
135
135
  //#endregion
136
136
  //#region src/routes/UdpRoutes.jsx
137
137
  const VirtualBrowser = lazy(() => import("./VirtualBrowser-CIt5keq3.js").then((n) => n.n));
138
- const MenuPage = lazy(() => import("./MenuPage-DVw2d9oH.js").then((n) => n.n));
138
+ const MenuPage = lazy(() => import("./MenuPage-vXB2NxxN.js").then((n) => n.n));
139
139
  const UdpPublicForm = lazy(() => import("./udp/pages/UdpFormsPublicForm/index.js"));
140
140
  const WorkflowContainer = lazy(() => import("./WorkflowContainer-DyZvD7sq.js").then((n) => n.n));
141
141
  const PasswordResetRedirect = lazy(() => import("./PasswordResetRedirect-BuWVcybJ.js").then((n) => n.n));
@@ -230,4 +230,4 @@ const UdpRoutes = (props) => {
230
230
  //#endregion
231
231
  export { PublicRoute as n, PrivateRoute as r, UdpRoutes as t };
232
232
 
233
- //# sourceMappingURL=UdpRoutes-ClaIhJIi.js.map
233
+ //# sourceMappingURL=UdpRoutes-DHN5R9Dm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UdpRoutes-ClaIhJIi.js","names":["PasswordResetRedirect"],"sources":["../src/routes/useRegisterRoute.ts","../src/routes/PrivateRoute.tsx","../src/routes/PublicRoute.tsx","../src/routes/UdpRoutes.jsx"],"sourcesContent":["import { useEffect } from 'react';\nimport type { Location } from 'history';\nimport { useLocation } from 'react-router-dom';\nimport { useRouteRegistry } from './routeRegistryStore';\n\ninterface UseRegisterRouteOptions {\n isPublic: boolean;\n attemptSilentAuth?: boolean;\n}\n\n/**\n * Registers the current route in the registry and keeps the current path in sync.\n * Returns the current location so callers can reuse it without calling useLocation again.\n */\nexport const useRegisterRoute = ({\n isPublic,\n attemptSilentAuth\n}: UseRegisterRouteOptions): Location => {\n const location = useLocation();\n const registerRoute = useRouteRegistry((state) => state.registerRoute);\n const setPath = useRouteRegistry((state) => state.setPath);\n\n const syncRouteRegistration = () => {\n const path = location.pathname;\n setPath(path);\n registerRoute(path, {\n isPublic,\n ...(attemptSilentAuth !== undefined ? { attemptSilentAuth } : {})\n });\n };\n\n useEffect(syncRouteRegistration, [\n attemptSilentAuth,\n isPublic,\n location.pathname,\n registerRoute,\n setPath\n ]);\n\n return location;\n};\n","import React, { useMemo } from 'react';\nimport { Route, RouteProps } from 'react-router-dom';\nimport { useTheme } from '../utilities/theme';\nimport { useTranslation } from 'react-i18next';\nimport type { RedirectRequest } from '@azure/msal-browser';\nimport { InteractionType } from '@azure/msal-browser';\nimport { MsalAuthenticationTemplate } from '@azure/msal-react';\nimport { useIsUnityAuthenticated } from '../utilities/auth/useIsUnityAuthenticated';\nimport { useUser } from '../utilities/auth/useUser';\nimport { PageForbiddenRoute } from './components/PageForbiddenRoute';\nimport { useMenuContext } from '../utilities/menus/MenuProvider';\nimport { useRegisterRoute } from './useRegisterRoute';\nimport { LoadingIndicator } from '../UI/loading/LoadingIndicator';\nimport { PasswordResetRedirect } from './components/PasswordResetRedirect';\nimport { getLoginRequest } from '../utilities/auth/signInAuthProvider';\nimport { useTenant } from '../utilities/tenant';\nimport { storeRedirectPath } from '../utilities/redirect/LocalRedirectUrlStorage';\n\n/**\n * Route guard for protected pages.\n *\n * - Triggers login redirect when the user is not authenticated.\n * - Blocks rendering until user/tenant/theme are initialized after login.\n * - Enforces tenant membership, menu activation, and role-based access.\n */\nexport interface PrivateRouteProps extends RouteProps {\n /**\n * Optional map of pathname -> required role IDs.\n * If a path is present and has roles, the user must have at least one.\n */\n rolesMap?: Map<string, string[]>;\n /**\n * Optional map of pathname -> menu active status.\n * If a path is present and inactive, access is denied.\n */\n menuActiveMap?: Map<string, boolean>;\n}\n\nexport const PrivateRoute = ({\n rolesMap: propRolesMap,\n menuActiveMap: propMenuActiveMap,\n ...routeProps\n}: PrivateRouteProps) => {\n const location = useRegisterRoute({ isPublic: false });\n const isAuthenticated = useIsUnityAuthenticated();\n const user = useUser();\n const tenant = useTenant();\n const theme = useTheme();\n const { t } = useTranslation();\n const menuContext = useMenuContext?.();\n const rolesMap = menuContext?.rolesMap ?? propRolesMap;\n const menuActiveMap = menuContext?.menuActiveMap ?? propMenuActiveMap;\n const userRoles = useMemo(() => {\n return Array.isArray(user?.roleIds) ? user.roleIds : [];\n }, [user]);\n\n const userHasAccessToTenant = useMemo(() => {\n if (user?.tenantIds?.includes(user.currentTenantId)) {\n return true;\n }\n return false;\n }, [user]);\n\n const userHasRoles = useMemo(() => {\n if (rolesMap?.size > 0) {\n if (!rolesMap.has(routeProps.location?.pathname)) {\n return false;\n }\n const routeRoles = rolesMap.get(routeProps.location?.pathname);\n if (!routeRoles?.length) {\n return true;\n }\n return routeRoles.some((element) => userRoles.includes(element));\n }\n return true;\n }, [userRoles, rolesMap, routeProps.location?.pathname]);\n\n const menuIsActive = useMemo(() => {\n if (\n menuActiveMap?.size > 0 &&\n menuActiveMap.has(routeProps.location?.pathname)\n ) {\n return menuActiveMap.get(routeProps.location?.pathname);\n }\n }, [menuActiveMap, routeProps.location?.pathname]);\n\n const activeTenant = tenant?.activeTenant ?? null;\n const isUserInitialized = Boolean(user?.id);\n const isTenantInitialized = Boolean(activeTenant?.tenantId);\n const isThemeInitialized = Boolean(theme?.isInitialized);\n\n const shouldWaitForProtectedContext =\n isAuthenticated && (!isUserInitialized || !isTenantInitialized);\n const shouldWaitForTheme = isAuthenticated && !isThemeInitialized;\n if (shouldWaitForProtectedContext || shouldWaitForTheme) {\n return <LoadingIndicator />;\n }\n\n if (!isAuthenticated) {\n storeRedirectPath(location.pathname, location.search);\n let loginRequest: RedirectRequest | null = null;\n try {\n loginRequest = getLoginRequest();\n } catch {\n loginRequest = null;\n }\n\n if (!loginRequest) {\n return <LoadingIndicator />;\n }\n\n return (\n <MsalAuthenticationTemplate\n interactionType={InteractionType.Redirect}\n authenticationRequest={loginRequest}\n loadingComponent={() => <LoadingIndicator />}\n errorComponent={(props) => <PasswordResetRedirect {...props} />}\n >\n <Route {...routeProps} />\n </MsalAuthenticationTemplate>\n );\n }\n\n if (!userHasAccessToTenant && user?.statusCode === 200) {\n return (\n <Route\n path='*'\n render={() => (\n <PageForbiddenRoute\n message={t(\n 'You do not have access to this tenant. Please select a different Tenant.'\n )}\n showButton={false}\n />\n )}\n />\n );\n }\n\n if (rolesMap?.has(routeProps.location?.pathname) && !menuIsActive) {\n return (\n <Route\n path='*'\n render={() => (\n <PageForbiddenRoute\n message={t(\n 'Trying to access inactive menu. Please check your menu configurations'\n )}\n showButton={false}\n />\n )}\n />\n );\n }\n\n if (!user?.isUnitySystemAdmin && rolesMap?.size > 0 && !userHasRoles) {\n return (\n <Route\n path='*'\n render={() => (\n <PageForbiddenRoute\n message={t(\n 'You do not have the required roles to access this page. Please contact an administrator to get access'\n )}\n showButton={false}\n />\n )}\n />\n );\n }\n\n if (user?.statusCode === 200) {\n return <Route {...routeProps} />;\n }\n\n return <LoadingIndicator />;\n};\n","import React from 'react';\nimport { Route, RouteProps } from 'react-router-dom';\nimport { useRegisterRoute } from './useRegisterRoute';\n\n/**\n * Route that is always treated as public.\n * Useful for pages that should bypass auth gating and shell blocking.\n */\nexport interface PublicRouteProps extends RouteProps {\n /**\n * When true, allows public pages to attempt silent auth for downstream calls.\n */\n attemptSilentAuth?: boolean;\n}\n\nexport const PublicRoute = ({\n attemptSilentAuth = false,\n ...props\n}: PublicRouteProps) => {\n useRegisterRoute({ isPublic: true, attemptSilentAuth });\n\n // Returns the actual Route component so it works inside Switch (v5) or as a direct route\n return <Route {...props} />;\n};\n","import React, { Suspense, lazy } from 'react';\nimport { Route, Switch, Redirect } from 'react-router-dom';\nimport { PrivateRoute } from './PrivateRoute';\nimport { UdpPageEnums } from '../enums/pageEnums';\nimport { ConfigService } from '../configService';\nimport { PageLoading } from '../UI/feedback/PageLoading';\nimport { PublicRoute } from './PublicRoute';\nimport { useMenuContext } from '../utilities/menus/MenuProvider';\n\n// Lazy load route components\nconst VirtualBrowser = lazy(() =>\n import('../maintenanceEngine/virtualBrowser/VirtualBrowser')\n);\nconst MenuPage = lazy(() => import('../menuPage/MenuPage'));\nconst UdpPublicForm = lazy(() => import('../udp/pages/UdpFormsPublicForm'));\nconst WorkflowContainer = lazy(() => import('../workflow/WorkflowContainer'));\nconst PasswordResetRedirect = lazy(() =>\n import('./components/PasswordResetRedirect')\n);\nconst MyExportsPage = lazy(() => import('../udp/export/MyExportsPage'));\nconst PageNotFoundRoute = lazy(() => import('./components/PageNotFoundRoute'));\nconst UdpMaintenanceConfigPage = lazy(() =>\n import('../udp/pages/UdpMaintenanceConfigPage')\n);\nconst UdpMaintenanceEnginePage = lazy(() =>\n import('../udp/pages/UdpMaintenanceEnginePage')\n);\nconst AadCallback = lazy(() => import('../utilities/auth/AadCallback'));\n\nconst UdpTransactionsPage = lazy(() =>\n import('../udp/pages/UdpTransactionsPage')\n);\n\nconst UdpTransactionTypesPage = lazy(() =>\n import('../udp/pages/UdpTransactionTypesPage')\n);\n\nconst PageContainer = lazy(() =>\n import('../page/PageContainer').then((module) => ({\n default: module.PageContainer\n }))\n);\n\nconst Reports = lazy(() => import('../reports/Reports'));\n\nconst Inquiry = lazy(() =>\n import('../inquiry/Inquiry').then((module) => ({ default: module.Inquiry }))\n);\n\nexport const UdpRoutes = (props) => {\n const { homeRoute, ...other } = props;\n const { leftMenuLoading } = useMenuContext();\n return (\n <Suspense fallback={<PageLoading />}>\n <Switch>\n {homeRoute && <Redirect exact from='/' to={homeRoute} />}\n {leftMenuLoading && <Route exact path='/' component={PageLoading} />}\n <PrivateRoute\n path='/virtual/:id'\n render={(props) => <VirtualBrowser {...props} {...other} />}\n />\n <PrivateRoute\n path='/menupage/:id'\n render={(props) => <MenuPage {...props} {...other} />}\n />\n\n <PublicRoute\n path={`/page/${UdpPageEnums.Udp_Forms_Renderer_Page_Public}`}\n render={(props) => <UdpPublicForm {...props} {...other} />}\n />\n <PublicRoute\n path={`/passwordresetsuccess`}\n render={(props) => <PasswordResetRedirect props={props} />}\n />\n <PrivateRoute\n path='/workflowtask/:id'\n render={(props) => <WorkflowContainer {...props} {...other} />}\n />\n <PrivateRoute\n path='/myexports'\n render={(props) => (\n <MyExportsPage\n productId={ConfigService.config.UNITY_PRODUCT_ID}\n {...props}\n {...other}\n />\n )}\n />\n <PrivateRoute\n path='/crudbrowser'\n render={(props) => <UdpMaintenanceEnginePage {...props} />}\n />\n <PrivateRoute\n path='/tablebrowser'\n render={(props) => <UdpMaintenanceConfigPage {...props} />}\n />\n\n <Route path='/aad_callback' component={AadCallback} />\n <PrivateRoute\n path='/transactionsPage'\n render={(props) => <UdpTransactionsPage {...props} />}\n />\n <PrivateRoute\n path='/transactionTypesPage'\n render={(props) => <UdpTransactionTypesPage {...props} />}\n />\n <PrivateRoute path='/reports/:id' exact component={Reports} />\n <PrivateRoute\n path='/inquiry/:id'\n render={(props) => <Inquiry {...props} />}\n />\n <PrivateRoute\n path='/page/:id'\n render={(props) => <PageContainer fromMenu={true} {...props} />}\n />\n <PrivateRoute path='*' component={PageNotFoundRoute} />\n </Switch>\n </Suspense>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"UdpRoutes-DHN5R9Dm.js","names":["PasswordResetRedirect"],"sources":["../src/routes/useRegisterRoute.ts","../src/routes/PrivateRoute.tsx","../src/routes/PublicRoute.tsx","../src/routes/UdpRoutes.jsx"],"sourcesContent":["import { useEffect } from 'react';\nimport type { Location } from 'history';\nimport { useLocation } from 'react-router-dom';\nimport { useRouteRegistry } from './routeRegistryStore';\n\ninterface UseRegisterRouteOptions {\n isPublic: boolean;\n attemptSilentAuth?: boolean;\n}\n\n/**\n * Registers the current route in the registry and keeps the current path in sync.\n * Returns the current location so callers can reuse it without calling useLocation again.\n */\nexport const useRegisterRoute = ({\n isPublic,\n attemptSilentAuth\n}: UseRegisterRouteOptions): Location => {\n const location = useLocation();\n const registerRoute = useRouteRegistry((state) => state.registerRoute);\n const setPath = useRouteRegistry((state) => state.setPath);\n\n const syncRouteRegistration = () => {\n const path = location.pathname;\n setPath(path);\n registerRoute(path, {\n isPublic,\n ...(attemptSilentAuth !== undefined ? { attemptSilentAuth } : {})\n });\n };\n\n useEffect(syncRouteRegistration, [\n attemptSilentAuth,\n isPublic,\n location.pathname,\n registerRoute,\n setPath\n ]);\n\n return location;\n};\n","import React, { useMemo } from 'react';\nimport { Route, RouteProps } from 'react-router-dom';\nimport { useTheme } from '../utilities/theme';\nimport { useTranslation } from 'react-i18next';\nimport type { RedirectRequest } from '@azure/msal-browser';\nimport { InteractionType } from '@azure/msal-browser';\nimport { MsalAuthenticationTemplate } from '@azure/msal-react';\nimport { useIsUnityAuthenticated } from '../utilities/auth/useIsUnityAuthenticated';\nimport { useUser } from '../utilities/auth/useUser';\nimport { PageForbiddenRoute } from './components/PageForbiddenRoute';\nimport { useMenuContext } from '../utilities/menus/MenuProvider';\nimport { useRegisterRoute } from './useRegisterRoute';\nimport { LoadingIndicator } from '../UI/loading/LoadingIndicator';\nimport { PasswordResetRedirect } from './components/PasswordResetRedirect';\nimport { getLoginRequest } from '../utilities/auth/signInAuthProvider';\nimport { useTenant } from '../utilities/tenant';\nimport { storeRedirectPath } from '../utilities/redirect/LocalRedirectUrlStorage';\n\n/**\n * Route guard for protected pages.\n *\n * - Triggers login redirect when the user is not authenticated.\n * - Blocks rendering until user/tenant/theme are initialized after login.\n * - Enforces tenant membership, menu activation, and role-based access.\n */\nexport interface PrivateRouteProps extends RouteProps {\n /**\n * Optional map of pathname -> required role IDs.\n * If a path is present and has roles, the user must have at least one.\n */\n rolesMap?: Map<string, string[]>;\n /**\n * Optional map of pathname -> menu active status.\n * If a path is present and inactive, access is denied.\n */\n menuActiveMap?: Map<string, boolean>;\n}\n\nexport const PrivateRoute = ({\n rolesMap: propRolesMap,\n menuActiveMap: propMenuActiveMap,\n ...routeProps\n}: PrivateRouteProps) => {\n const location = useRegisterRoute({ isPublic: false });\n const isAuthenticated = useIsUnityAuthenticated();\n const user = useUser();\n const tenant = useTenant();\n const theme = useTheme();\n const { t } = useTranslation();\n const menuContext = useMenuContext?.();\n const rolesMap = menuContext?.rolesMap ?? propRolesMap;\n const menuActiveMap = menuContext?.menuActiveMap ?? propMenuActiveMap;\n const userRoles = useMemo(() => {\n return Array.isArray(user?.roleIds) ? user.roleIds : [];\n }, [user]);\n\n const userHasAccessToTenant = useMemo(() => {\n if (user?.tenantIds?.includes(user.currentTenantId)) {\n return true;\n }\n return false;\n }, [user]);\n\n const userHasRoles = useMemo(() => {\n if (rolesMap?.size > 0) {\n if (!rolesMap.has(routeProps.location?.pathname)) {\n return false;\n }\n const routeRoles = rolesMap.get(routeProps.location?.pathname);\n if (!routeRoles?.length) {\n return true;\n }\n return routeRoles.some((element) => userRoles.includes(element));\n }\n return true;\n }, [userRoles, rolesMap, routeProps.location?.pathname]);\n\n const menuIsActive = useMemo(() => {\n if (\n menuActiveMap?.size > 0 &&\n menuActiveMap.has(routeProps.location?.pathname)\n ) {\n return menuActiveMap.get(routeProps.location?.pathname);\n }\n }, [menuActiveMap, routeProps.location?.pathname]);\n\n const activeTenant = tenant?.activeTenant ?? null;\n const isUserInitialized = Boolean(user?.id);\n const isTenantInitialized = Boolean(activeTenant?.tenantId);\n const isThemeInitialized = Boolean(theme?.isInitialized);\n\n const shouldWaitForProtectedContext =\n isAuthenticated && (!isUserInitialized || !isTenantInitialized);\n const shouldWaitForTheme = isAuthenticated && !isThemeInitialized;\n if (shouldWaitForProtectedContext || shouldWaitForTheme) {\n return <LoadingIndicator />;\n }\n\n if (!isAuthenticated) {\n storeRedirectPath(location.pathname, location.search);\n let loginRequest: RedirectRequest | null = null;\n try {\n loginRequest = getLoginRequest();\n } catch {\n loginRequest = null;\n }\n\n if (!loginRequest) {\n return <LoadingIndicator />;\n }\n\n return (\n <MsalAuthenticationTemplate\n interactionType={InteractionType.Redirect}\n authenticationRequest={loginRequest}\n loadingComponent={() => <LoadingIndicator />}\n errorComponent={(props) => <PasswordResetRedirect {...props} />}\n >\n <Route {...routeProps} />\n </MsalAuthenticationTemplate>\n );\n }\n\n if (!userHasAccessToTenant && user?.statusCode === 200) {\n return (\n <Route\n path='*'\n render={() => (\n <PageForbiddenRoute\n message={t(\n 'You do not have access to this tenant. Please select a different Tenant.'\n )}\n showButton={false}\n />\n )}\n />\n );\n }\n\n if (rolesMap?.has(routeProps.location?.pathname) && !menuIsActive) {\n return (\n <Route\n path='*'\n render={() => (\n <PageForbiddenRoute\n message={t(\n 'Trying to access inactive menu. Please check your menu configurations'\n )}\n showButton={false}\n />\n )}\n />\n );\n }\n\n if (!user?.isUnitySystemAdmin && rolesMap?.size > 0 && !userHasRoles) {\n return (\n <Route\n path='*'\n render={() => (\n <PageForbiddenRoute\n message={t(\n 'You do not have the required roles to access this page. Please contact an administrator to get access'\n )}\n showButton={false}\n />\n )}\n />\n );\n }\n\n if (user?.statusCode === 200) {\n return <Route {...routeProps} />;\n }\n\n return <LoadingIndicator />;\n};\n","import React from 'react';\nimport { Route, RouteProps } from 'react-router-dom';\nimport { useRegisterRoute } from './useRegisterRoute';\n\n/**\n * Route that is always treated as public.\n * Useful for pages that should bypass auth gating and shell blocking.\n */\nexport interface PublicRouteProps extends RouteProps {\n /**\n * When true, allows public pages to attempt silent auth for downstream calls.\n */\n attemptSilentAuth?: boolean;\n}\n\nexport const PublicRoute = ({\n attemptSilentAuth = false,\n ...props\n}: PublicRouteProps) => {\n useRegisterRoute({ isPublic: true, attemptSilentAuth });\n\n // Returns the actual Route component so it works inside Switch (v5) or as a direct route\n return <Route {...props} />;\n};\n","import React, { Suspense, lazy } from 'react';\nimport { Route, Switch, Redirect } from 'react-router-dom';\nimport { PrivateRoute } from './PrivateRoute';\nimport { UdpPageEnums } from '../enums/pageEnums';\nimport { ConfigService } from '../configService';\nimport { PageLoading } from '../UI/feedback/PageLoading';\nimport { PublicRoute } from './PublicRoute';\nimport { useMenuContext } from '../utilities/menus/MenuProvider';\n\n// Lazy load route components\nconst VirtualBrowser = lazy(() =>\n import('../maintenanceEngine/virtualBrowser/VirtualBrowser')\n);\nconst MenuPage = lazy(() => import('../menuPage/MenuPage'));\nconst UdpPublicForm = lazy(() => import('../udp/pages/UdpFormsPublicForm'));\nconst WorkflowContainer = lazy(() => import('../workflow/WorkflowContainer'));\nconst PasswordResetRedirect = lazy(() =>\n import('./components/PasswordResetRedirect')\n);\nconst MyExportsPage = lazy(() => import('../udp/export/MyExportsPage'));\nconst PageNotFoundRoute = lazy(() => import('./components/PageNotFoundRoute'));\nconst UdpMaintenanceConfigPage = lazy(() =>\n import('../udp/pages/UdpMaintenanceConfigPage')\n);\nconst UdpMaintenanceEnginePage = lazy(() =>\n import('../udp/pages/UdpMaintenanceEnginePage')\n);\nconst AadCallback = lazy(() => import('../utilities/auth/AadCallback'));\n\nconst UdpTransactionsPage = lazy(() =>\n import('../udp/pages/UdpTransactionsPage')\n);\n\nconst UdpTransactionTypesPage = lazy(() =>\n import('../udp/pages/UdpTransactionTypesPage')\n);\n\nconst PageContainer = lazy(() =>\n import('../page/PageContainer').then((module) => ({\n default: module.PageContainer\n }))\n);\n\nconst Reports = lazy(() => import('../reports/Reports'));\n\nconst Inquiry = lazy(() =>\n import('../inquiry/Inquiry').then((module) => ({ default: module.Inquiry }))\n);\n\nexport const UdpRoutes = (props) => {\n const { homeRoute, ...other } = props;\n const { leftMenuLoading } = useMenuContext();\n return (\n <Suspense fallback={<PageLoading />}>\n <Switch>\n {homeRoute && <Redirect exact from='/' to={homeRoute} />}\n {leftMenuLoading && <Route exact path='/' component={PageLoading} />}\n <PrivateRoute\n path='/virtual/:id'\n render={(props) => <VirtualBrowser {...props} {...other} />}\n />\n <PrivateRoute\n path='/menupage/:id'\n render={(props) => <MenuPage {...props} {...other} />}\n />\n\n <PublicRoute\n path={`/page/${UdpPageEnums.Udp_Forms_Renderer_Page_Public}`}\n render={(props) => <UdpPublicForm {...props} {...other} />}\n />\n <PublicRoute\n path={`/passwordresetsuccess`}\n render={(props) => <PasswordResetRedirect props={props} />}\n />\n <PrivateRoute\n path='/workflowtask/:id'\n render={(props) => <WorkflowContainer {...props} {...other} />}\n />\n <PrivateRoute\n path='/myexports'\n render={(props) => (\n <MyExportsPage\n productId={ConfigService.config.UNITY_PRODUCT_ID}\n {...props}\n {...other}\n />\n )}\n />\n <PrivateRoute\n path='/crudbrowser'\n render={(props) => <UdpMaintenanceEnginePage {...props} />}\n />\n <PrivateRoute\n path='/tablebrowser'\n render={(props) => <UdpMaintenanceConfigPage {...props} />}\n />\n\n <Route path='/aad_callback' component={AadCallback} />\n <PrivateRoute\n path='/transactionsPage'\n render={(props) => <UdpTransactionsPage {...props} />}\n />\n <PrivateRoute\n path='/transactionTypesPage'\n render={(props) => <UdpTransactionTypesPage {...props} />}\n />\n <PrivateRoute path='/reports/:id' exact component={Reports} />\n <PrivateRoute\n path='/inquiry/:id'\n render={(props) => <Inquiry {...props} />}\n />\n <PrivateRoute\n path='/page/:id'\n render={(props) => <PageContainer fromMenu={true} {...props} />}\n />\n <PrivateRoute path='*' component={PageNotFoundRoute} />\n </Switch>\n </Suspense>\n );\n};\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -151,7 +151,7 @@ import { t as PageStatus } from "./PageStatus-C-kVMouE.js";
151
151
  import { t as PageForbiddenRoute } from "./PageForbiddenRoute-LzOoMfuJ.js";
152
152
  import { n as getMenuItemsRecursively, r as getRouteRolesMapAndMenuActiveMap, t as findHomeRouteSlug } from "./menuUtilities-BIiFWeWA.js";
153
153
  import { n as useLocalUserActions, o as MenuProvider, r as useUserActions, s as useMenuContext } from "./TenantProvider-r35vfTMk.js";
154
- import { n as PublicRoute, r as PrivateRoute, t as UdpRoutes } from "./UdpRoutes-ClaIhJIi.js";
154
+ import { n as PublicRoute, r as PrivateRoute, t as UdpRoutes } from "./UdpRoutes-DHN5R9Dm.js";
155
155
  import { LoadingIndicator } from "./UI/loading/LoadingIndicator/index.js";
156
156
  import { a as storePath, i as storeInitialPath, n as getStoredPath, o as storeRedirectPath, r as storeCurrentPath, t as clearStoredPath } from "./LocalRedirectUrlStorage-D46ZyuMk.js";
157
157
  import { t as PasswordResetRedirect } from "./PasswordResetRedirect-BuWVcybJ.js";
@@ -159,7 +159,7 @@ import { t as useTenant } from "./useTenant-DryxTalu.js";
159
159
  import { Link, NavLink, Prompt, Redirect, Route, Switch, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter } from "./routes/index.js";
160
160
  import { t as PageNotFoundRoute } from "./PageNotFoundRoute-CAao-TQj.js";
161
161
  import "./routes/components/index.js";
162
- import { o as ShellDropdown, s as AmbientProjectSwitcher } from "./SiteHeader-vNgnheR6.js";
162
+ import { o as ShellDropdown, s as AmbientProjectSwitcher } from "./SiteHeader-H3c5jsnA.js";
163
163
  import { t as BreadCrumbMenu } from "./BreadCrumbMenu-DrvW8bI4.js";
164
164
  import { n as SubHeaderActionsTarget, t as SubHeaderAction } from "./SubHeaderAction-fXlK9QBW.js";
165
165
  import { i as InquiryHeaderTitleTarget, n as InquiryHeaderControlTarget, r as InquiryHeaderTitle, t as InquiryHeaderControl } from "./InquiryHeaderControl-Deqt--uV.js";
@@ -170,7 +170,7 @@ import { n as FluentProfileMenuCard } from "./profile-grsbAKwd.js";
170
170
  import { n as getStoredExternalPath, r as storeExternalPath, t as clearStoredExternalPath } from "./ExternalRedirectUrlStorage-B80_V9pU.js";
171
171
  import { n as createUser, t as AuthProvider } from "./AuthProvider-BUi9oEtK.js";
172
172
  import { AuthProviderWrapper, useAccessToken, useSingleLogout } from "./utilities/auth/index.js";
173
- import { t as Shell } from "./Shell-B09X7AWm.js";
173
+ import { t as Shell } from "./Shell-BuVPO9y8.js";
174
174
  import { UdpStepper } from "./UI/stepper/index.js";
175
175
  import { n as FluentSimpleTab, t as FluentSimpleTabs } from "./FluentSimpleTabs-DESD8CK6.js";
176
176
  import { PAHAdditionalTitleComponent, UtilityTabHeader } from "./UI/utilityDisplay/utilityHeader/index.js";
@@ -262,7 +262,7 @@ import { i as allowedExtensions, n as UdpTransactionsPage, r as MAX_FILE_SIZE_MB
262
262
  import { AccountFlags } from "./UI/dataDisplay/status/index.js";
263
263
  import { FormHeader, FormSubHeader, StylizedTitle } from "./UI/dataDisplay/typography/index.js";
264
264
  import { t as Attachments } from "./uploader-ERbYW4sH.js";
265
- import { t as CustomMenuPage } from "./menuPage-mjF6LMmH.js";
265
+ import { t as CustomMenuPage } from "./menuPage-DRsMsPbn.js";
266
266
  import { t as StatusCellRenderer } from "./StatusCellRenderer-DjUTLj2k.js";
267
267
  import { UdpFormsSubmissionGrid } from "./udp/pages/UdpFormsSubmissionGrid/index.js";
268
268
  import { n as UdpFormsSubmissionGridManagerPage } from "./UdpFormsSubmissionGridManagerPage-BjwGpOjy.js";
@@ -1,2 +1,2 @@
1
- import { t as CustomMenuPage } from "../menuPage-mjF6LMmH.js";
1
+ import { t as CustomMenuPage } from "../menuPage-DRsMsPbn.js";
2
2
  export { CustomMenuPage };
@@ -1,4 +1,4 @@
1
- import { t as MenuPage } from "./MenuPage-DVw2d9oH.js";
1
+ import { t as MenuPage } from "./MenuPage-vXB2NxxN.js";
2
2
  import React, { useMemo } from "react";
3
3
  import { makeStyles } from "@material-ui/core";
4
4
  import PropTypes from "prop-types";
@@ -96,4 +96,4 @@ CustomMenuPage.propTypes = {
96
96
  //#endregion
97
97
  export { CustomMenuPage as t };
98
98
 
99
- //# sourceMappingURL=menuPage-mjF6LMmH.js.map
99
+ //# sourceMappingURL=menuPage-DRsMsPbn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"menuPage-mjF6LMmH.js","names":[],"sources":["../src/menuPage/CustomMenuPage.jsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport MenuPage from './MenuPage';\nimport { makeStyles, Typography } from '@material-ui/core';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1\n // padding: theme.spacing(1),\n }\n}));\n\nfunction buildInnerMenuFromItems(\n items = [],\n menuTitle,\n idPrefix = 'custom',\n showItemCount = false,\n itemCountAccessor = null\n) {\n const idMap = {};\n const views = (items || []).map((item, idx) => {\n const itemKey = item.id ?? item.ID ?? item.groupID ?? idx;\n const menuStructureId = `${idPrefix}-${itemKey}`;\n\n // compute optional count using accessor\n let itemCount = null;\n if (showItemCount && typeof itemCountAccessor === 'function') {\n try {\n const cnt = itemCountAccessor(item);\n if (cnt !== undefined && cnt !== null) {\n itemCount = cnt;\n }\n } catch (e) {}\n }\n\n idMap[menuStructureId] = item;\n item.__menuStructureId = menuStructureId;\n item.__itemKey = itemKey;\n\n const parametersObj = {\n FluentIcon: 'PageListIcon',\n PageId: '',\n defaultDisplay: 'expanded'\n };\n if (itemCount !== null && itemCount !== undefined) {\n parametersObj.itemCount = itemCount;\n }\n\n return {\n menuStructureId,\n menuItemInstance: {\n menuItemInstanceId: `${idPrefix}-item-${itemKey}`,\n clusterId: null,\n menuItemId: null,\n name: item.name ?? '',\n parameters: JSON.stringify(parametersObj),\n isActive: true,\n roleIds: [],\n groupIds: [],\n tenantSsoId: null,\n parentMenuItemInstanceId: null,\n items: null\n },\n title: item.name ?? '',\n order: idx,\n parentId: null,\n unsubscribed: false,\n menuItemInstanceStructures: []\n };\n });\n\n const innerMenu = {\n // set the inner menu name only when client provided a menuTitle; leave blank when not provided\n name: menuTitle ? menuTitle : '',\n menuItemInstanceStructureViews: views\n };\n\n return { innerMenu, idMap };\n}\n\nconst CustomMenuPage = ({\n items = [],\n className = '',\n menuTitle,\n mainContent: clientMainContent,\n idPrefix = 'custom',\n showItemCount = false,\n itemCountAccessor = null,\n allowMissingPageParam = false,\n searchParamsTransformer = null\n}) => {\n const classes = useStyles();\n\n const { innerMenu, idMap } = useMemo(\n () =>\n buildInnerMenuFromItems(\n items,\n menuTitle,\n idPrefix,\n showItemCount,\n itemCountAccessor\n ),\n [items, menuTitle, idPrefix, showItemCount, itemCountAccessor]\n );\n\n // Expect client application to provide mainContent. If not provided, render an empty container.\n const clientContent = clientMainContent\n ? ({ selectedNode, menuItemsList }) =>\n clientMainContent({\n selectedNode,\n menuItemsList,\n idMap,\n items,\n classes,\n className\n })\n : ({ selectedNode, menuItemsList }) => (\n <div className={`${classes.root} ${className}`} />\n );\n\n const composedMainContent = ({ selectedNode, menuItemsList }) => (\n <div className={`${classes.root} ${className}`}>\n {clientContent({ selectedNode, menuItemsList })}\n </div>\n );\n\n return (\n <MenuPage\n innerMenuOverride={innerMenu}\n mainContent={composedMainContent}\n menuTitle={menuTitle}\n allowMissingPageParam={allowMissingPageParam}\n searchParamsTransformer={searchParamsTransformer}\n />\n );\n};\n\nCustomMenuPage.propTypes = {\n items: PropTypes.array,\n className: PropTypes.string,\n menuTitle: PropTypes.string,\n mainContent: PropTypes.func,\n idPrefix: PropTypes.string,\n showItemCount: PropTypes.bool,\n itemCountAccessor: PropTypes.func,\n allowMissingPageParam: PropTypes.bool,\n searchParamsTransformer: PropTypes.func\n};\n\nexport default CustomMenuPage;\n"],"mappings":";;;;;AAKA,MAAM,YAAY,YAAY,WAAW,EACvC,MAAM,EACJ,UAAU,GAEX,EACF,EAAE;AAEH,SAAS,wBACP,QAAQ,EAAE,EACV,WACA,WAAW,UACX,gBAAgB,OAChB,oBAAoB,MACpB;CACA,MAAM,QAAQ,EAAE;CAChB,MAAM,SAAS,SAAS,EAAE,EAAE,KAAK,MAAM,QAAQ;EAC7C,MAAM,UAAU,KAAK,MAAM,KAAK,MAAM,KAAK,WAAW;EACtD,MAAM,kBAAkB,GAAG,SAAS,GAAG;EAGvC,IAAI,YAAY;AAChB,MAAI,iBAAiB,OAAO,sBAAsB,WAChD,KAAI;GACF,MAAM,MAAM,kBAAkB,KAAK;AACnC,OAAI,QAAQ,KAAA,KAAa,QAAQ,KAC/B,aAAY;WAEP,GAAG;AAGd,QAAM,mBAAmB;AACzB,OAAK,oBAAoB;AACzB,OAAK,YAAY;EAEjB,MAAM,gBAAgB;GACpB,YAAY;GACZ,QAAQ;GACR,gBAAgB;GACjB;AACD,MAAI,cAAc,QAAQ,cAAc,KAAA,EACtC,eAAc,YAAY;AAG5B,SAAO;GACL;GACA,kBAAkB;IAChB,oBAAoB,GAAG,SAAS,QAAQ;IACxC,WAAW;IACX,YAAY;IACZ,MAAM,KAAK,QAAQ;IACnB,YAAY,KAAK,UAAU,cAAc;IACzC,UAAU;IACV,SAAS,EAAE;IACX,UAAU,EAAE;IACZ,aAAa;IACb,0BAA0B;IAC1B,OAAO;IACR;GACD,OAAO,KAAK,QAAQ;GACpB,OAAO;GACP,UAAU;GACV,cAAc;GACd,4BAA4B,EAAE;GAC/B;GACD;AAQF,QAAO;EAAE,WANS;GAEhB,MAAM,YAAY,YAAY;GAC9B,gCAAgC;GACjC;EAEmB;EAAO;;AAG7B,MAAM,kBAAkB,EACtB,QAAQ,EAAE,EACV,YAAY,IACZ,WACA,aAAa,mBACb,WAAW,UACX,gBAAgB,OAChB,oBAAoB,MACpB,wBAAwB,OACxB,0BAA0B,WACtB;CACJ,MAAM,UAAU,WAAW;CAE5B,MAAM,EAAE,WAAW,UAAU,cAExB,wBACE,OACA,WACA,UACA,eACA,kBACD,EACH;EAAC;EAAO;EAAW;EAAU;EAAe;EAAkB,CAC/D;CAGD,MAAM,gBAAgB,qBACjB,EAAE,cAAc,oBACf,kBAAkB;EAChB;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,IACH,EAAE,cAAc,oBACf,sBAAA,cAAC,OAAD,EAAK,WAAW,GAAG,QAAQ,KAAK,GAAG,aAAe,CAAA;CAGxD,MAAM,uBAAuB,EAAE,cAAc,oBAC3C,sBAAA,cAAC,OAAD,EAAK,WAAW,GAAG,QAAQ,KAAK,GAAG,aAE7B,EADH,cAAc;EAAE;EAAc;EAAe,CAAC,CAC3C;AAGR,QACE,sBAAA,cAAC,UAAD;EACE,mBAAmB;EACnB,aAAa;EACF;EACY;EACE;EACzB,CAAA;;AAIN,eAAe,YAAY;CACzB,OAAO,UAAU;CACjB,WAAW,UAAU;CACrB,WAAW,UAAU;CACrB,aAAa,UAAU;CACvB,UAAU,UAAU;CACpB,eAAe,UAAU;CACzB,mBAAmB,UAAU;CAC7B,uBAAuB,UAAU;CACjC,yBAAyB,UAAU;CACpC"}
1
+ {"version":3,"file":"menuPage-DRsMsPbn.js","names":[],"sources":["../src/menuPage/CustomMenuPage.jsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport MenuPage from './MenuPage';\nimport { makeStyles, Typography } from '@material-ui/core';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1\n // padding: theme.spacing(1),\n }\n}));\n\nfunction buildInnerMenuFromItems(\n items = [],\n menuTitle,\n idPrefix = 'custom',\n showItemCount = false,\n itemCountAccessor = null\n) {\n const idMap = {};\n const views = (items || []).map((item, idx) => {\n const itemKey = item.id ?? item.ID ?? item.groupID ?? idx;\n const menuStructureId = `${idPrefix}-${itemKey}`;\n\n // compute optional count using accessor\n let itemCount = null;\n if (showItemCount && typeof itemCountAccessor === 'function') {\n try {\n const cnt = itemCountAccessor(item);\n if (cnt !== undefined && cnt !== null) {\n itemCount = cnt;\n }\n } catch (e) {}\n }\n\n idMap[menuStructureId] = item;\n item.__menuStructureId = menuStructureId;\n item.__itemKey = itemKey;\n\n const parametersObj = {\n FluentIcon: 'PageListIcon',\n PageId: '',\n defaultDisplay: 'expanded'\n };\n if (itemCount !== null && itemCount !== undefined) {\n parametersObj.itemCount = itemCount;\n }\n\n return {\n menuStructureId,\n menuItemInstance: {\n menuItemInstanceId: `${idPrefix}-item-${itemKey}`,\n clusterId: null,\n menuItemId: null,\n name: item.name ?? '',\n parameters: JSON.stringify(parametersObj),\n isActive: true,\n roleIds: [],\n groupIds: [],\n tenantSsoId: null,\n parentMenuItemInstanceId: null,\n items: null\n },\n title: item.name ?? '',\n order: idx,\n parentId: null,\n unsubscribed: false,\n menuItemInstanceStructures: []\n };\n });\n\n const innerMenu = {\n // set the inner menu name only when client provided a menuTitle; leave blank when not provided\n name: menuTitle ? menuTitle : '',\n menuItemInstanceStructureViews: views\n };\n\n return { innerMenu, idMap };\n}\n\nconst CustomMenuPage = ({\n items = [],\n className = '',\n menuTitle,\n mainContent: clientMainContent,\n idPrefix = 'custom',\n showItemCount = false,\n itemCountAccessor = null,\n allowMissingPageParam = false,\n searchParamsTransformer = null\n}) => {\n const classes = useStyles();\n\n const { innerMenu, idMap } = useMemo(\n () =>\n buildInnerMenuFromItems(\n items,\n menuTitle,\n idPrefix,\n showItemCount,\n itemCountAccessor\n ),\n [items, menuTitle, idPrefix, showItemCount, itemCountAccessor]\n );\n\n // Expect client application to provide mainContent. If not provided, render an empty container.\n const clientContent = clientMainContent\n ? ({ selectedNode, menuItemsList }) =>\n clientMainContent({\n selectedNode,\n menuItemsList,\n idMap,\n items,\n classes,\n className\n })\n : ({ selectedNode, menuItemsList }) => (\n <div className={`${classes.root} ${className}`} />\n );\n\n const composedMainContent = ({ selectedNode, menuItemsList }) => (\n <div className={`${classes.root} ${className}`}>\n {clientContent({ selectedNode, menuItemsList })}\n </div>\n );\n\n return (\n <MenuPage\n innerMenuOverride={innerMenu}\n mainContent={composedMainContent}\n menuTitle={menuTitle}\n allowMissingPageParam={allowMissingPageParam}\n searchParamsTransformer={searchParamsTransformer}\n />\n );\n};\n\nCustomMenuPage.propTypes = {\n items: PropTypes.array,\n className: PropTypes.string,\n menuTitle: PropTypes.string,\n mainContent: PropTypes.func,\n idPrefix: PropTypes.string,\n showItemCount: PropTypes.bool,\n itemCountAccessor: PropTypes.func,\n allowMissingPageParam: PropTypes.bool,\n searchParamsTransformer: PropTypes.func\n};\n\nexport default CustomMenuPage;\n"],"mappings":";;;;;AAKA,MAAM,YAAY,YAAY,WAAW,EACvC,MAAM,EACJ,UAAU,GAEX,EACF,EAAE;AAEH,SAAS,wBACP,QAAQ,EAAE,EACV,WACA,WAAW,UACX,gBAAgB,OAChB,oBAAoB,MACpB;CACA,MAAM,QAAQ,EAAE;CAChB,MAAM,SAAS,SAAS,EAAE,EAAE,KAAK,MAAM,QAAQ;EAC7C,MAAM,UAAU,KAAK,MAAM,KAAK,MAAM,KAAK,WAAW;EACtD,MAAM,kBAAkB,GAAG,SAAS,GAAG;EAGvC,IAAI,YAAY;AAChB,MAAI,iBAAiB,OAAO,sBAAsB,WAChD,KAAI;GACF,MAAM,MAAM,kBAAkB,KAAK;AACnC,OAAI,QAAQ,KAAA,KAAa,QAAQ,KAC/B,aAAY;WAEP,GAAG;AAGd,QAAM,mBAAmB;AACzB,OAAK,oBAAoB;AACzB,OAAK,YAAY;EAEjB,MAAM,gBAAgB;GACpB,YAAY;GACZ,QAAQ;GACR,gBAAgB;GACjB;AACD,MAAI,cAAc,QAAQ,cAAc,KAAA,EACtC,eAAc,YAAY;AAG5B,SAAO;GACL;GACA,kBAAkB;IAChB,oBAAoB,GAAG,SAAS,QAAQ;IACxC,WAAW;IACX,YAAY;IACZ,MAAM,KAAK,QAAQ;IACnB,YAAY,KAAK,UAAU,cAAc;IACzC,UAAU;IACV,SAAS,EAAE;IACX,UAAU,EAAE;IACZ,aAAa;IACb,0BAA0B;IAC1B,OAAO;IACR;GACD,OAAO,KAAK,QAAQ;GACpB,OAAO;GACP,UAAU;GACV,cAAc;GACd,4BAA4B,EAAE;GAC/B;GACD;AAQF,QAAO;EAAE,WANS;GAEhB,MAAM,YAAY,YAAY;GAC9B,gCAAgC;GACjC;EAEmB;EAAO;;AAG7B,MAAM,kBAAkB,EACtB,QAAQ,EAAE,EACV,YAAY,IACZ,WACA,aAAa,mBACb,WAAW,UACX,gBAAgB,OAChB,oBAAoB,MACpB,wBAAwB,OACxB,0BAA0B,WACtB;CACJ,MAAM,UAAU,WAAW;CAE5B,MAAM,EAAE,WAAW,UAAU,cAExB,wBACE,OACA,WACA,UACA,eACA,kBACD,EACH;EAAC;EAAO;EAAW;EAAU;EAAe;EAAkB,CAC/D;CAGD,MAAM,gBAAgB,qBACjB,EAAE,cAAc,oBACf,kBAAkB;EAChB;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,IACH,EAAE,cAAc,oBACf,sBAAA,cAAC,OAAD,EAAK,WAAW,GAAG,QAAQ,KAAK,GAAG,aAAe,CAAA;CAGxD,MAAM,uBAAuB,EAAE,cAAc,oBAC3C,sBAAA,cAAC,OAAD,EAAK,WAAW,GAAG,QAAQ,KAAK,GAAG,aAE7B,EADH,cAAc;EAAE;EAAc;EAAe,CAAC,CAC3C;AAGR,QACE,sBAAA,cAAC,UAAD;EACE,mBAAmB;EACnB,aAAa;EACF;EACY;EACE;EACzB,CAAA;;AAIN,eAAe,YAAY;CACzB,OAAO,UAAU;CACjB,WAAW,UAAU;CACrB,WAAW,UAAU;CACrB,aAAa,UAAU;CACvB,UAAU,UAAU;CACpB,eAAe,UAAU;CACzB,mBAAmB,UAAU;CAC7B,uBAAuB,UAAU;CACjC,yBAAyB,UAAU;CACpC"}
@@ -1,3 +1,3 @@
1
- import { n as PublicRoute, r as PrivateRoute, t as UdpRoutes } from "../UdpRoutes-ClaIhJIi.js";
1
+ import { n as PublicRoute, r as PrivateRoute, t as UdpRoutes } from "../UdpRoutes-DHN5R9Dm.js";
2
2
  import { Link, NavLink, Prompt, Redirect, Route, Switch, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter } from "react-router-dom";
3
3
  export { Link, NavLink, PrivateRoute, Prompt, PublicRoute, Redirect, Route, Switch, UdpRoutes, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter };
@@ -1,8 +1,8 @@
1
1
  import { n as SiteHeaderRightComponentTarget, t as SiteHeaderRightComponent } from "../SiteHeaderRightComponent-Dhfk4G4j.js";
2
2
  import { n as useBuildEnvironment, t as APP_RIBBON_SPACE } from "../useBuildEnvironment-DsBqfGwR.js";
3
3
  import { n as SidebarCollapseButton } from "../UtilitySideBar-VhHVhVUj.js";
4
- import { a as LanguageSwitcher, i as HelpCenter, n as SiteHeaderSpacer, o as ShellDropdown, r as EnvironmentRibbon, s as AmbientProjectSwitcher } from "../SiteHeader-vNgnheR6.js";
5
- import { t as Shell } from "../Shell-B09X7AWm.js";
4
+ import { a as LanguageSwitcher, i as HelpCenter, n as SiteHeaderSpacer, o as ShellDropdown, r as EnvironmentRibbon, s as AmbientProjectSwitcher } from "../SiteHeader-H3c5jsnA.js";
5
+ import { t as Shell } from "../Shell-BuVPO9y8.js";
6
6
  import { i as isPasswordValid, n as UserFormFields, r as UserRoleAutoComplete, t as UserForm } from "../UserForm-Dl3uSe0d.js";
7
7
  import { t as AddUser } from "../AddUser-JkqaNxxK.js";
8
8
  import "./ui/index.js";
@@ -1,7 +1,7 @@
1
1
  import { n as SiteHeaderRightComponentTarget, t as SiteHeaderRightComponent } from "../../SiteHeaderRightComponent-Dhfk4G4j.js";
2
2
  import { n as useBuildEnvironment, t as APP_RIBBON_SPACE } from "../../useBuildEnvironment-DsBqfGwR.js";
3
3
  import { n as SidebarCollapseButton } from "../../UtilitySideBar-VhHVhVUj.js";
4
- import { a as LanguageSwitcher, i as HelpCenter, n as SiteHeaderSpacer, o as ShellDropdown, r as EnvironmentRibbon, s as AmbientProjectSwitcher } from "../../SiteHeader-vNgnheR6.js";
4
+ import { a as LanguageSwitcher, i as HelpCenter, n as SiteHeaderSpacer, o as ShellDropdown, r as EnvironmentRibbon, s as AmbientProjectSwitcher } from "../../SiteHeader-H3c5jsnA.js";
5
5
  import { i as isPasswordValid, n as UserFormFields, r as UserRoleAutoComplete, t as UserForm } from "../../UserForm-Dl3uSe0d.js";
6
6
  import { t as AddUser } from "../../AddUser-JkqaNxxK.js";
7
7
  export { APP_RIBBON_SPACE, AddUser, AmbientProjectSwitcher, EnvironmentRibbon, HelpCenter, LanguageSwitcher, ShellDropdown, SidebarCollapseButton, SiteHeaderRightComponent, SiteHeaderRightComponentTarget, SiteHeaderSpacer, UserForm, UserFormFields, UserRoleAutoComplete, isPasswordValid, useBuildEnvironment };
@@ -5,7 +5,6 @@ export declare const TableColumnDefs: (actionList: any) => ({
5
5
  wrapText: boolean;
6
6
  autoHeight: boolean;
7
7
  sortable: boolean;
8
- filter?: undefined;
9
8
  pinned?: undefined;
10
9
  cellRenderer?: undefined;
11
10
  // minWidth: 50,
@@ -14,6 +13,7 @@ export declare const TableColumnDefs: (actionList: any) => ({
14
13
  maxWidth?: undefined;
15
14
  suppressMenu?: undefined;
16
15
  cellStyle?: undefined;
16
+ filter?: undefined;
17
17
  } | {
18
18
  field?: undefined;
19
19
  wrapText?: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"TableColumnDefs.d.ts","sourceRoot":"","sources":["../../../../../src/maintenanceEngine/tableBrowser/TableColumnDefs.js"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe;;;;;;;;;;IAsBtB,gBAAgB;;;;;;;;;;;;;;IAAhB,gBAAgB;;;;;;;;;;;;;IAarB,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;CAOnC,CAAC"}
1
+ {"version":3,"file":"TableColumnDefs.d.ts","sourceRoot":"","sources":["../../../../../src/maintenanceEngine/tableBrowser/TableColumnDefs.js"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe;;;;;;;;;IAsBtB,gBAAgB;;;;;;;;;;;;;;;IAAhB,gBAAgB;;;;;;;;;;;;;IAarB,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;CAOnC,CAAC"}