udp-react-enterprise-component-library 25.1.0-beta.9 → 25.1.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/{AmbientGridTemplate-BqlMt5Su.js → AmbientGridTemplate-6xfwTiz-.js} +24 -62
  2. package/dist/AmbientGridTemplate-6xfwTiz-.js.map +1 -0
  3. package/dist/ClientSideUdpGrid-CEhDqIId.js +56 -0
  4. package/dist/ClientSideUdpGrid-CEhDqIId.js.map +1 -0
  5. package/dist/{EnvironmentRibbon-DaDmKAPO.js → EnvironmentRibbon-oEmbWjEq.js} +4 -148
  6. package/dist/EnvironmentRibbon-oEmbWjEq.js.map +1 -0
  7. package/dist/{MenuPage-CO6_GWwB.js → MenuPage-CZHpoopY.js} +12 -13
  8. package/dist/{MenuPage-CO6_GWwB.js.map → MenuPage-CZHpoopY.js.map} +1 -1
  9. package/dist/{MyExportsPage-CX9tzqHk.js → MyExportsPage-CS2Bw2mF.js} +56 -69
  10. package/dist/{MyExportsPage-CX9tzqHk.js.map → MyExportsPage-CS2Bw2mF.js.map} +1 -1
  11. package/dist/MyExportsPage-hyX42CN6.js +11 -0
  12. package/dist/{PageContainer-k8KCfGsM.js → PageContainer-BPHLFGju.js} +12 -17
  13. package/dist/PageContainer-BPHLFGju.js.map +1 -0
  14. package/dist/{PageNotFoundRoute-CxYZNEhN.js → PageNotFoundRoute-D9dLbM_w.js} +1 -1
  15. package/dist/{PageNotFoundRoute-CxYZNEhN.js.map → PageNotFoundRoute-D9dLbM_w.js.map} +1 -1
  16. package/dist/PageNotFoundRoute-DUj0Q9J8.js +3 -0
  17. package/dist/{PasswordResetRedirect-BHnkAW40.js → PasswordResetRedirect-C3g8L0vA.js} +2 -3
  18. package/dist/{PasswordResetRedirect-BHnkAW40.js.map → PasswordResetRedirect-C3g8L0vA.js.map} +1 -1
  19. package/dist/PasswordResetRedirect-Dh-S5Ril.js +3 -0
  20. package/dist/{SearchUtilities-Bor3HbfB.js → SearchUtilities-Btugro8y.js} +11 -20
  21. package/dist/{SearchUtilities-Bor3HbfB.js.map → SearchUtilities-Btugro8y.js.map} +1 -1
  22. package/dist/{SideSheet-DUsxG1FN.js → SideSheet-BsDoeNmq.js} +7 -47
  23. package/dist/SideSheet-BsDoeNmq.js.map +1 -0
  24. package/dist/UdpMaintenanceConfigPage-DcHntunS.js +88 -0
  25. package/dist/UdpMaintenanceConfigPage-DcHntunS.js.map +1 -0
  26. package/dist/UdpPublicForm-DTt-lMfk.js +4 -0
  27. package/dist/{UdpPublicForm-Caa1tH6z.js → UdpPublicForm-LDSuOwV2.js} +2 -2
  28. package/dist/{UdpPublicForm-Caa1tH6z.js.map → UdpPublicForm-LDSuOwV2.js.map} +1 -1
  29. package/dist/{UtilitySideBar-D4CXGtW2.js → UtilitySideBar-95k0edSA.js} +45 -89
  30. package/dist/{UtilitySideBar-D4CXGtW2.js.map → UtilitySideBar-95k0edSA.js.map} +1 -1
  31. package/dist/{VirtualBrowser-BXL0hdy0.js → VirtualBrowser-_epMjUkE.js} +23 -29
  32. package/dist/{VirtualBrowser-BXL0hdy0.js.map → VirtualBrowser-_epMjUkE.js.map} +1 -1
  33. package/dist/{WorkflowContainer-DrqzuQtU.js → WorkflowContainer-ClPvY2mG.js} +14 -20
  34. package/dist/{WorkflowContainer-DrqzuQtU.js.map → WorkflowContainer-ClPvY2mG.js.map} +1 -1
  35. package/dist/WorkflowContainer-D0QUOc-f.js +11 -0
  36. package/dist/{apiHelpers-DZots3og.js → apiHelpers-CmM6DWAT.js} +7 -12
  37. package/dist/{apiHelpers-DZots3og.js.map → apiHelpers-CmM6DWAT.js.map} +1 -1
  38. package/dist/entityUtilities-Dy-jsB5c.js +22 -0
  39. package/dist/entityUtilities-Dy-jsB5c.js.map +1 -0
  40. package/dist/index.js +1528 -2114
  41. package/dist/index.js.map +1 -1
  42. package/dist/{propertyTypeEnums-Civy7RJv.js → propertyTypeEnums-BCCGQqVB.js} +2 -2
  43. package/dist/{propertyTypeEnums-Civy7RJv.js.map → propertyTypeEnums-BCCGQqVB.js.map} +1 -1
  44. package/dist/types/index.d.ts +0 -4
  45. package/dist/types/maintenanceEngine/crudBrowser/CrudTableColumnDefs.d.ts +1 -9
  46. package/dist/types/maintenanceEngine/crudBrowser/crudHelper.d.ts +1 -0
  47. package/dist/types/menuPage/MenuPage.d.ts +2 -1
  48. package/dist/types/tsconfig.tsbuildinfo +1 -1
  49. package/dist/types/udp/pages/UdpMaintenanceConfigPage.d.ts +2 -1
  50. package/dist/useAxiosGet-Dh5pVURP.js +144 -0
  51. package/dist/useAxiosGet-Dh5pVURP.js.map +1 -0
  52. package/dist/useAxiosMutate-DlG255x9.js +43 -0
  53. package/dist/useAxiosMutate-DlG255x9.js.map +1 -0
  54. package/package.json +2 -2
  55. package/dist/AmbientGridTemplate-BqlMt5Su.js.map +0 -1
  56. package/dist/EnvironmentRibbon-DaDmKAPO.js.map +0 -1
  57. package/dist/MyExportsPage-CkzQ0MRq.js +0 -8
  58. package/dist/PageContainer-k8KCfGsM.js.map +0 -1
  59. package/dist/PageNotFoundRoute-BbBtA9Cz.js +0 -3
  60. package/dist/PasswordResetRedirect-tUV2yEkH.js +0 -3
  61. package/dist/SideSheet-DUsxG1FN.js.map +0 -1
  62. package/dist/UdpPublicForm-Cvw5tOHe.js +0 -4
  63. package/dist/WorkflowContainer-Q8gtuaB7.js +0 -9
  64. package/dist/types/maintenanceEngine/crudBrowser/CrudTableActionRender.d.ts +0 -3
@@ -0,0 +1,11 @@
1
+ import "./AmbientGridTemplate-6xfwTiz-.js";
2
+ import "./SideSheet-BsDoeNmq.js";
3
+ import "./EnvironmentRibbon-oEmbWjEq.js";
4
+ import "./apiHelpers-CmM6DWAT.js";
5
+ import "./useAxiosGet-Dh5pVURP.js";
6
+ import "./useAxiosMutate-DlG255x9.js";
7
+ import "./entityUtilities-Dy-jsB5c.js";
8
+ import "./SearchUtilities-Btugro8y.js";
9
+ import { MyExportsPage } from "./MyExportsPage-CS2Bw2mF.js";
10
+
11
+ export { MyExportsPage };
@@ -1,4 +1,5 @@
1
- import { FluentIcon, FluentIconButton, LayoutUnit, PrimaryActionButton, StandardTitle, StatusChip, useAxiosGet, useId, useShellStore } from "./EnvironmentRibbon-DaDmKAPO.js";
1
+ import { FluentIcon, FluentIconButton, LayoutUnit, PrimaryActionButton, StandardTitle, StatusChip, useId, useShellStore } from "./EnvironmentRibbon-oEmbWjEq.js";
2
+ import { useAxiosGet } from "./useAxiosGet-Dh5pVURP.js";
2
3
  import React, { Fragment, createContext, createRef, forwardRef, memo, useCallback, useEffect, useMemo, useReducer, useRef, useState } from "react";
3
4
  import { Badge, Button, ButtonBase, Card, CardActions, CardContent, CircularProgress, Collapse, Divider, IconButton, LinearProgress, ListItemIcon, ListItemText, Menu, MenuItem, Popover, Slide, Tooltip, Typography, lighten, makeStyles, useTheme } from "@material-ui/core";
4
5
  import { ConfigService } from "udp-react-stencil-component-library";
@@ -369,8 +370,7 @@ FUICardHeaderMenu = forwardRef(FUICardHeaderMenu);
369
370
  const FUICard = (props, ref) => {
370
371
  const classes = useStyles$6();
371
372
  const { className, children, actions, title, headerActions, CardHeaderProps, CardProps, raised, name,...cardProps } = props;
372
- const id = useId(name, cardProps.id);
373
- const titleId = `${id}-title`;
373
+ const titleId = `${useId(name, cardProps.id)}-title`;
374
374
  return /* @__PURE__ */ React.createElement(FluentCard, {
375
375
  ref,
376
376
  component: "section",
@@ -415,7 +415,7 @@ var FUIMenuItem_default = forwardRef(FUIMenuItem);
415
415
  */
416
416
  const WidgetCard = (props) => {
417
417
  const { children, headerActions, className, widgetType, id, layout, params, setParam, onDelete, loading, errors, theme, hideWidgetName, innerPadding, contentHeight, contentMaxHeight,...other } = props;
418
- const useStyles$13 = makeStyles((theme$1) => ({
418
+ const classes = makeStyles((theme$1) => ({
419
419
  root: { "&.react-resizable-hide .react-resizable-handle": { display: "none" } },
420
420
  darkRoot: {
421
421
  "&.react-resizable-hide .react-resizable-handle": { display: "none" },
@@ -448,8 +448,7 @@ const WidgetCard = (props) => {
448
448
  justifyContent: "space-between",
449
449
  padding: innerPadding || (widgetType === "VEERegisterRead" ? 0 : theme$1.spacing(2))
450
450
  }
451
- }));
452
- const classes = useStyles$13();
451
+ }))();
453
452
  const raised = /(^|\s)react-draggable-dragging(\s|$)/.test(className ?? "");
454
453
  let body = children;
455
454
  if (loading && !body) body = /* @__PURE__ */ React.createElement("div", { className: classes.loadingContent }, /* @__PURE__ */ React.createElement(CircularProgress, { size: 64 }));
@@ -831,7 +830,7 @@ const UdpTabs = (props) => {
831
830
  //#region src/UI/utilityDisplay/utilityHeader/ui/teleporter.ts
832
831
  const useAllTeleporters = () => {
833
832
  const teleporterMap = useTeleporterStore((state) => state.teleporterMap);
834
- const allTeleporters = useMemo(() => {
833
+ return useMemo(() => {
835
834
  const result = [];
836
835
  for (const [targetId, locationMap] of teleporterMap.entries()) for (const [location, entry] of locationMap.entries()) result.push([
837
836
  targetId,
@@ -840,7 +839,6 @@ const useAllTeleporters = () => {
840
839
  ]);
841
840
  return result;
842
841
  }, [teleporterMap]);
843
- return allTeleporters;
844
842
  };
845
843
 
846
844
  //#endregion
@@ -1325,12 +1323,10 @@ const reducer = (state, action) => {
1325
1323
  const operator = action.type.substr(0, action.type.indexOf(" "));
1326
1324
  const prop = action.type.substr(action.type.indexOf(" ") + 1);
1327
1325
  switch (operator) {
1328
- case "set":
1329
- const newState = {
1330
- ...state,
1331
- [prop]: action.value
1332
- };
1333
- return newState;
1326
+ case "set": return {
1327
+ ...state,
1328
+ [prop]: action.value
1329
+ };
1334
1330
  default: throw new Error("Unknown operator");
1335
1331
  }
1336
1332
  };
@@ -1354,8 +1350,7 @@ const useSetLocationState = () => {
1354
1350
  const location = useLocation();
1355
1351
  const setLocationState = (newState) => {
1356
1352
  const currentState = location.state || {};
1357
- const hasChanged = Object.entries(newState).some(([key, value]) => currentState[key] !== value);
1358
- if (!hasChanged || !!location?.state) return;
1353
+ if (!Object.entries(newState).some(([key, value]) => currentState[key] !== value) || !!location?.state) return;
1359
1354
  history.replace({
1360
1355
  pathname: location.pathname,
1361
1356
  search: location.search,
@@ -1538,4 +1533,4 @@ const PageContainer = (props) => {
1538
1533
 
1539
1534
  //#endregion
1540
1535
  export { AmbientPopoverMenuItem, FUICardHeaderMenu, FUICard_default, FUIMenuItem_default, FluentCard, FluentCardActions, FluentCardContent, PAHExport, PageContainer, PrimaryActionHeader, ToolBarButton, UdpTabs, WidgetCard, pageContext, useAllTeleporters, useSetLocationState, useTeleporterStore };
1541
- //# sourceMappingURL=PageContainer-k8KCfGsM.js.map
1536
+ //# sourceMappingURL=PageContainer-BPHLFGju.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageContainer-BPHLFGju.js","names":["result: [string, string, TeleporterInstance][]","useStyles","layout: Omit<Layout, 'i' | 'x' | 'y'>","uuid","ResponsiveGridLayout","useStyles","useStyles","useStyles","useStyles","useStyles","useStyles","FUISquareIconButton","FUICardHeader","useStyles","theme","FUICard","FUIMenuItem","params","layouts","DashboardWidget","DashboardCardGrid","useStyles","useStyles","useStyles","currentTabList","result: [string, string, TeleporterInstance][]","useStyles","value","initialState: any","widgetParams","uuid","Page"],"sources":["../src/stores/teleporterStore.ts","../src/UI/inputs/buttons/ToolBarButton.jsx","../src/dashboard/getWidgetLayout.ts","../src/dashboard/DashboardCardGrid.jsx","../src/UI/surfaces/cards/FUICardHeader.jsx","../src/UI/inputs/buttons/FUISquareIconButton.jsx","../src/UI/surfaces/cards/FluentCard.jsx","../src/UI/surfaces/cards/FluentCardContent.jsx","../src/UI/surfaces/cards/FluentCardActions.jsx","../src/UI/surfaces/cards/FUICard.jsx","../src/UI/widgets/FluentComponents/FUIMenuItem.jsx","../src/dashboard/WidgetCard.jsx","../src/dashboard/DashboardWidget.jsx","../src/page/Page.jsx","../src/UI/inputs/buttons/AmbientPopoverMenuItem.jsx","../src/UI/utilityDisplay/utilityHeader/ui/PAHExport.jsx","../src/UI/navigation/tabs/UdpTabs.jsx","../src/UI/utilityDisplay/utilityHeader/ui/teleporter.ts","../src/UI/utilityDisplay/utilityHeader/PrimaryActionHeader.jsx","../src/contexts/PageContext.tsx","../src/hooks/useSetLocationState.js","../src/page/PageContainer.jsx"],"sourcesContent":["import { create } from 'zustand';\nimport { createTeleporter } from 'react-teleporter';\n\ntype TeleporterInstance = ReturnType<typeof createTeleporter>;\n\ntype LocationEntry = {\n teleporter: TeleporterInstance;\n};\n\ntype TeleporterMap = Map<string, Map<string, LocationEntry>>;\n\ninterface TeleporterStore {\n teleporterMap: TeleporterMap;\n getTeleporter: (targetId: string, location: string) => TeleporterInstance;\n getAllTeleporters: () => [string, string, TeleporterInstance][];\n}\n\nexport const useTeleporterStore = create<TeleporterStore>((set, get) => ({\n teleporterMap: new Map(),\n\n getTeleporter: (targetId = '', location) => {\n const mapCopy = new Map(get().teleporterMap); // clone to maintain reactivity\n let locationMap = mapCopy.get(targetId);\n\n if (!locationMap) {\n locationMap = new Map();\n mapCopy.set(targetId, locationMap);\n }\n\n if (!locationMap.has(location)) {\n locationMap.set(location, {\n teleporter: createTeleporter()\n });\n }\n\n const teleporter = locationMap.get(location)!.teleporter;\n\n // Update store\n set({ teleporterMap: mapCopy });\n\n return teleporter;\n },\n\n getAllTeleporters: () => {\n const result: [string, string, TeleporterInstance][] = [];\n const map = get().teleporterMap;\n\n for (const [targetId, locationMap] of map.entries()) {\n for (const [location, entry] of locationMap.entries()) {\n result.push([targetId, location, entry.teleporter]);\n }\n }\n\n return result;\n }\n}));\n","import { ButtonBase, makeStyles, Tooltip, Typography } from '@material-ui/core';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nconst useStyles = makeStyles(\n (theme) => ({\n root: {\n borderBottom: (props) =>\n props.selected && `2px solid ${theme.palette.secondary.main}`\n },\n wrapper: {\n display: 'flex',\n flexDirection: 'row',\n marginRight: theme.spacing(2)\n },\n icon: {\n fontSize: 16,\n width: 16,\n height: 16,\n color: theme.palette.secondary.main\n },\n iconWrapper: {\n background: theme.palette.common.white,\n borderRadius: 100,\n padding: theme.spacing(1)\n },\n label: {\n marginLeft: theme.spacing(1),\n fontSize: '0.875rem',\n '&:hover': { color: theme.palette.secondary.main }\n }\n }),\n { name: 'ToolBarButton' }\n);\n\nexport const ToolBarButton = (props) => {\n const classes = useStyles(props);\n const {\n component: ToolBarComponent,\n click,\n label,\n expanded,\n aria,\n icon = true,\n disabled = false\n } = props;\n\n return (\n <Tooltip\n title={(expanded && label) || aria || ''}\n aria-label={label}\n placement='top'\n enterDelay={!expanded && 5000}\n >\n <ButtonBase\n classes={{\n root: classes.root\n // label: classes.label\n }}\n className={classes.wrapper}\n onClick={click}\n disableRipple\n aria-label={aria}\n disabled={disabled}\n >\n {icon && (\n <div className={classes.iconWrapper}>\n <ToolBarComponent className={classes.icon} />\n </div>\n )}\n\n <Typography variant='body2' className={classes.label}>\n {!expanded && label}\n </Typography>\n </ButtonBase>\n </Tooltip>\n );\n};\n\nToolBarButton.propTypes = {\n component: PropTypes.func,\n click: PropTypes.func,\n label: PropTypes.string,\n expanded: PropTypes.bool,\n aria: PropTypes.string,\n icon: PropTypes.bool\n};\n","import { Layout } from 'react-grid-layout';\nimport { LayoutDimension } from './types';\n\nconst getW = (\n w: LayoutDimension | undefined\n): Pick<Layout, 'w' | 'minW' | 'maxW'> => {\n if (typeof w === 'object') {\n return {\n w: w.default,\n minW: w.min,\n maxW: w.max\n };\n }\n\n if (typeof w === 'number') {\n return { w };\n }\n\n return { w: 2 };\n};\n\nconst getH = (\n h: LayoutDimension | undefined\n): Pick<Layout, 'h' | 'minH' | 'maxH'> => {\n if (typeof h === 'object') {\n return {\n h: h.default,\n minH: h.min,\n maxH: h.max\n };\n }\n\n if (typeof h === 'number') {\n return { h };\n }\n\n return { h: 2 };\n};\n\n/**\n * Get a default layout for widgets of a type\n */\nexport default function getWidgetLayout(\n getWidget: Function,\n widgetType: string\n): Omit<Layout, 'i' | 'x' | 'y'> {\n const { w, h } = (getWidget && getWidget(widgetType)?.layout) ?? {};\n\n const layout: Omit<Layout, 'i' | 'x' | 'y'> = {\n ...getW(w),\n ...getH(h)\n };\n\n const wResizable = 'minW' in layout || 'maxW' in layout;\n const hResizable = 'minH' in layout || 'maxH' in layout;\n layout.isResizable = wResizable || hResizable;\n\n return layout;\n}\n","import { v4 as uuid } from 'uuid';\nimport React, { useCallback, useMemo, useRef } from 'react';\nimport { Responsive as ResponsiveGridLayout } from 'react-grid-layout';\nimport { makeStyles, useTheme } from '@material-ui/core';\nimport { useMeasure } from 'react-use';\nimport 'react-grid-layout/css/styles.css';\nimport 'react-resizable/css/styles.css';\nimport { useDragLayer } from 'react-dnd';\nimport getWidgetLayout from './getWidgetLayout.ts';\nimport { useShellStore } from '../stores/shellStore';\n\nconst useStyle = makeStyles(\n (theme) => ({\n root: {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: '100%',\n marginBottom: (props) => (props?.disableMargin ? '' : theme.spacing(3))\n }\n }),\n { name: 'DashboardCardGrid' }\n);\n\nconst DASHBOARD_WIDGET = Symbol('DASHBOARD_WIDGET');\n\nconst breakpoints = {\n xs: 0,\n xl: 1150\n};\n\nconst breakpointCols = {\n xs: 4,\n xl: 4\n};\n\n/**\n * Grid layout for dashboard cards\n */\nconst DashboardCardGrid = (props) => {\n const classes = useStyle(props);\n const { children, onCreateCard, gridProperties, ...other } = props;\n const { getWidget } = useShellStore();\n const rglRef = useRef();\n const [ref, { width }] = useMeasure();\n const theme = useTheme();\n const { droppingWidgetType } = useDragLayer((monitor) => {\n if (monitor.getItemType() === DASHBOARD_WIDGET) {\n const { id: wigetType } = monitor.getItem();\n return { droppingWidgetType: wigetType };\n }\n\n return { droppingWidgetType: null };\n });\n const droppingItemLayout = useMemo(() => {\n if (droppingWidgetType) {\n return { i: uuid(), ...getWidgetLayout(getWidget, droppingWidgetType) };\n }\n }, [getWidget, droppingWidgetType]);\n\n const drag = useCallback((layout, oldLayoutItem, layoutItem, placeholder) => {\n // Cards larger than 1 should snap to columns that are a multiple of 2\n // if (layoutItem.w > 1) {\n // // @fixme This affects the visual placeholder, but doesn't actually fix the layout item when its dropped\n // placeholder.x = layoutItem.x = Math.floor(layoutItem.x / 2) * 2;\n // }\n }, []);\n\n const resize = useCallback(\n (layout, oldLayoutItem, layoutItem, placeholder) => {\n // Widths larger than 1 should be a multiple of 2\n // The small size of columns is just so we can have small 1x1 tiles that are 1/2 the size of normal cards\n // if (layoutItem.w > 1) {\n // const w = Math.floor(layoutItem.w / 2) * 3;\n // layoutItem.w = w;\n // placeholder.w = w;\n // }\n\n // There is no 3 (i.e. 6) column layout so don't allow cards to be that size either\n if (layoutItem.w >= 6 && layoutItem.w < 8) {\n layoutItem.w = 4;\n placeholder.w = 4;\n }\n },\n []\n );\n\n const drop = useCallback(\n (layout, item) => {\n if (droppingWidgetType) {\n const { x, y, w, h } = item;\n const { breakpoint } = rglRef.current.state;\n if (onCreateCard)\n onCreateCard({\n widgetType: droppingWidgetType,\n id: uuid(),\n layout: {\n [breakpoint]: {\n x,\n y,\n w,\n h\n }\n },\n params: []\n });\n }\n },\n [droppingWidgetType, onCreateCard]\n );\n\n return (\n <div ref={ref} className={classes.root}>\n {width ? (\n <ResponsiveGridLayout\n ref={rglRef}\n {...other}\n width={width}\n breakpoints={breakpoints}\n cols={breakpointCols}\n rowHeight={128}\n margin={[theme.spacing(3), theme.spacing(3)]}\n containerPadding={[0, 0]}\n draggableHandle='[data-handle]'\n onDrag={drag}\n onResize={resize}\n onDrop={drop}\n isDroppable={gridProperties?.isDroppable || false}\n isDraggable={gridProperties?.isDraggable || false}\n droppingItem={droppingItemLayout}\n style={{\n height: '100%'\n }}\n >\n {children}\n </ResponsiveGridLayout>\n ) : null}\n </div>\n );\n};\n\nexport default DashboardCardGrid;\n","import { makeStyles, Typography } from '@material-ui/core';\nimport clsx from 'clsx';\nimport React, { forwardRef } from 'react';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n minHeight: 40,\n paddingLeft: theme.spacing(2),\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n title: {\n flexGrow: 1,\n },\n}));\n\nconst FUICardHeader = (props, ref) => {\n const classes = useStyles(props);\n const { className, children, headerActions, titleId, ...other } = props;\n\n return (\n <div ref={ref} {...other} className={clsx(className, classes.root)}>\n <Typography id={titleId} className={classes.title}>\n {children}\n </Typography>\n {headerActions}\n </div>\n );\n};\n\nexport default forwardRef(FUICardHeader);\n","import { IconButton, makeStyles } from '@material-ui/core';\nimport React from 'react';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n borderRadius: 0,\n },\n }),\n { name: 'FUISquareIconButton' }\n);\n\n/**\n * <IconButton> but with a square highlight\n */\nconst FUISquareIconButton = props => {\n const classes = useStyles(props);\n return <IconButton {...props} classes={classes} />;\n};\n\nexport default FUISquareIconButton;\n","import React, { forwardRef } from 'react'\n\nimport { makeStyles, Card } from '@material-ui/core'\n\nconst useStyles = makeStyles(\n {\n root: {}\n },\n { name: 'FluentCard' }\n)\n\n/**\n * A variant of <Card> that uses a square Fluent UI card style\n */\nexport const FluentCard = forwardRef((props, ref) => {\n const classes = useStyles(props)\n const { children, ...other } = props\n\n return (\n <Card ref={ref} square {...other} classes={classes}>\n {children}\n </Card>\n )\n})\nFluentCard.displayName = 'FluentCard'\n","import React from 'react';\nimport { forwardRef } from 'react';\nimport { makeStyles, CardContent } from '@material-ui/core';\n\nconst useStyles = makeStyles(\n {\n root: {},\n },\n { name: 'FluentCardContent' }\n);\n\n/**\n * A variant of <CardContent> that uses a Fluent UI card style\n */\nexport const FluentCardContent = forwardRef((props, ref) => {\n const classes = useStyles(props);\n const { children, ...other } = props;\n\n return (\n <CardContent ref={ref} {...other} classes={classes}>\n {children}\n </CardContent>\n );\n});\nFluentCardContent.displayName = 'FluentCardContent';\n","import React from 'react';\nimport { forwardRef } from 'react';\nimport { makeStyles, CardActions } from '@material-ui/core';\n\nconst useStyles = makeStyles(\n {\n root: {},\n spacing: {},\n },\n { name: 'FluentCardActions' }\n);\n\n/**\n * A variant of <CardActions> that uses a Fluent UI card style\n */\nexport const FluentCardActions = forwardRef((props, ref) => {\n const classes = useStyles(props);\n const { children, ...other } = props;\n\n return (\n <CardActions ref={ref} {...other} classes={classes}>\n {children}\n </CardActions>\n );\n});\nFluentCardActions.displayName = 'FluentCardActions';\n","import { MoreIcon } from '@fluentui/react-icons'\nimport { Button, makeStyles, Menu } from '@material-ui/core'\nimport clsx from 'clsx'\nimport React, { forwardRef } from 'react'\nimport { FluentIcon } from '../../../utilities/FluentIcon'\nimport FUICardHeader from './FUICardHeader'\nimport FUISquareIconButton from '../../inputs/buttons/FUISquareIconButton'\nimport { FluentCard } from './FluentCard'\nimport { FluentCardContent } from './FluentCardContent'\nimport { FluentCardActions } from './FluentCardActions'\nimport useId from '../../widgets/utils/useId'\n\nconst useStyles = makeStyles(\n (theme) => ({\n root: {\n display: 'flex',\n flexDirection: 'column'\n },\n raised: {\n zIndex: 1\n },\n contentArea: {\n flex: '1 1 auto',\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column'\n },\n cardActions: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'flex-start',\n paddingTop: theme.spacing(1),\n padding: theme.spacing(2)\n }\n }),\n { name: 'FUICard' }\n)\n\nexport let FUICardAction = (props, ref) => {\n const { children, ...other } = props\n\n return (\n <Button\n ref={ref}\n size='small'\n variant='contained'\n disableElevation\n {...other}\n >\n {children}\n </Button>\n )\n}\nFUICardAction = forwardRef(FUICardAction)\n\nexport let FUICardHeaderMenu = (props, ref) => {\n const { children } = props\n\n return (\n <div\n button={\n <FUISquareIconButton>\n <FluentIcon component={MoreIcon} size='small' />\n </FUISquareIconButton>\n }\n menu={<Menu>{children}</Menu>}\n />\n )\n}\nFUICardHeaderMenu = forwardRef(FUICardHeaderMenu)\n\nconst FUICard = (props, ref) => {\n const classes = useStyles()\n const {\n className,\n children,\n actions,\n title,\n headerActions,\n CardHeaderProps,\n CardProps,\n raised,\n name,\n ...cardProps\n } = props\n const id = useId(name, cardProps.id)\n const titleId = `${id}-title`\n\n return (\n <FluentCard\n ref={ref}\n component='section'\n aria-labelledby={titleId}\n {...cardProps}\n raised={raised}\n className={clsx(className, raised && classes.raised)}\n {...CardProps}\n classes={{ root: classes.root }}\n >\n <FUICardHeader\n titleId={titleId}\n headerActions={headerActions}\n {...CardHeaderProps}\n >\n {title}\n </FUICardHeader>\n <FluentCardContent className={classes.contentArea}>\n {children}\n </FluentCardContent>\n {actions && (\n <FluentCardActions className={classes.cardActions}>\n {actions}\n </FluentCardActions>\n )}\n </FluentCard>\n )\n}\n\nexport default forwardRef(FUICard)\n","import React, { forwardRef } from 'react'\nimport {\n MenuItem,\n ListItemIcon,\n ListItemText,\n makeStyles\n} from '@material-ui/core'\nimport { FluentIcon } from '../../../utilities/FluentIcon'\n\nconst useStyles = makeStyles(\n {\n listItemIcon: {\n minWidth: 32\n }\n },\n { name: 'FUIMenuItem' }\n)\n\n/**\n * <MenuItem> with icon support\n */\nconst FUIMenuItem = (props, ref) => {\n const classes = useStyles()\n const { icon, fluentIcon, primary, secondary, ...menuItemProps } = props\n\n return (\n <MenuItem ref={ref} dense {...menuItemProps}>\n <ListItemIcon className={classes.listItemIcon}>\n {icon || <FluentIcon component={fluentIcon} />}\n </ListItemIcon>\n <ListItemText {...{ primary, secondary }} />\n </MenuItem>\n )\n}\n\nexport default forwardRef(FUIMenuItem)\n","import { DeleteIcon } from '@fluentui/react-icons';\nimport { makeStyles, CircularProgress, lighten } from '@material-ui/core';\nimport clsx from 'clsx';\nimport React from 'react';\nimport FUICard, { FUICardHeaderMenu } from '../UI/surfaces/cards/FUICard';\nimport FUIMenuItem from '../UI/widgets/FluentComponents/FUIMenuItem';\n\n/**\n * Core component for dashboard widget cards\n */\nexport const WidgetCard = (props) => {\n const {\n children,\n headerActions,\n className,\n widgetType,\n id,\n layout,\n params,\n setParam,\n onDelete,\n loading,\n errors,\n theme,\n hideWidgetName,\n innerPadding,\n contentHeight,\n contentMaxHeight,\n ...other\n } = props;\n\n const useStyles = makeStyles((theme) => ({\n root: {\n '&.react-resizable-hide .react-resizable-handle': {\n display: 'none'\n }\n },\n darkRoot: {\n '&.react-resizable-hide .react-resizable-handle': {\n display: 'none'\n },\n background: '#424242',\n color: 'white'\n },\n anyRoot: {\n '& .MuiCardContent-root': {\n justifyContent: 'space-between',\n overflow: 'auto',\n padding: 0\n }\n },\n handle: {\n cursor: 'move',\n '&:hover': {\n backgroundColor: theme.palette.action.hover\n },\n display: hideWidgetName && 'none'\n },\n loadingContent: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center'\n },\n innerWidgetContentContainer: {\n height:\n widgetType === 'TransformerLoadWidget'\n ? 'auto'\n : contentHeight\n ? contentHeight\n : '100%',\n maxHeight: contentMaxHeight ? contentMaxHeight : '',\n minWidth: widgetType === 'ProgressBarWidget' ? 0 : 270,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n padding:\n innerPadding ||\n (widgetType === 'VEERegisterRead' ? 0 : theme.spacing(2))\n }\n }));\n const classes = useStyles();\n const raised = /(^|\\s)react-draggable-dragging(\\s|$)/.test(className ?? '');\n\n let body = children;\n if (loading && !body) {\n body = (\n <div className={classes.loadingContent}>\n <CircularProgress size={64} />\n </div>\n );\n }\n if (errors && !body) {\n body = <div>Unexpected error</div>;\n }\n\n return (\n <FUICard\n {...other}\n className={clsx(\n className,\n theme === 'dark' ? classes.darkRoot : classes.root,\n classes.anyRoot\n )}\n raised={raised}\n CardHeaderProps={{\n className: classes.handle,\n 'data-handle': true\n }}\n headerActions={\n <>\n {headerActions}\n <FUICardHeaderMenu>\n <FUIMenuItem\n onClick={onDelete}\n fluentIcon={DeleteIcon}\n primary='Delete'\n />\n </FUICardHeaderMenu>\n </>\n }\n >\n <div className={classes.innerWidgetContentContainer}>{body}</div>\n </FUICard>\n );\n};\n","import React, { memo, useCallback, useMemo } from 'react';\nimport { WidgetCard } from './WidgetCard';\nimport { useShellStore } from '../stores/shellStore';\n\n/**\n * Widget implementation for dashboards\n */\nlet DashboardWidget = (props) => {\n const {\n widgetType,\n id,\n deleteCard,\n children,\n params: paramValues,\n setParams,\n ...other\n } = props;\n const { getWidget, isValidWidget } = useShellStore();\n const onDelete = useCallback(() => {\n deleteCard(id);\n }, [deleteCard, id]);\n\n const { Widget, params: paramDefs } = useMemo(() => {\n if (!isValidWidget || !getWidget) {\n return {};\n }\n if (isValidWidget(widgetType) && getWidget) {\n return getWidget(widgetType);\n }\n\n return {};\n }, [widgetType, getWidget, isValidWidget]);\n\n const params = useMemo(() => {\n const params = {};\n if (paramDefs) {\n for (const name in paramDefs) {\n params[name] = paramDefs[name].defaultValue;\n }\n for (const param in paramValues) {\n params[param] = paramValues[param];\n }\n }\n\n return params;\n }, [paramDefs, paramValues]);\n const setParam = useCallback(\n (name, value) => setParams(id, { [name]: value }),\n [id, setParams]\n );\n\n if (!isValidWidget || !getWidget) {\n return (\n <WidgetCard {...other} title='Error'>\n isValidWidget or getWidget functions are not defined\n </WidgetCard>\n );\n }\n\n if (!Widget) {\n return (\n <WidgetCard {...other} title='Error'>\n Unknown widget type \"{widgetType}\".\n </WidgetCard>\n );\n } else {\n return (\n <Widget\n {...other}\n id={id}\n params={params}\n setParam={setParam}\n onDelete={onDelete}\n >\n {children}\n </Widget>\n );\n }\n};\n\nexport default memo(DashboardWidget);\n","import React, { useMemo } from 'react';\nimport DashboardCardGrid from '../dashboard/DashboardCardGrid';\nimport DashboardWidget from '../dashboard/DashboardWidget';\nimport getWidgetLayout from '../dashboard/getWidgetLayout.ts';\nimport { useShellStore } from '../stores/shellStore';\n\nconst Page = (props) => {\n const { gridConfig, widgetConfig, disableMargin } = props;\n const { getWidget, isValidWidget } = useShellStore();\n const gridProperties = gridConfig ? JSON.parse(gridConfig) : null;\n let widgets = widgetConfig || null;\n\n if (typeof widgetConfig === 'string') {\n widgets = JSON.parse(widgetConfig);\n }\n\n const calculateLayouts = () => {\n if (!widgets) return null;\n\n const layouts = {};\n for (const widget of widgets) {\n for (const breakpoint in widget.layout) {\n if (breakpoint === '__typename' || !widget.layout[breakpoint]) continue;\n layouts[breakpoint] = layouts[breakpoint] || [];\n const { __typename, ...layout } = widget.layout[breakpoint];\n layouts[breakpoint].push({\n ...getWidgetLayout(getWidget, widget.widgetType),\n isResizable: widget.params.isResizable || false,\n ...layout,\n i: widget.id\n });\n }\n }\n\n return layouts;\n };\n\n const layouts = useMemo(\n () => calculateLayouts(),\n [calculateLayouts, widgetConfig]\n );\n\n const cards = useMemo(\n () =>\n widgets &&\n widgets.map(({ __typename, ...widget }) => (\n <DashboardWidget key={widget.id} {...widget} />\n )),\n [widgets]\n );\n\n if (!layouts) return null;\n\n return (\n <DashboardCardGrid\n layouts={layouts}\n gridProperties={gridProperties}\n disableMargin={disableMargin}\n >\n {cards}\n </DashboardCardGrid>\n );\n};\nexport default Page;\n","import React from 'react'\nimport { makeStyles, Divider } from '@material-ui/core'\nimport { ToolBarButton } from './ToolBarButton'\nimport { LayoutUnit } from '../../../layout/LayoutUnit'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n paddingLeft: theme.spacing(1)\n }\n}))\n\nexport const AmbientPopoverMenuItem = ({ label, component, click }) => {\n const classes = useStyles()\n\n return (\n <div className={classes.root}>\n <LayoutUnit unit='nudge' />\n <ToolBarButton label={label} component={component} click={click} icon={false} />\n <LayoutUnit unit='nudge' />\n <Divider />\n </div>\n )\n}\n","import React, { useState } from 'react';\nimport { makeStyles, Popover } from '@material-ui/core';\nimport {\n ArrowUpRightIcon,\n PDFIcon,\n ExcelDocumentIcon,\n TextDocumentIcon\n} from '@fluentui/react-icons';\nimport { AmbientPopoverMenuItem } from '../../../inputs/buttons/AmbientPopoverMenuItem';\nimport { FluentIconButton } from '../../../inputs/buttons/FluentIconButton';\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n popoverRoot: {},\n icon: {\n color: theme.palette.secondary.main\n }\n}));\n\nexport const PAHExport = ({ exportCSV, exportExcel, exportPDF }) => {\n const classes = useStyles();\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 ? 'simple-popover' : undefined;\n\n const gridControlsExport = [\n {\n label: 'Export CSV',\n component: TextDocumentIcon,\n click: exportCSV,\n key: 1\n },\n {\n label: 'Export Excel',\n component: ExcelDocumentIcon,\n click: exportExcel,\n key: 2\n }\n ];\n\n // if (exportPDF) {\n // gridControlsExport.push({\n // label: 'Export PDF',\n // component: PDFIcon,\n // click: exportPDF,\n // key: 3\n // });\n // }\n\n return (\n <div className={classes.root}>\n <FluentIconButton\n className={classes.icon}\n icon={ArrowUpRightIcon}\n onClick={handleClick}\n />\n\n <Popover\n classes={{ root: classes.popoverRoot }}\n square\n elevation={1}\n id={id}\n open={open}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left'\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left'\n }}\n >\n <div style={{ width: 140 }}>\n <div>\n {gridControlsExport.map((item) => {\n return (\n <AmbientPopoverMenuItem\n label={item.label}\n component={item.component}\n click={item.click}\n />\n );\n })}\n </div>\n </div>\n </Popover>\n </div>\n );\n};\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useRef,\n createRef\n} from 'react';\nimport {\n makeStyles,\n MenuItem,\n Typography,\n Popover,\n ButtonBase,\n Badge,\n IconButton\n} from '@material-ui/core';\nimport { FluentIcon } from '../../../utilities/FluentIcon';\nimport clsx from 'clsx';\nimport { MoreVerticalIcon } from '@fluentui/react-icons';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexSkrink: 0,\n overflow: 'hidden'\n },\n tabsWrapper: {\n display: 'flex',\n gap: (props) => (props?.variant === 'block' ? theme.spacing(1) : null),\n flexGrow: 1\n },\n tab: {\n padding: `8px 18px`,\n flex: 1\n },\n blockTab: {\n backgroundColor: theme.palette.background.paper\n },\n activeTab: {\n borderBottom: (props) =>\n props?.variant === 'block'\n ? null\n : `2px solid ${theme.palette.secondary.main}`,\n backgroundColor: (props) =>\n props?.variant === 'block' ? theme.palette.secondary.light : null,\n color: (props) =>\n props?.variant === 'block'\n ? theme.palette.getContrastText(theme.palette.secondary.light)\n : null\n },\n moreButton: {\n marginTop: theme.spacing(1),\n width: theme.spacing(1),\n height: theme.spacing(1),\n borderRadius: 2\n },\n menuItem: {\n whiteSpace: 'normal',\n width: (props) => (props?.menuWidth ? props?.menuWidth : '170px')\n },\n popoverWrapper: {\n maxHeight: (props) =>\n props?.menuMaxHeight ? props?.menuMaxHeight : '250px'\n }\n}));\n\nexport const UdpTabs = (props) => {\n const {\n value,\n onChange,\n className,\n menuItemProps,\n tabList,\n variant,\n buttonWidth\n } = props;\n const classes = useStyles(props);\n const tabContainerRef = useRef(null);\n const innerTabContainerRef = useRef(null);\n const [anchorEl, setAnchorEl] = useState(null);\n const [visibleTabList, setVisibleTabList] = useState(null);\n const [menuTabList, setMenuTabList] = useState(null);\n const [initialTotalTabWidth, setInitialTotalTabWidth] = useState(null);\n const [initialTabWidth, setInitialTabWidth] = useState();\n const gapWidth = 8;\n const open = Boolean(anchorEl);\n\n const currentTabList = useMemo(() => {\n return tabList?.map((tab, index) => ({\n id: index,\n ...tab,\n ref: createRef()\n }));\n }, [tabList]);\n\n const handlePopoverClick = useCallback((event, index) => {\n setAnchorEl(event.currentTarget);\n }, []);\n\n const handlePopoverClose = () => {\n setAnchorEl(null);\n };\n\n const menuItemSelected = useMemo(() => {\n return !!menuTabList?.find((tab) => tab?.id === value);\n }, [value, menuTabList]);\n\n const getInitialTabWidth = useCallback(\n (tabsElements, currentTabList) => {\n let totalTabWidth = 0;\n let tabWidth = [];\n\n if (\n tabsElements?.length === currentTabList?.length &&\n !initialTotalTabWidth\n ) {\n for (let i = 0; i < tabsElements.length; i++) {\n totalTabWidth += tabsElements[i].clientWidth;\n if (variant === 'block') {\n totalTabWidth += gapWidth;\n }\n tabWidth[i] = tabsElements[i].clientWidth;\n }\n setInitialTotalTabWidth(totalTabWidth);\n setInitialTabWidth(tabWidth);\n\n return { totalTabWidth, tabWidth };\n }\n\n return { totalTabWidth: initialTotalTabWidth, tabWidth: initialTabWidth };\n },\n [initialTabWidth, initialTotalTabWidth, variant]\n );\n\n const calculateHiddenTabs = useCallback(() => {\n if (innerTabContainerRef.current) {\n const containerWidth = innerTabContainerRef.current.clientWidth;\n const tabsElements = Array.from(innerTabContainerRef.current.children);\n const moreBtnWidth = 24;\n let hiddenTabsArray = [];\n let visibleTabsArray = Array.from(currentTabList);\n const { totalTabWidth, tabWidth } = getInitialTabWidth(\n tabsElements,\n currentTabList\n );\n\n if (totalTabWidth > containerWidth) {\n let accumulatedWidth = 0;\n for (let i = 0; i < tabWidth?.length; i++) {\n accumulatedWidth += tabWidth[i];\n if (variant === 'block') {\n accumulatedWidth += gapWidth;\n }\n\n if (accumulatedWidth > containerWidth - moreBtnWidth) {\n hiddenTabsArray = Array.from(currentTabList).slice(i);\n visibleTabsArray = Array.from(currentTabList).slice(0, i);\n break;\n }\n }\n }\n setVisibleTabList(visibleTabsArray);\n setMenuTabList(hiddenTabsArray);\n }\n }, [currentTabList, getInitialTabWidth, variant]);\n\n useEffect(() => {\n // initial visible tab list\n setVisibleTabList(currentTabList);\n }, [currentTabList]);\n\n useEffect(() => {\n calculateHiddenTabs();\n\n const observer = new ResizeObserver((entries) => {\n handlePopoverClose();\n calculateHiddenTabs();\n });\n\n if (tabContainerRef.current) {\n observer.observe(tabContainerRef.current);\n }\n\n // Cleanup observer on component unmount\n return () => {\n observer.disconnect();\n };\n }, [calculateHiddenTabs]);\n\n return (\n <div>\n <div className={clsx(classes.root, className)} ref={tabContainerRef}>\n <div\n className={classes.tabsWrapper}\n ref={innerTabContainerRef}\n style={\n variant === 'spread' ? { justifyContent: 'space-between' } : null\n }\n >\n {visibleTabList?.map((item, index) => (\n <ButtonBase\n // style={variant === 'spread' ? { flex: 1 } : null}\n style={{\n flex: variant === 'spread' && 1,\n width: !!buttonWidth && buttonWidth\n }}\n key={index}\n id={\n 'udpRecord-UdpTabs-MenuItem-' + item?.label?.replace(/ /g, '-')\n }\n udprecordid={\n 'udpRecord-UdpTabs-MenuItem-' + item?.label?.replace(/ /g, '-')\n }\n >\n <div\n className={clsx(classes.tab, {\n [classes.blockTab]: variant === 'block',\n [classes.activeTab]: value === item?.id\n })}\n onClick={(e) => {\n onChange(e, item?.id);\n if (item?.onClick) {\n item.onClick();\n }\n setAnchorEl(null);\n }}\n >\n <Typography\n noWrap\n style={{\n fontWeight: variant === 'spread' ? 'bold' : 'normal'\n }}\n >\n {item?.label}\n </Typography>\n </div>\n </ButtonBase>\n ))}\n {menuTabList?.length > 0 && (\n <IconButton\n onClick={handlePopoverClick}\n className={classes.moreButton}\n color='primary'\n id='udpRecord-UdpTabs-MoreActions'\n udprecordid='udpRecord-UdpTabs-MoreActions'\n >\n <Badge\n color='secondary'\n variant='dot'\n invisible={menuItemSelected === false}\n >\n <FluentIcon component={MoreVerticalIcon} size='medium' />\n </Badge>\n </IconButton>\n )}\n </div>\n\n {!!menuTabList?.length && (\n <div>\n <Popover\n id='menuTabList'\n open={open}\n anchorEl={anchorEl}\n onClose={handlePopoverClose}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left'\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left'\n }}\n className={classes.popoverWrapper}\n >\n {menuTabList?.map((tab) => {\n return (\n <MenuItem\n key={tab?.id}\n id={\n 'udpRecord-UdpTabs-MenuItem-' +\n tab?.label?.replace(/ /g, '-')\n }\n udprecordid={\n 'udpRecord-UdpTabs-MenuItem-' +\n tab?.label?.replace(/ /g, '-')\n }\n onClick={(e) => {\n if (tab?.onClick) {\n tab.onClick();\n }\n\n if (onChange) {\n onChange(e, tab?.id);\n }\n setAnchorEl(null);\n }}\n className={clsx(classes.menuItem, className)}\n selected={tab?.id === value}\n {...menuItemProps}\n >\n <Typography>{tab?.label}</Typography>\n </MenuItem>\n );\n })}\n </Popover>\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { useMemo } from 'react';\n// @ts-ignore - TeleporterInstance type may not be exported\nimport { TeleporterInstance } from 'react-teleporter';\nimport { useTeleporterStore } from '../../../../stores/teleporterStore';\n\nexport const useAllTeleporters = (): [string, string, TeleporterInstance][] => {\n const teleporterMap = useTeleporterStore((state) => state.teleporterMap);\n\n const allTeleporters = useMemo(() => {\n const result: [string, string, TeleporterInstance][] = [];\n\n for (const [targetId, locationMap] of teleporterMap.entries()) {\n for (const [location, entry] of locationMap.entries()) {\n result.push([targetId, location, entry.teleporter]);\n }\n }\n\n return result;\n }, [teleporterMap]);\n\n return allTeleporters;\n};\n","import React, { useState, Fragment, useMemo } from 'react';\nimport {\n makeStyles,\n Slide,\n Typography,\n Collapse,\n Divider,\n LinearProgress,\n lighten\n} from '@material-ui/core';\nimport { StandardTitle } from '../../dataDisplay/typography/StandardTitle';\nimport { FluentIconButton } from '../../inputs/buttons/FluentIconButton';\nimport {\n SearchIcon,\n ChevronRightIcon,\n MaximumValueIcon,\n ChevronFold10Icon,\n ChevronUnfold10Icon,\n GroupListIcon,\n FilterIcon,\n MoreVerticalIcon,\n SaveIcon,\n DeleteIcon,\n ClearIcon\n} from '@fluentui/react-icons';\nimport { ToolBarButton } from '../../inputs/buttons/ToolBarButton';\nimport { PrimaryActionButton } from '../../inputs/buttons/PrimaryActionButton';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\nimport { PAHExport } from './ui/PAHExport';\nimport { StatusChip } from '../../dataDisplay/StatusChip';\nimport { useShellStore } from '../../../stores/shellStore';\nimport { UdpTabs } from '../../navigation/tabs/UdpTabs';\nimport { useAllTeleporters } from './ui/teleporter';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: 'flex',\n [theme.breakpoints.between('xs', 'sm')]: {\n height: 50\n }\n },\n title: {\n margin: theme.spacing(2)\n },\n titleWrapper: {\n paddingLeft: theme.spacing(2),\n paddingRight: (props) => (props.single ? theme.spacing(2) : 0),\n display: 'flex',\n alignItems: 'center'\n },\n subHeaderWrapper: {\n // display: 'flex',\n // justifyContent: 'flex-end',\n // marginTop: props => props.single && 6,\n width: '100%',\n marginTop: 0,\n [theme.breakpoints.down('xs')]: {\n justifyContent: 'flex-start'\n }\n },\n subHeader: {\n minWidth: (props) => props.subheader && 320,\n marginLeft: theme.spacing(2),\n [theme.breakpoints.between('sm', 'lg')]: {\n display: 'none'\n },\n [theme.breakpoints.down('xs')]: {\n display: 'none'\n }\n },\n denseSubtitle: {\n marginTop: theme.spacing(1.2),\n marginLeft: theme.spacing(2)\n // [theme.breakpoints.up('xl')]: {\n // display: 'none'\n // },\n // [theme.breakpoints.down('xs')]: {\n // display: 'none'\n // }\n },\n actionRow: {\n display: 'flex',\n flex: 1,\n alignItems: 'center'\n // [theme.breakpoints.up('lg')]: {\n // width: '100%',\n // },\n // paddingBottom: props => props.hidePAB && theme.spacing(2),\n },\n secondaryButtons: {\n display: 'flex',\n [theme.breakpoints.down('sm')]: {\n display: 'none'\n },\n alignItems: 'center'\n },\n secondaryButtonsMobile: {\n display: 'flex',\n padding: theme.spacing(1),\n background: theme.palette.divider,\n [theme.breakpoints.up('sm')]: {\n display: 'none'\n }\n },\n search: {\n marginRight: theme.spacing(2),\n marginTop: theme.spacing(3),\n\n flex: 1\n },\n close: {\n marginRight: theme.spacing(2)\n },\n pab: {\n display: 'flex',\n [theme.breakpoints.between('xs', 'sm')]: {\n position: 'fixed',\n bottom: theme.spacing(2),\n right: theme.spacing(2),\n zIndex: theme.zIndex.appBar\n }\n },\n titleOnly: {\n paddingBottom: theme.spacing(1)\n },\n advancedOptions: {\n backgroundColor: '#EEEEEE',\n width: '100%'\n },\n tabPageButtons: {\n height: 50,\n borderTop: `1px solid ${theme.palette.divider}`,\n paddingLeft: theme.spacing(2),\n backgroundColor: '#EEEEEE'\n },\n divider: {\n height: 25,\n marginLeft: theme.spacing(1),\n marginRight: theme.spacing(2)\n },\n functionIcons: {\n fontSize: 18,\n color: theme.palette.secondary.main\n },\n tabRow: {\n maxWidth: 500,\n [theme.breakpoints.down('sm')]: {\n width: 300\n },\n minHeight: '48px'\n },\n fullTabs: {\n [theme.breakpoints.down('xl')]: {\n maxWidth: 700\n },\n [theme.breakpoints.down('lg')]: {\n maxWidth: 500\n },\n [theme.breakpoints.down('sm')]: {\n maxWidth: '100vw'\n },\n minHeight: '48px'\n },\n iconButton: {\n marginTop: 9,\n marginLeft: 4\n },\n titleWrapperBack: {\n display: 'flex',\n flex: (props) => props.title && 1\n },\n buttomButtonRow: {\n display: 'flex',\n width: '100%'\n },\n\n bottomButtonsLeft: {\n display: 'flex',\n flex: 1,\n // width: '100%',\n justifyContent: 'flex-start'\n },\n bottomButtonsRigth: {\n display: 'flex',\n justifyContent: 'flex-end'\n },\n single: {\n display: 'flex'\n },\n containerStyle: {\n background: lighten(theme.palette.secondary.light, 0.9),\n padding: theme.spacing(1),\n paddingLeft: theme.spacing(2),\n borderTop: `1px solid ${theme.palette.divider} `\n },\n gridControlLineUp: {\n display: 'flex',\n alignItems: 'center',\n marginRight: theme.spacing(2)\n },\n additionalTitleComponent: {\n marginLeft: theme.spacing(2)\n }\n}));\n\nexport const PrimaryActionHeader = (props) => {\n const classes = useStyles(props);\n\n const {\n buttonLabel,\n title,\n subheader,\n handleClick,\n secondaryButtons,\n hidePAB = false,\n search,\n searchField,\n expandOptions,\n handleMouseLeave,\n expandedContent,\n handleChange,\n value,\n tabList,\n tabs,\n resizeGrid,\n collapse,\n expandAllItems,\n groups,\n showGroups,\n grid,\n clickBack,\n topRowSecondary,\n bottomRowSecondary,\n bottomRowSecondaryRight,\n loading,\n openGroups,\n openFilter,\n altInputs,\n loadingVal,\n exportGrid,\n openSearch = false,\n styleSearch,\n stepper,\n pabDisabled,\n switcher,\n single,\n lowerTray,\n lowerTraySearch,\n lowerTrayGrid,\n upperTrayGrid,\n exportCSV,\n exportExcel,\n exportPDF,\n expand,\n expandGrid,\n collapseGrid,\n resize,\n gridApi,\n saveGridConfig,\n deleteGridConfig,\n clearGridConfig,\n hideActionRow = false,\n allowAdditionalTitleComponent = false,\n allowAdditionalRightComponent = true,\n StatusChipProps = null,\n tabProps,\n tabVariant,\n additionalComponentId = '',\n ...otherProps\n } = props;\n\n const [searchExpanded, setSearchExpanded] = useState(openSearch);\n const currentContainerId = useShellStore((state) => state.currentContainerId);\n const allTeleporters = useAllTeleporters();\n\n const expandSearch = () => {\n setSearchExpanded(!searchExpanded);\n };\n\n function a11yProps(index) {\n return {\n id: `simple-tab-${index}`,\n 'aria-controls': `simple-tabpanel-${index}`\n };\n }\n\n const gridControlsExpand = [\n {\n label: '',\n aria: 'expand',\n component: ChevronUnfold10Icon,\n click: expandGrid,\n id: 1\n }\n ];\n const gridControlsResize = [\n {\n label: '',\n aria: 'resize',\n component: MaximumValueIcon,\n click: resizeGrid,\n id: 2\n }\n ];\n const gridControlsCollapse = [\n {\n label: '',\n aria: 'collapse',\n component: ChevronFold10Icon,\n click: collapseGrid,\n id: 3\n }\n ];\n\n const gridControlsGroup = [\n {\n label: 'Group',\n component: GroupListIcon,\n click: openGroups,\n id: 4\n }\n ];\n const gridControlsFilter = [\n {\n label: 'Filter',\n component: FilterIcon,\n click: openFilter,\n id: 5\n }\n ];\n\n const gridControlsSave = [\n {\n label: 'Save Grid Configuration',\n component: SaveIcon,\n click: saveGridConfig,\n id: 6\n }\n ];\n const gridControlsDelete = [\n {\n label: 'Delete Grid Configuration',\n component: DeleteIcon,\n click: deleteGridConfig,\n id: 7\n }\n ];\n const gridControlsClear = [\n {\n label: 'Clear Grid Configuration',\n component: ClearIcon,\n click: clearGridConfig,\n id: 8\n }\n ];\n\n const gridControlsExport = (\n <div>\n <PAHExport\n exportCSV={exportCSV || (() => gridApi?.exportDataAsCsv())}\n exportExcel={exportExcel || (() => gridApi?.exportDataAsExcel())}\n exportPDF={exportPDF}\n />\n </div>\n );\n const gridControlExpand = gridControlsExpand && (\n <div>\n {gridControlsExpand.map((item) => {\n return (\n <ToolBarButton\n label={item.label}\n title={item.label}\n expanded={true}\n component={item.component}\n click={item.click}\n aria={item.aria}\n key={item.id}\n />\n );\n })}\n </div>\n );\n const gridControlResize = gridControlsResize && (\n <div>\n {gridControlsResize.map((item) => {\n return (\n <ToolBarButton\n label={item.label}\n title={item.label}\n expanded={true}\n component={item.component}\n click={item.click}\n aria={item.aria}\n key={item.id}\n />\n );\n })}\n </div>\n );\n const gridControlCollapse = gridControlsCollapse && (\n <div>\n {gridControlsCollapse.map((item) => {\n return (\n <ToolBarButton\n label={item.label}\n title={item.label}\n expanded={true}\n component={item.component}\n click={item.click}\n aria={item.aria}\n key={item.id}\n />\n );\n })}\n </div>\n );\n const gridControlSave = gridControlsSave && (\n <div>\n {gridControlsSave.map((item) => {\n return (\n <ToolBarButton\n label={item.label}\n title={item.label}\n expanded={true}\n component={item.component}\n click={item.click}\n aria={item.aria}\n key={item.id}\n />\n );\n })}\n </div>\n );\n const gridControlDelete = gridControlsDelete && (\n <div>\n {gridControlsDelete.map((item) => {\n return (\n <ToolBarButton\n label={item.label}\n title={item.label}\n expanded={true}\n component={item.component}\n click={item.click}\n aria={item.aria}\n key={item.id}\n />\n );\n })}\n </div>\n );\n const gridControlClear = gridControlsClear && (\n <div>\n {gridControlsClear.map((item) => {\n return (\n <ToolBarButton\n label={item.label}\n title={item.label}\n expanded={true}\n component={item.component}\n click={item.click}\n aria={item.aria}\n key={item.id}\n />\n );\n })}\n </div>\n );\n\n const searchToggle = (\n <>\n <div style={{ display: 'flex' }}>\n {searchExpanded && (\n <FluentIconButton\n click={expandSearch}\n aria-label='close search'\n className={classes.close}\n icon={ChevronRightIcon}\n onClick={expandSearch}\n size='small'\n />\n )}\n </div>\n <div className={classes.search} style={{ flex: 1 }}>\n <div>\n {searchExpanded && (\n <div>\n <Slide\n direction='left'\n in={expandSearch}\n mountOnEnter\n unmountOnExit\n >\n <div className={classes.searchWrapper}>{searchField}</div>\n </Slide>\n </div>\n )}\n </div>\n </div>\n </>\n );\n\n const LowerTrayShell = ({ children }) => {\n return <div className={classes.containerStyle}>{children}</div>;\n };\n\n const GridControlLineUp = () => {\n return (\n <div className={classes.gridControlLineUp}>\n {saveGridConfig && gridControlSave}\n {deleteGridConfig && gridControlDelete}\n {clearGridConfig && gridControlClear}\n {expandGrid && gridControlExpand}\n {resizeGrid && gridControlResize}\n {collapseGrid && gridControlCollapse}\n {exportGrid && gridControlsExport}\n </div>\n );\n };\n\n const additionalTitleTeleportedComponents = useMemo(() => {\n const components = [];\n allTeleporters.forEach(([targetId, location, teleporter]) => {\n const Target = teleporter.Target;\n if (\n targetId === additionalComponentId &&\n location === 'title'\n ) {\n components.push(\n <div key={targetId} className='teleport-target'>\n <Target />\n </div>\n );\n }\n })\n return components;\n }, [additionalComponentId, allTeleporters]);\n\n return (\n <div key={currentContainerId}>\n <div className={single && classes.single}>\n {/* {switcher && <PAHViewSwitcher>Meeting Title</PAHViewSwitcher>} */}\n <div className={classes.titleWrapperBack}>\n {clickBack && (\n <div className={classes.iconButton}>\n <FluentIconButton icon={ArrowBackIcon} onClick={clickBack} />\n </div>\n )}\n\n {title && (\n <div className={classes.root}>\n <div className={classes.titleWrapper}>\n <StandardTitle removeMarginTop={single}>{title}</StandardTitle>\n {single && subheader && (\n <Typography\n className={classes.denseSubtitle}\n variant='subtitle1'\n component='h2'\n >\n {subheader}\n </Typography>\n )}\n\n {allowAdditionalTitleComponent && (\n <div className={classes.additionalTitleComponent}>\n {additionalTitleTeleportedComponents.map(value => {\n return value;\n })}\n </div>\n )}\n </div>\n </div>\n )}\n {!title && allowAdditionalTitleComponent && (\n <div className={classes.additionalTitleComponent}>\n {additionalTitleTeleportedComponents.map(value => {\n return value;\n })}\n </div>\n )}\n {StatusChipProps && (\n <div className={classes.root}>\n <div className={classes.titleWrapper}>\n <StatusChip\n label={StatusChipProps?.label}\n status={StatusChipProps?.status}\n />\n </div>\n </div>\n )}\n </div>\n <div className={classes.subHeaderWrapper}>\n {/* <div className={classes.subHeader}>\n <Typography variant=\"subtitle1\">{subheader}</Typography>\n </div> */}\n {stepper}\n {!hideActionRow && (\n <div className={classes.actionRow}>\n {!single && subheader && (\n <Typography\n className={classes.denseSubtitle}\n variant='subtitle1'\n component='h2'\n >\n {subheader}\n </Typography>\n )}\n <div className={grid ? classes.tabRow : classes.fullTabs}>\n {tabList?.length > 0 && (\n <UdpTabs\n value={value}\n onChange={handleChange}\n tabList={tabList}\n variant={tabVariant}\n />\n )}\n </div>\n\n {search && searchToggle}\n <div style={{ flex: 1 }} />\n\n <div className={classes.secondaryButtons}>\n {!searchExpanded && search && (\n <ToolBarButton\n label='Search'\n component={SearchIcon}\n click={expandSearch}\n />\n )}\n {search && (\n <Divider orientation='vertical' className={classes.divider} />\n )}\n\n {/* {grid &&\n gridControls.map(item => {\n return (\n <ToolBarButton\n label={item.label}\n title={item.label}\n expanded\n component={item.component}\n click={item.click}\n aria={item.aria}\n key={item.id}\n />\n );\n })} */}\n {(expandGrid ||\n resizeGrid ||\n collapseGrid ||\n exportGrid ||\n saveGridConfig ||\n deleteGridConfig ||\n clearGridConfig) &&\n upperTrayGrid && <GridControlLineUp expand={expand} />}\n\n {grid &&\n openFilter &&\n gridControlsFilter.map((item) => {\n return (\n <ToolBarButton\n label={item.label}\n title={item.label}\n expanded={true}\n component={item.component}\n click={item.click}\n aria={item.aria}\n key={item.id}\n />\n );\n })}\n\n {grid &&\n openGroups &&\n gridControlsGroup.map((item) => {\n return (\n <ToolBarButton\n label={item.label}\n title={item.label}\n expanded={true}\n component={item.component}\n click={item.click}\n aria={item.aria}\n key={item.id}\n />\n );\n })}\n\n {/* {grid &&\n exportGrid &&\n gridControlsExport.map(item => {\n return (\n <ToolBarButton\n label={item.label}\n title={item.label}\n expanded\n component={item.component}\n click={item.click}\n aria={item.aria}\n key={item.id}\n />\n );\n })} */}\n\n {grid && searchExpanded && (\n <div>\n <FluentIconButton\n id='udpRecord-PrimaryActionHeader-ClosePanel'\n udprecordid='udpRecord-PrimaryActionHeader-ClosePanel'\n icon={MoreVerticalIcon}\n // onClick={toggleExpandedHeader}\n aria-label='Close Panel'\n />\n </div>\n )}\n\n {secondaryButtons &&\n !tabs &&\n secondaryButtons.map((item, index) => {\n return (\n <ToolBarButton\n label={item.label}\n expanded={searchExpanded}\n component={item.component}\n click={item.click}\n key={item.id ?? index}\n aria={item.label}\n disabled={item.disabled}\n />\n );\n })}\n </div>\n <div>\n {allowAdditionalRightComponent &&\n allTeleporters.map(([targetId, location, teleporter]) => {\n const Target = teleporter.Target;\n if (\n targetId === additionalComponentId &&\n location === 'right'\n ) {\n return (\n <div key={targetId} className='teleport-target'>\n <Target />\n </div>\n );\n } else {\n return null;\n }\n })}\n </div>\n {!hidePAB && (\n <div className={classes.pab}>\n {topRowSecondary &&\n topRowSecondary.map((item, index) => {\n return (\n <ToolBarButton\n label={item.label}\n expanded={searchExpanded}\n component={item.component}\n click={item.click}\n key={item.id ?? index}\n aria={item.label}\n />\n );\n })}\n\n <PrimaryActionButton\n disabled={pabDisabled}\n onClick={handleClick}\n {...otherProps}\n >\n {buttonLabel}\n </PrimaryActionButton>\n </div>\n )}\n </div>\n )}\n </div>\n\n <div\n className={clsx(\n classes.secondaryButtons,\n (altInputs || bottomRowSecondary) && classes.tabPageButtons\n )}\n >\n <div className={classes.buttomButtonRow}>\n <div className={classes.bottomButtonsLeft}>\n {bottomRowSecondary &&\n bottomRowSecondary.map((item, index) => {\n return (\n <ToolBarButton\n label={item.label}\n expanded={!tabs && searchExpanded}\n component={item.component}\n click={item.click}\n key={item.id ?? index}\n />\n );\n })}\n </div>\n <div className={classes.bottomButtonsRigth}>\n {bottomRowSecondaryRight &&\n bottomRowSecondaryRight.map((item, index) => {\n return (\n <ToolBarButton\n label={item.label}\n expanded={!tabs && searchExpanded}\n component={item.component}\n click={item.click}\n key={item.id ?? index}\n />\n );\n })}\n </div>\n\n {altInputs}\n </div>\n <div>\n {showGroups && <Divider />}\n {showGroups && groups}\n </div>\n </div>\n\n <Collapse in={expandOptions} timeout='auto'>\n <div onMouseLeave={handleMouseLeave}>\n {/* <div> */}\n <div className={classes.advancedOptions}>{expandedContent}</div>\n </div>\n </Collapse>\n {loading && <LinearProgress value={loadingVal} />}\n </div>\n {lowerTray && (\n <LowerTrayShell>\n <div style={{ display: 'flex', justifyContent: 'flex-end' }}>\n <div style={{ display: 'flex' }}>\n {!searchExpanded && lowerTraySearch && (\n <ToolBarButton\n label='Search'\n component={SearchIcon}\n click={expandSearch}\n />\n )}\n {searchToggle}\n </div>\n {lowerTrayGrid && <GridControlLineUp />}\n </div>\n </LowerTrayShell>\n )}\n\n <div className={classes.secondaryButtonsMobile}>\n {secondaryButtons &&\n !tabs &&\n secondaryButtons.map((item, index) => {\n return (\n <ToolBarButton\n label={item.label}\n expanded={searchExpanded}\n component={item.component}\n click={item.click}\n key={item.id ?? index}\n aria={item.label}\n disabled={item.disabled}\n />\n );\n })}\n </div>\n </div>\n );\n};\n\nPrimaryActionHeader.propTypes = {\n /**\n * Primary action button label\n */\n buttonLabel: PropTypes.string,\n /**\n * Page title\n */\n title: PropTypes.string.isRequired,\n /**\n * Page subtitle\n */\n subheader: PropTypes.string,\n /**\n * Primary action button function\n */\n handleClick: PropTypes.func,\n /**\n * prop for mapped secondary button data\n */\n secondaryButtons: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n component: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),\n click: PropTypes.func,\n key: PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n })\n ),\n /**\n * Hides Primary Action Button (not recommended)\n */\n hidePAB: PropTypes.bool,\n /**\n * Allows search option to display\n */\n search: PropTypes.bool,\n /**\n * Search field designed to fit header space\n */\n searchField: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),\n /**\n * If true, expanded space for advanced search is open\n */\n expandOptions: PropTypes.func,\n /**\n * Function to close expanded space when the user mouse leaves\n */\n handleMouseLeave: PropTypes.string,\n /**\n * The contents of the expanded search\n */\n expandedContent: PropTypes.node,\n /**\n * Handle change option for tabs (when the tab prop is active)\n */\n handleChange: PropTypes.string,\n /**\n * Sends value that determines what tab content is visable (when the tab prop is active)\n */\n value: PropTypes.oneOfType([PropTypes.node, false]),\n /**\n * Prop to pass an array of tab lables to display tabs (when the tab prop is active)\n */\n tabList: PropTypes.node,\n /**\n * Prop option to display tabs. Tabs are available when true. Also provides additional formatting.\n */\n tabs: PropTypes.bool,\n /**\n * Click event to resize grid to fit (when using the PAH to display a grid).\n */\n resizeGrid: PropTypes.func,\n /**\n * Click event to collapse Ag Grid when grouped (when using the PAH to display a grid).\n */\n collapse: PropTypes.func,\n /**\n * Click event to expand Ag Grid when grouped (when using the PAH to display a grid).\n */\n expandAllItems: PropTypes.func,\n /**\n * Click event to save Ag Grid configurations (e.g. filters, sorting, column widths, etc.) when using the PAH to display a grid.\n */\n saveGridConfig: PropTypes.func,\n /**\n * Click event to delete Ag Grid configurations (e.g. filters, sorting, column widths, etc.) when using the PAH to display a grid.\n */\n deleteGridConfig: PropTypes.func,\n /**\n * Click event to clear Ag Grid configurations (e.g. filters, sorting, column widths, etc.) when using the PAH to display a grid.\n */\n clearGridConfig: PropTypes.func,\n /**\n * Prop that accepts a component of groups (when using the PAH to display a grid).\n */\n groups: PropTypes.node,\n /**\n * Prop option to display grid. Grid formatting is available when true.\n */\n grid: PropTypes.bool,\n /**\n * Prop option to display grid. Grid formatting is available when true.\n */\n otherProps: PropTypes.any,\n /**\n * Prop option to show secondary buttons on top row.\n */\n bottomRowSecondary: PropTypes.array,\n /**\n * Prop option to show secondary buttons on bottom row.\n */\n topRowSecondary: PropTypes.array,\n /**\n * Exposes onClick for back arrow. Only displays arrow when a function is provided.\n */\n clickBack: PropTypes.func,\n /**\n * Toggles visaiblity for loading progress bar.\n */\n loading: PropTypes.bool,\n /**\n * The value of progress loading.\n */\n loadingVal: PropTypes.number,\n /**\n * Exposes function to open group options.\n */\n openGroups: PropTypes.func,\n /**\n * Exposes function to open filter options.\n */\n openFilter: PropTypes.func,\n /**\n * Alternate method to include toolbar inputs.\n */\n altInputs: PropTypes.node,\n /**\n * If true, actionRow will be hidden\n */\n hideActionRow: PropTypes.bool,\n /**\n * Props passed into FluentSimpleTabs Component\n */\n tabProps: PropTypes.object,\n /**\n * Determines if the primary action header should be multiple rows\n */\n single: PropTypes.bool\n};\n\nPrimaryActionHeader.defaultProps = {\n hidePAB: false\n};\n","import React, { createContext, useReducer } from 'react';\n\nconst initialState: any = {};\n\n/**\n * The Page context, shared amongst the Page\n * and all children. Generally used to share state between\n * Widgets. Call dispatch() to update the state. Currently\n * only supports dispatch types of \"set <state_property>\".\n * Example: dispatch({ type: \"set mySharedProperty\", value: oldSharedProperty + 1 });\n */\nconst pageContext = createContext(\n {} as { state: any; dispatch: React.Dispatch<{ type: string; value?: any }> }\n);\nconst { Provider } = pageContext;\n\n/**\n * Sets shared state based on an action type and a value.\n * action.type is in the format: <operator> <prop>\n * Currently the only supported action type is \"set <prop>\",\n * which will set state.prop to action.value.\n * @param state The current state\n * @param action A type and value to alter the current state\n * @returns The new state\n */\nconst reducer = (state: any, action: { type: string; value?: any }) => {\n // Action.type should be in the format: <operator> <prop>. Ex: set sharedId\n const operator = action.type.substr(0, action.type.indexOf(' '));\n const prop = action.type.substr(action.type.indexOf(' ') + 1);\n\n switch (operator) {\n case 'set':\n const newState = { ...state, [prop]: action.value };\n return newState;\n default:\n throw new Error('Unknown operator');\n }\n};\n\n/**\n * A Context component to wrap around a Page. Allows\n * sharing of state amongst sibling Widgets.\n * @returns\n */\nconst PageContextProvider = ({ children }: any) => {\n const [state, dispatch] = useReducer(reducer, initialState);\n\n return <Provider value={{ state, dispatch }}>{children}</Provider>;\n};\n\nexport { pageContext, PageContextProvider };\n","import { useHistory, useLocation } from 'react-router-dom';\n\nexport const useSetLocationState = () => {\n const history = useHistory();\n const location = useLocation();\n\n const setLocationState = (newState) => {\n const currentState = location.state || {};\n\n // Avoid unnecessary replace if state is already the same\n const hasChanged = Object.entries(newState).some(\n ([key, value]) => currentState[key] !== value\n );\n if (!hasChanged || !!location?.state) return;\n\n history.replace({\n pathname: location.pathname,\n search: location.search,\n hash: location.hash,\n state: {\n ...currentState,\n ...newState\n }\n });\n };\n\n return setLocationState;\n};\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Redirect } from 'react-router-dom';\nimport Page from './Page';\nimport { makeStyles, Card, CircularProgress } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { PrimaryActionHeader } from '../UI/utilityDisplay/utilityHeader/PrimaryActionHeader';\nimport { PageContextProvider } from '../contexts/PageContext.tsx';\nimport { useAxiosGet } from '../utilities/useAxiosGet';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { v4 as uuid } from 'uuid';\nimport { useTranslation } from 'react-i18next';\nimport { useSetLocationState } from '../hooks/useSetLocationState';\nimport { ConfigService } from 'udp-react-stencil-component-library';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n marginTop: (props) => (props.disableMargins ? 0 : theme.spacing(3)),\n marginRight: (props) => (props.disableMargins ? 0 : theme.spacing(3)),\n marginLeft: (props) => (props.disableMargins ? 0 : theme.spacing(3)),\n height: (props) => props.height ?? '100%',\n overflow: (props) => props.height && 'auto'\n },\n staticRoot: {\n marginTop: 0,\n marginRight: 0,\n marginLeft: 0,\n height: (props) => props.height ?? '100%',\n overflow: (props) => props.height && 'auto'\n },\n title: {\n flex: 1,\n marginBottom: theme.spacing(1)\n },\n icon: {\n marginTop: theme.spacing(-2.5)\n },\n loadingContent: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: (props) =>\n props.loadingHeight ? props.loadingHeight : 'calc(100vh - 160px)'\n }\n}));\n\nexport const PageContainer = (props) => {\n const {\n user,\n widgetParams,\n redirectSlug,\n pageData,\n pageLoading = false,\n disableMargin = true,\n location,\n fromMenu = false,\n loadingHeight,\n isHomePage = false\n } = props;\n const classes = useStyles(props);\n const [page, setPage] = useState(null);\n const [alertWarnings, setAlertWarnings] = useState([]);\n const params = location?.state?.params;\n const pathPageId = location?.pathname?.replace('/page/', '');\n const pageId = (pathPageId === '/' ? null : pathPageId) || params?.PageId;\n const { t } = useTranslation();\n const setLocationState = useSetLocationState();\n\n const [{ data: pageInfo, loading: pageInfoLoading }] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `page/${pageId}`,\n {},\n !!!pageId,\n false\n );\n\n const [\n { data: homePage, loading: homePageLoading, error: homePageError },\n refetchHomePage\n ] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `page/homePage?tenantId=${user?.currentTenantId}&productId=${ConfigService.config.UNITY_PRODUCT_ID}`,\n {},\n !isHomePage,\n false\n );\n\n const removeWarning = useCallback((id) => {\n setAlertWarnings((prevWarnings) =>\n prevWarnings.filter((warning) => warning.id !== id)\n );\n }, []);\n\n const getRequiredFieldWarnings = useCallback(\n (requiredFields = '', widgetParams) => {\n const fieldsStr = requiredFields || '';\n if (!fieldsStr.trim()) {\n return;\n }\n\n const warnings = [];\n const requiredFieldsMap = widgetParams?.requiredFieldsMap || {};\n const nodeObj = widgetParams?.nodeObj || {};\n const fields = fieldsStr.split(',').map((str) => str.trim());\n const missingRequiredFieldNames = [];\n\n fields.forEach((fieldName) => {\n const requiredField = requiredFieldsMap[fieldName];\n if (!requiredField?.value) {\n missingRequiredFieldNames.push(fieldName);\n } else {\n if (\n requiredField.type === 'entity' &&\n (nodeObj[requiredField.value] === undefined ||\n nodeObj[requiredField.value] === null)\n ) {\n missingRequiredFieldNames.push(fieldName);\n }\n }\n });\n\n missingRequiredFieldNames.forEach((name) => {\n warnings.push({\n id: uuid(),\n message: `${name} ${t('field is missing a value')}`\n });\n });\n return warnings;\n },\n [t]\n );\n\n const pages = useMemo(\n () =>\n page?.widgets &&\n Object.keys(JSON.parse(page.widgets)).map((key) => {\n // Static Page\n const widgetStr = JSON.parse(page.widgets)[key];\n const widget = widgetStr ? JSON.parse(widgetStr) : null;\n if (widget?.length) {\n widget.forEach((w) => {\n // Add additional parameters from menu. Will get overwriten if\n // key exists in page widget parms\n if (pageId) {\n w.params = {\n entityName: params?.entityName,\n pbiReportCode: params?.pbiReportCode,\n queryId: params?.queryId,\n inquiryTreeId: params?.InquiryTreeId,\n udpTagId: params?.udpTagId,\n requiredFieldsMap: params?.requiredFieldMapping,\n ...w.params\n };\n }\n if (widgetParams) {\n w.params = { ...w.params, ...widgetParams };\n }\n });\n }\n return (\n <DndProvider\n backend={HTML5Backend}\n key={pageId ? `${key}-${params?.entityName}` : key}\n >\n <Page\n user={user}\n gridConfig={JSON.parse(page.gridProperties)[key]}\n widgetConfig={widget}\n disableMargin={disableMargin}\n />\n </DndProvider>\n );\n }),\n [page, user, widgetParams, disableMargin, pageId, params]\n );\n\n useEffect(() => {\n if (pageId) {\n if (pageInfo) {\n setPage(pageInfo);\n }\n } else if (homePage) {\n setPage(homePage);\n } else {\n setPage(pageData);\n }\n setAlertWarnings([]);\n }, [pageId, pageInfo, pageData, homePage]);\n\n useEffect(() => {\n if (page?.widgets) {\n let warnings = [];\n Object.keys(JSON.parse(page.widgets)).forEach((key) => {\n // Static Page\n const widgetStr = JSON.parse(page.widgets)[key];\n const widget = widgetStr ? JSON.parse(widgetStr) : null;\n if (widget?.length) {\n widget.forEach((w) => {\n // Add additional parameters from menu. Will get overwriten if\n // key exists in page widget parms\n if (pageId) {\n w.params = {\n entityName: params?.entityName,\n pbiReportCode: params?.pbiReportCode,\n queryId: params?.queryId,\n inquiryTreeId: params?.InquiryTreeId,\n udpTagId: params?.udpTagId,\n requiredFieldsMap: params?.requiredFieldMapping,\n ...w.params\n };\n }\n if (widgetParams) {\n w.params = { ...w.params, ...widgetParams };\n }\n // Adding condition to compare pageId's\n if (fromMenu || page?.pageId === widgetParams?.pageId) {\n warnings = getRequiredFieldWarnings(\n w.requiredParameters,\n w.params\n );\n }\n });\n }\n });\n setAlertWarnings(warnings);\n }\n }, [page, widgetParams, pageId, params, fromMenu, getRequiredFieldWarnings]);\n\n // Setting location state label so that if this page was saved to favorites\n // we can determine the bread crumb\n useEffect(() => {\n if (page) {\n setLocationState({ label: t(page?.name) });\n }\n }, [setLocationState, t, page]);\n\n if (redirectSlug && !pageData) {\n return <Redirect to={redirectSlug} />;\n }\n\n if (pageInfoLoading || pageLoading) {\n return (\n <div className={classes.loadingContent}>\n <CircularProgress size={loadingHeight || 64} />\n </div>\n );\n }\n\n return (\n <>\n {page?.showPageName && (\n <Card variant={'outlined'}>\n <PrimaryActionHeader title={page.name} hidePAB single />\n </Card>\n )}\n <div\n className={page?.pageTypeId === 1 ? classes.staticRoot : classes.root}\n >\n {alertWarnings?.length > 0 &&\n alertWarnings.map((warning) => (\n <Alert\n key={warning.id}\n onClose={() => removeWarning(warning.id)}\n severity='warning'\n >\n {warning.message || ''}\n </Alert>\n ))}\n <PageContextProvider>{pages}</PageContextProvider>\n </div>\n </>\n );\n};\n"],"mappings":"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U;CAC5C,MAAM,UAAUA,YAAU,MAAM;CAEhC,MAAM,EACJ,aACA,OACA,WACA,aACA,kBACA,UAAU,OACV,QACA,aACA,eACA,kBACA,iBACA,cACA,OACA,SACA,MACA,YACA,UACA,gBACA,QACA,YACA,MACA,WACA,iBACA,oBACA,yBACA,SACA,YACA,YACA,WACA,YACA,YACA,aAAa,OACb,aACA,SACA,aACA,UACA,QACA,WACA,iBACA,eACA,eACA,WACA,aACA,WACA,QACA,YACA,cACA,QACA,SACA,gBACA,kBACA,iBACA,gBAAgB,OAChB,gCAAgC,OAChC,gCAAgC,MAChC,kBAAkB,MAClB,UACA,YACA,wBAAwB,GACxB,GAAG,eACD;CAEJ,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,WAAW;CAChE,MAAM,qBAAqB,eAAe,UAAU,MAAM,mBAAmB;CAC7E,MAAM,iBAAiB,mBAAmB;CAE1C,MAAM,qBAAqB;AACzB,oBAAkB,CAAC,eAAe;;CAUpC,MAAM,qBAAqB,CACzB;EACE,OAAO;EACP,MAAM;EACN,WAAW;EACX,OAAO;EACP,IAAI;EACL,CACF;CACD,MAAM,qBAAqB,CACzB;EACE,OAAO;EACP,MAAM;EACN,WAAW;EACX,OAAO;EACP,IAAI;EACL,CACF;CACD,MAAM,uBAAuB,CAC3B;EACE,OAAO;EACP,MAAM;EACN,WAAW;EACX,OAAO;EACP,IAAI;EACL,CACF;CAED,MAAM,oBAAoB,CACxB;EACE,OAAO;EACP,WAAW;EACX,OAAO;EACP,IAAI;EACL,CACF;CACD,MAAM,qBAAqB,CACzB;EACE,OAAO;EACP,WAAW;EACX,OAAO;EACP,IAAI;EACL,CACF;CAED,MAAM,mBAAmB,CACvB;EACE,OAAO;EACP,WAAW;EACX,OAAO;EACP,IAAI;EACL,CACF;CACD,MAAM,qBAAqB,CACzB;EACE,OAAO;EACP,WAAW;EACX,OAAO;EACP,IAAI;EACL,CACF;CACD,MAAM,oBAAoB,CACxB;EACE,OAAO;EACP,WAAW;EACX,OAAO;EACP,IAAI;EACL,CACF;CAED,MAAM,qBACJ,oCAAC,aACC,o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"}
@@ -66,4 +66,4 @@ const PageNotFoundRoute = () => {
66
66
 
67
67
  //#endregion
68
68
  export { PageNotFoundRoute, PageStatus };
69
- //# sourceMappingURL=PageNotFoundRoute-CxYZNEhN.js.map
69
+ //# sourceMappingURL=PageNotFoundRoute-D9dLbM_w.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageNotFoundRoute-CxYZNEhN.js","names":["useStyles","Link"],"sources":["../src/routes/components/PageStatus.jsx","../src/routes/components/PageNotFoundRoute.jsx"],"sourcesContent":["import React from 'react';\nimport {\n Button,\n makeStyles,\n Typography,\n Card,\n CardContent,\n} from '@material-ui/core';\nimport { Link } from 'react-router-dom';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n card: {\n background: theme.palette.primary.main,\n minWidth: props => props?.minWidth,\n minHeight: props => props?.minHeight,\n },\n subHeader: {\n marginTop: theme.spacing(3),\n },\n content: {\n color: theme.palette.getContrastText(theme.palette.primary.main),\n },\n header: {\n textAlign: 'center',\n marginTop: theme.spacing(2),\n },\n button: {\n marginTop: theme.spacing(8),\n display: 'flex',\n justifyContent: 'center',\n },\n largeDisplay: {\n fontSize: '4rem',\n color: theme.palette.getContrastText(theme.palette.primary.main),\n },\n message: {\n marginTop: theme.spacing(3),\n },\n}));\nexport const PageStatus = props => {\n const classes = useStyles(props);\n const {\n title,\n subheader,\n message,\n to,\n buttonLabel,\n statusCode,\n showButton = true,\n } = props;\n\n return (\n <div className={classes.root}>\n <Card className={classes.card}>\n <CardContent>\n <div className={classes.content}>\n <div className={classes.header}>\n {statusCode && (\n <div>\n <Typography className={classes.largeDisplay}>\n {statusCode}\n </Typography>\n </div>\n )}\n <div className={classes.subHeader}>\n <Typography variant=\"h6\">{title}</Typography>\n </div>\n </div>\n <div className={classes.message}>\n <Typography variant=\"overline\" style={{ fontWeight: 700 }}>\n {subheader}\n </Typography>\n <div style={{ textAlign: 'left' }}>\n <Typography variant=\"caption\">{message}</Typography>\n </div>\n </div>\n {showButton && (\n <div className={classes.button}>\n <Button\n component={Link}\n to={to}\n variant=\"contained\"\n color=\"secondary\"\n id={`udpRecord-PageStatus-${buttonLabel}`}\n udprecordid={`udpRecord-PageStatus-${buttonLabel}`}\n >\n {buttonLabel}\n </Button>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n );\n};\n","import React from 'react';\nimport { makeStyles } from '@material-ui/core';\nimport { useTranslation } from 'react-i18next';\nimport { PageStatus } from './PageStatus';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n marginTop: theme.spacing(4)\n }\n}));\n\nexport const PageNotFoundRoute = () => {\n const classes = useStyles();\n const { t } = useTranslation();\n return (\n <div className={classes.root}>\n <PageStatus\n statusCode={404}\n title={t('Page Not Found')}\n subheader={t(\"Sorry, we can't find the page you are looking for.\")}\n message={t(\n 'You may have typed the address incorrectly or you may have used an outdated link.'\n )}\n to='/'\n buttonLabel={t('Back to Home Page')}\n />\n </div>\n );\n};\n"],"mappings":";;;;;;AAUA,MAAMA,cAAY,YAAW,WAAU;CACrC,MAAM;EACJ,SAAS;EACT,gBAAgB;EAChB,YAAY;;CAEd,MAAM;EACJ,YAAY,MAAM,QAAQ,QAAQ;EAClC,WAAU,UAAS,OAAO;EAC1B,YAAW,UAAS,OAAO;;CAE7B,WAAW,EACT,WAAW,MAAM,QAAQ;CAE3B,SAAS,EACP,OAAO,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,QAAQ;CAE7D,QAAQ;EACN,WAAW;EACX,WAAW,MAAM,QAAQ;;CAE3B,QAAQ;EACN,WAAW,MAAM,QAAQ;EACzB,SAAS;EACT,gBAAgB;;CAElB,cAAc;EACZ,UAAU;EACV,OAAO,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,QAAQ;;CAE7D,SAAS,EACP,WAAW,MAAM,QAAQ;;AAG7B,MAAa,cAAa,UAAS;CACjC,MAAM,UAAUA,YAAU;CAC1B,MAAM,EACJ,OACA,WACA,SACA,IACA,aACA,YACA,aAAa,SACX;AAEJ,QACE,oCAAC,SAAI,WAAW,QAAQ,QACtB,oCAAC,QAAK,WAAW,QAAQ,QACvB,oCAAC,mBACC,oCAAC,SAAI,WAAW,QAAQ,WACtB,oCAAC,SAAI,WAAW,QAAQ,UACrB,cACC,oCAAC,aACC,oCAAC,cAAW,WAAW,QAAQ,gBAC5B,cAIP,oCAAC,SAAI,WAAW,QAAQ,aACtB,oCAAC,cAAW,SAAQ,QAAM,UAG9B,oCAAC,SAAI,WAAW,QAAQ,WACtB,oCAAC;EAAW,SAAQ;EAAW,OAAO,EAAE,YAAY;IACjD,YAEH,oCAAC,SAAI,OAAO,EAAE,WAAW,YACvB,oCAAC,cAAW,SAAQ,aAAW,YAGlC,cACC,oCAAC,SAAI,WAAW,QAAQ,UACtB,oCAAC;EACC,WAAWC;EACP;EACJ,SAAQ;EACR,OAAM;EACN,IAAI,wBAAwB;EAC5B,aAAa,wBAAwB;IAEpC;;;;;ACtFnB,MAAM,YAAY,YAAY,WAAW,EACvC,MAAM,EACJ,WAAW,MAAM,QAAQ;AAI7B,MAAa,0BAA0B;CACrC,MAAM,UAAU;CAChB,MAAM,EAAE,MAAM;AACd,QACE,oCAAC,SAAI,WAAW,QAAQ,QACtB,oCAAC;EACC,YAAY;EACZ,OAAO,EAAE;EACT,WAAW,EAAE;EACb,SAAS,EACP;EAEF,IAAG;EACH,aAAa,EAAE"}
1
+ {"version":3,"file":"PageNotFoundRoute-D9dLbM_w.js","names":["useStyles","Link"],"sources":["../src/routes/components/PageStatus.jsx","../src/routes/components/PageNotFoundRoute.jsx"],"sourcesContent":["import React from 'react';\nimport {\n Button,\n makeStyles,\n Typography,\n Card,\n CardContent,\n} from '@material-ui/core';\nimport { Link } from 'react-router-dom';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n card: {\n background: theme.palette.primary.main,\n minWidth: props => props?.minWidth,\n minHeight: props => props?.minHeight,\n },\n subHeader: {\n marginTop: theme.spacing(3),\n },\n content: {\n color: theme.palette.getContrastText(theme.palette.primary.main),\n },\n header: {\n textAlign: 'center',\n marginTop: theme.spacing(2),\n },\n button: {\n marginTop: theme.spacing(8),\n display: 'flex',\n justifyContent: 'center',\n },\n largeDisplay: {\n fontSize: '4rem',\n color: theme.palette.getContrastText(theme.palette.primary.main),\n },\n message: {\n marginTop: theme.spacing(3),\n },\n}));\nexport const PageStatus = props => {\n const classes = useStyles(props);\n const {\n title,\n subheader,\n message,\n to,\n buttonLabel,\n statusCode,\n showButton = true,\n } = props;\n\n return (\n <div className={classes.root}>\n <Card className={classes.card}>\n <CardContent>\n <div className={classes.content}>\n <div className={classes.header}>\n {statusCode && (\n <div>\n <Typography className={classes.largeDisplay}>\n {statusCode}\n </Typography>\n </div>\n )}\n <div className={classes.subHeader}>\n <Typography variant=\"h6\">{title}</Typography>\n </div>\n </div>\n <div className={classes.message}>\n <Typography variant=\"overline\" style={{ fontWeight: 700 }}>\n {subheader}\n </Typography>\n <div style={{ textAlign: 'left' }}>\n <Typography variant=\"caption\">{message}</Typography>\n </div>\n </div>\n {showButton && (\n <div className={classes.button}>\n <Button\n component={Link}\n to={to}\n variant=\"contained\"\n color=\"secondary\"\n id={`udpRecord-PageStatus-${buttonLabel}`}\n udprecordid={`udpRecord-PageStatus-${buttonLabel}`}\n >\n {buttonLabel}\n </Button>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n );\n};\n","import React from 'react';\nimport { makeStyles } from '@material-ui/core';\nimport { useTranslation } from 'react-i18next';\nimport { PageStatus } from './PageStatus';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n marginTop: theme.spacing(4)\n }\n}));\n\nexport const PageNotFoundRoute = () => {\n const classes = useStyles();\n const { t } = useTranslation();\n return (\n <div className={classes.root}>\n <PageStatus\n statusCode={404}\n title={t('Page Not Found')}\n subheader={t(\"Sorry, we can't find the page you are looking for.\")}\n message={t(\n 'You may have typed the address incorrectly or you may have used an outdated link.'\n )}\n to='/'\n buttonLabel={t('Back to Home Page')}\n />\n </div>\n );\n};\n"],"mappings":";;;;;;AAUA,MAAMA,cAAY,YAAW,WAAU;CACrC,MAAM;EACJ,SAAS;EACT,gBAAgB;EAChB,YAAY;EACb;CACD,MAAM;EACJ,YAAY,MAAM,QAAQ,QAAQ;EAClC,WAAU,UAAS,OAAO;EAC1B,YAAW,UAAS,OAAO;EAC5B;CACD,WAAW,EACT,WAAW,MAAM,QAAQ,EAAE,EAC5B;CACD,SAAS,EACP,OAAO,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,QAAQ,KAAK,EACjE;CACD,QAAQ;EACN,WAAW;EACX,WAAW,MAAM,QAAQ,EAAE;EAC5B;CACD,QAAQ;EACN,WAAW,MAAM,QAAQ,EAAE;EAC3B,SAAS;EACT,gBAAgB;EACjB;CACD,cAAc;EACZ,UAAU;EACV,OAAO,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,QAAQ,KAAK;EACjE;CACD,SAAS,EACP,WAAW,MAAM,QAAQ,EAAE,EAC5B;CACF,EAAE;AACH,MAAa,cAAa,UAAS;CACjC,MAAM,UAAUA,YAAU,MAAM;CAChC,MAAM,EACJ,OACA,WACA,SACA,IACA,aACA,YACA,aAAa,SACX;AAEJ,QACE,oCAAC,SAAI,WAAW,QAAQ,QACtB,oCAAC,QAAK,WAAW,QAAQ,QACvB,oCAAC,mBACC,oCAAC,SAAI,WAAW,QAAQ,WACtB,oCAAC,SAAI,WAAW,QAAQ,UACrB,cACC,oCAAC,aACC,oCAAC,cAAW,WAAW,QAAQ,gBAC5B,WACU,CACT,EAER,oCAAC,SAAI,WAAW,QAAQ,aACtB,oCAAC,cAAW,SAAQ,QAAM,MAAmB,CACzC,CACF,EACN,oCAAC,SAAI,WAAW,QAAQ,WACtB,oCAAC;EAAW,SAAQ;EAAW,OAAO,EAAE,YAAY,KAAK;IACtD,UACU,EACb,oCAAC,SAAI,OAAO,EAAE,WAAW,QAAQ,IAC/B,oCAAC,cAAW,SAAQ,aAAW,QAAqB,CAChD,CACF,EACL,cACC,oCAAC,SAAI,WAAW,QAAQ,UACtB,oCAAC;EACC,WAAWC;EACP;EACJ,SAAQ;EACR,OAAM;EACN,IAAI,wBAAwB;EAC5B,aAAa,wBAAwB;IAEpC,YACM,CACL,CAEJ,CACM,CACT,CACH;;;;;AC7FV,MAAM,YAAY,YAAY,WAAW,EACvC,MAAM,EACJ,WAAW,MAAM,QAAQ,EAAE,EAC5B,EACF,EAAE;AAEH,MAAa,0BAA0B;CACrC,MAAM,UAAU,WAAW;CAC3B,MAAM,EAAE,MAAM,gBAAgB;AAC9B,QACE,oCAAC,SAAI,WAAW,QAAQ,QACtB,oCAAC;EACC,YAAY;EACZ,OAAO,EAAE,iBAAiB;EAC1B,WAAW,EAAE,qDAAqD;EAClE,SAAS,EACP,oFACD;EACD,IAAG;EACH,aAAa,EAAE,oBAAoB;GACnC,CACE"}
@@ -0,0 +1,3 @@
1
+ import { PageNotFoundRoute } from "./PageNotFoundRoute-D9dLbM_w.js";
2
+
3
+ export { PageNotFoundRoute };
@@ -26,8 +26,7 @@ const PasswordResetRedirect = (props) => {
26
26
  const hash = window.location.hash || "";
27
27
  if (props?.error?.errorMessage) formatError(props?.error?.errorMessage);
28
28
  else if (hash) {
29
- const params = new URLSearchParams(hash.substring(1));
30
- const errorDescription$1 = params.get("error_description");
29
+ const errorDescription$1 = new URLSearchParams(hash.substring(1)).get("error_description");
31
30
  if (errorDescription$1) formatError(errorDescription$1);
32
31
  }
33
32
  }, [props?.error?.errorMessage]);
@@ -69,4 +68,4 @@ const PasswordResetRedirect = (props) => {
69
68
 
70
69
  //#endregion
71
70
  export { PasswordResetRedirect, clearStoredPath, getStoredPath, storeCurrentPath, storeInitialPath, storePath };
72
- //# sourceMappingURL=PasswordResetRedirect-BHnkAW40.js.map
71
+ //# sourceMappingURL=PasswordResetRedirect-C3g8L0vA.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordResetRedirect-BHnkAW40.js","names":["errorDescription"],"sources":["../src/utilities/redirect/LocalRedirectUrlStorage.js","../src/routes/components/PasswordResetRedirect.jsx"],"sourcesContent":["const SessionStorageKey = 'local-url';\n\nexport const storeInitialPath = () => {\n if (\n !window.sessionStorage.getItem(SessionStorageKey) ||\n window.sessionStorage.getItem(SessionStorageKey) === '/' ||\n window.sessionStorage.getItem(SessionStorageKey) === '/null'\n ) {\n window.sessionStorage.setItem(\n SessionStorageKey,\n window.location.pathname === '/null' ? '/' : window.location.pathname\n );\n }\n};\n\nexport const storeCurrentPath = () => {\n window.sessionStorage.setItem(SessionStorageKey, window.location.pathname);\n};\n\nexport const storePath = pathname => {\n window.sessionStorage.setItem(SessionStorageKey, pathname);\n};\n\nexport const getStoredPath = () => {\n return window.sessionStorage.getItem(SessionStorageKey);\n};\n\nexport const clearStoredPath = () => {\n window.sessionStorage.removeItem(SessionStorageKey);\n};\n","import React, { useEffect, useState } from 'react';\nimport { clearStoredPath } from '../../utilities/redirect/LocalRedirectUrlStorage';\n\nexport const PasswordResetRedirect = (props) => {\n const [errorDescription, setErrorDescription] = useState(null);\n\n useEffect(() => {\n // Get the hash portion of the URL\n const hash = window.location.hash || ''; // Fallback to empty string if no hash\n\n if (props?.error?.errorMessage) {\n formatError(props?.error?.errorMessage);\n } else if (hash) {\n // Parse the hash to get query parameters\n const params = new URLSearchParams(hash.substring(1)); // Remove \"#\" and parse\n\n // Get and decode the error_description\n const errorDescription = params.get('error_description');\n\n if (errorDescription) {\n formatError(errorDescription);\n // Decode the URL-encoded string\n }\n }\n }, [props?.error?.errorMessage]);\n\n const formatError = (errorDescription) => {\n const decodedDescription = decodeURIComponent(errorDescription).replace(\n /%0d%0a/g,\n '\\n'\n ); // Replace %0d%0a with newlines for clarity\n\n if (decodedDescription.includes('AADB2C90208')) {\n // Hardcoded message for AADB2C90208 (a specific error code, often related to user not found or invalid credentials)\n setErrorDescription('The password reset link has expired.');\n // Check for \"AADB2C\" or \"AADB2C90208\" in the decoded description\n } else if (decodedDescription.includes('AADB2C')) {\n // Hardcoded message for generic AADB2C errors\n setErrorDescription('Unable to find an account associated to that email.');\n } else {\n // Fallback message if neither error is found (optional)\n setErrorDescription('An unexpected error occurred.');\n }\n };\n\n const handleGoHome = () => {\n clearStoredPath();\n window.location.href = '/';\n };\n\n return (\n <div>\n <div style={{ textAlign: 'center', marginTop: '50px' }}>\n <img\n src='https://customb2cpolicydevtest.blob.core.windows.net/root/unitylogo.svg'\n alt='Unity Logo'\n width='300'\n style={{ height: 'auto', marginBottom: 50 }}\n />\n {errorDescription ? (\n <h2>{errorDescription}</h2>\n ) : (\n <h2>\n Your password has been successfully reset\n </h2>\n )}\n {errorDescription !== 'The password reset link has expired.' && (\n <p>Please click below to return to the sign in page</p>)}\n\n {errorDescription !== 'The password reset link has expired.' && (\n <button\n onClick={handleGoHome}\n style={{\n marginTop: '10px',\n backgroundColor: '#0C2F50',\n color: 'white',\n border: 'none',\n padding: '10px 20px',\n cursor: 'pointer',\n borderRadius: '5px',\n fontSize: '16px'\n }}\n >\n Sign In\n </button>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":";;;AAAA,MAAM,oBAAoB;AAE1B,MAAa,yBAAyB;AACpC,KACE,CAAC,OAAO,eAAe,QAAQ,sBAC/B,OAAO,eAAe,QAAQ,uBAAuB,OACrD,OAAO,eAAe,QAAQ,uBAAuB,QAErD,QAAO,eAAe,QACpB,mBACA,OAAO,SAAS,aAAa,UAAU,MAAM,OAAO,SAAS;;AAKnE,MAAa,yBAAyB;AACpC,QAAO,eAAe,QAAQ,mBAAmB,OAAO,SAAS;;AAGnE,MAAa,aAAY,aAAY;AACnC,QAAO,eAAe,QAAQ,mBAAmB;;AAGnD,MAAa,sBAAsB;AACjC,QAAO,OAAO,eAAe,QAAQ;;AAGvC,MAAa,wBAAwB;AACnC,QAAO,eAAe,WAAW;;;;;ACzBnC,MAAa,yBAAyB,UAAU;CAC9C,MAAM,CAAC,kBAAkB,uBAAuB,SAAS;AAEzD,iBAAgB;EAEd,MAAM,OAAO,OAAO,SAAS,QAAQ;AAErC,MAAI,OAAO,OAAO,aAChB,aAAY,OAAO,OAAO;WACjB,MAAM;GAEf,MAAM,SAAS,IAAI,gBAAgB,KAAK,UAAU;GAGlD,MAAMA,qBAAmB,OAAO,IAAI;AAEpC,OAAIA,mBACF,aAAYA;;IAIf,CAAC,OAAO,OAAO;CAElB,MAAM,eAAe,uBAAqB;EACxC,MAAM,qBAAqB,mBAAmBA,oBAAkB,QAC9D,WACA;AAGF,MAAI,mBAAmB,SAAS,eAE9B,qBAAoB;WAEX,mBAAmB,SAAS,UAErC,qBAAoB;MAGpB,qBAAoB;;CAIxB,MAAM,qBAAqB;AACzB;AACA,SAAO,SAAS,OAAO;;AAGzB,QACE,oCAAC,aACC,oCAAC,SAAI,OAAO;EAAE,WAAW;EAAU,WAAW;MAC5C,oCAAC;EACC,KAAI;EACJ,KAAI;EACJ,OAAM;EACN,OAAO;GAAE,QAAQ;GAAQ,cAAc;;KAExC,mBACC,oCAAC,YAAI,oBAEL,oCAAC,YAAG,8CAIL,qBAAqB,0CACtB,oCAAC,WAAE,qDAEF,qBAAqB,0CACpB,oCAAC;EACC,SAAS;EACT,OAAO;GACL,WAAW;GACX,iBAAiB;GACjB,OAAO;GACP,QAAQ;GACR,SAAS;GACT,QAAQ;GACR,cAAc;GACd,UAAU;;IAEb"}
1
+ {"version":3,"file":"PasswordResetRedirect-C3g8L0vA.js","names":["errorDescription"],"sources":["../src/utilities/redirect/LocalRedirectUrlStorage.js","../src/routes/components/PasswordResetRedirect.jsx"],"sourcesContent":["const SessionStorageKey = 'local-url';\n\nexport const storeInitialPath = () => {\n if (\n !window.sessionStorage.getItem(SessionStorageKey) ||\n window.sessionStorage.getItem(SessionStorageKey) === '/' ||\n window.sessionStorage.getItem(SessionStorageKey) === '/null'\n ) {\n window.sessionStorage.setItem(\n SessionStorageKey,\n window.location.pathname === '/null' ? '/' : window.location.pathname\n );\n }\n};\n\nexport const storeCurrentPath = () => {\n window.sessionStorage.setItem(SessionStorageKey, window.location.pathname);\n};\n\nexport const storePath = pathname => {\n window.sessionStorage.setItem(SessionStorageKey, pathname);\n};\n\nexport const getStoredPath = () => {\n return window.sessionStorage.getItem(SessionStorageKey);\n};\n\nexport const clearStoredPath = () => {\n window.sessionStorage.removeItem(SessionStorageKey);\n};\n","import React, { useEffect, useState } from 'react';\nimport { clearStoredPath } from '../../utilities/redirect/LocalRedirectUrlStorage';\n\nexport const PasswordResetRedirect = (props) => {\n const [errorDescription, setErrorDescription] = useState(null);\n\n useEffect(() => {\n // Get the hash portion of the URL\n const hash = window.location.hash || ''; // Fallback to empty string if no hash\n\n if (props?.error?.errorMessage) {\n formatError(props?.error?.errorMessage);\n } else if (hash) {\n // Parse the hash to get query parameters\n const params = new URLSearchParams(hash.substring(1)); // Remove \"#\" and parse\n\n // Get and decode the error_description\n const errorDescription = params.get('error_description');\n\n if (errorDescription) {\n formatError(errorDescription);\n // Decode the URL-encoded string\n }\n }\n }, [props?.error?.errorMessage]);\n\n const formatError = (errorDescription) => {\n const decodedDescription = decodeURIComponent(errorDescription).replace(\n /%0d%0a/g,\n '\\n'\n ); // Replace %0d%0a with newlines for clarity\n\n if (decodedDescription.includes('AADB2C90208')) {\n // Hardcoded message for AADB2C90208 (a specific error code, often related to user not found or invalid credentials)\n setErrorDescription('The password reset link has expired.');\n // Check for \"AADB2C\" or \"AADB2C90208\" in the decoded description\n } else if (decodedDescription.includes('AADB2C')) {\n // Hardcoded message for generic AADB2C errors\n setErrorDescription('Unable to find an account associated to that email.');\n } else {\n // Fallback message if neither error is found (optional)\n setErrorDescription('An unexpected error occurred.');\n }\n };\n\n const handleGoHome = () => {\n clearStoredPath();\n window.location.href = '/';\n };\n\n return (\n <div>\n <div style={{ textAlign: 'center', marginTop: '50px' }}>\n <img\n src='https://customb2cpolicydevtest.blob.core.windows.net/root/unitylogo.svg'\n alt='Unity Logo'\n width='300'\n style={{ height: 'auto', marginBottom: 50 }}\n />\n {errorDescription ? (\n <h2>{errorDescription}</h2>\n ) : (\n <h2>\n Your password has been successfully reset\n </h2>\n )}\n {errorDescription !== 'The password reset link has expired.' && (\n <p>Please click below to return to the sign in page</p>)}\n\n {errorDescription !== 'The password reset link has expired.' && (\n <button\n onClick={handleGoHome}\n style={{\n marginTop: '10px',\n backgroundColor: '#0C2F50',\n color: 'white',\n border: 'none',\n padding: '10px 20px',\n cursor: 'pointer',\n borderRadius: '5px',\n fontSize: '16px'\n }}\n >\n Sign In\n </button>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":";;;AAAA,MAAM,oBAAoB;AAE1B,MAAa,yBAAyB;AACpC,KACE,CAAC,OAAO,eAAe,QAAQ,kBAAkB,IACjD,OAAO,eAAe,QAAQ,kBAAkB,KAAK,OACrD,OAAO,eAAe,QAAQ,kBAAkB,KAAK,QAErD,QAAO,eAAe,QACpB,mBACA,OAAO,SAAS,aAAa,UAAU,MAAM,OAAO,SAAS,SAC9D;;AAIL,MAAa,yBAAyB;AACpC,QAAO,eAAe,QAAQ,mBAAmB,OAAO,SAAS,SAAS;;AAG5E,MAAa,aAAY,aAAY;AACnC,QAAO,eAAe,QAAQ,mBAAmB,SAAS;;AAG5D,MAAa,sBAAsB;AACjC,QAAO,OAAO,eAAe,QAAQ,kBAAkB;;AAGzD,MAAa,wBAAwB;AACnC,QAAO,eAAe,WAAW,kBAAkB;;;;;ACzBrD,MAAa,yBAAyB,UAAU;CAC9C,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,KAAK;AAE9D,iBAAgB;EAEd,MAAM,OAAO,OAAO,SAAS,QAAQ;AAErC,MAAI,OAAO,OAAO,aAChB,aAAY,OAAO,OAAO,aAAa;WAC9B,MAAM;GAKf,MAAMA,qBAHS,IAAI,gBAAgB,KAAK,UAAU,EAAE,CAAC,CAGrB,IAAI,oBAAoB;AAExD,OAAIA,mBACF,aAAYA,mBAAiB;;IAIhC,CAAC,OAAO,OAAO,aAAa,CAAC;CAEhC,MAAM,eAAe,uBAAqB;EACxC,MAAM,qBAAqB,mBAAmBA,mBAAiB,CAAC,QAC9D,WACA,KACD;AAED,MAAI,mBAAmB,SAAS,cAAc,CAE5C,qBAAoB,uCAAuC;WAElD,mBAAmB,SAAS,SAAS,CAE9C,qBAAoB,sDAAsD;MAG1E,qBAAoB,gCAAgC;;CAIxD,MAAM,qBAAqB;AACzB,mBAAiB;AACjB,SAAO,SAAS,OAAO;;AAGzB,QACE,oCAAC,aACC,oCAAC,SAAI,OAAO;EAAE,WAAW;EAAU,WAAW;EAAQ,IACpD,oCAAC;EACC,KAAI;EACJ,KAAI;EACJ,OAAM;EACN,OAAO;GAAE,QAAQ;GAAQ,cAAc;GAAI;GAC3C,EACD,mBACC,oCAAC,YAAI,iBAAsB,GAE3B,oCAAC,YAAG,4CAEC,EAEN,qBAAqB,0CACtB,oCAAC,WAAE,mDAAoD,EAEtD,qBAAqB,0CACpB,oCAAC;EACC,SAAS;EACT,OAAO;GACL,WAAW;GACX,iBAAiB;GACjB,OAAO;GACP,QAAQ;GACR,SAAS;GACT,QAAQ;GACR,cAAc;GACd,UAAU;GACX;IACF,UAEQ,CAEP,CACF"}
@@ -0,0 +1,3 @@
1
+ import { PasswordResetRedirect } from "./PasswordResetRedirect-C3g8L0vA.js";
2
+
3
+ export { PasswordResetRedirect };
@@ -1,4 +1,5 @@
1
- import { LogicalSearchOperatorEnums, SearchGroupingType, useUser } from "./EnvironmentRibbon-DaDmKAPO.js";
1
+ import { LogicalSearchOperatorEnums, SearchGroupingType } from "./EnvironmentRibbon-oEmbWjEq.js";
2
+ import { useUser } from "./useAxiosGet-Dh5pVURP.js";
2
3
  import { useCallback, useMemo } from "react";
3
4
  import { DateTime, IANAZone } from "luxon";
4
5
 
@@ -84,14 +85,11 @@ const getSearchObject = (searchFilterElements, page, pageSize, eagerLoad = false
84
85
  return searchObject;
85
86
  };
86
87
  const getApiMethodIdByPath = (apiMethodList, path) => {
87
- const foundApiMethod = apiMethodList.find((method) => path.includes(method.path));
88
- return foundApiMethod?.apiMethodId ?? null;
88
+ return apiMethodList.find((method) => path.includes(method.path))?.apiMethodId ?? null;
89
89
  };
90
90
  const getSearchIdentifiers = (catalogObjects, catalogReturnObject) => {
91
91
  if (!catalogObjects) return [];
92
- const matchingCatalogObject = catalogObjects.find((co) => co.catalogObjectName === catalogReturnObject);
93
- const properties = matchingCatalogObject?.properties?.filter((property) => property?.extendedProperties?.identifier);
94
- return properties?.map((property) => property.name) ?? [];
92
+ return (catalogObjects.find((co) => co.catalogObjectName === catalogReturnObject)?.properties?.filter((property) => property?.extendedProperties?.identifier))?.map((property) => property.name) ?? [];
95
93
  };
96
94
  /**
97
95
  * Returns a reference to a function that takes an Ag-grid FilterModel object and
@@ -103,10 +101,9 @@ const useConvertFilterModelToSearchFilters = (timeZone = null) => {
103
101
  const user = useUser();
104
102
  const zone = useMemo(() => {
105
103
  let tz = timeZone ?? user?.additionalProperties?.activeUtilityTimeZone ?? "local";
106
- const validTimeZone = tz !== "local" && (tz === user?.additionalProperties?.activeUtilityTimeZone || IANAZone.isValidZone(tz)) ? tz : "local";
107
- return validTimeZone;
104
+ return tz !== "local" && (tz === user?.additionalProperties?.activeUtilityTimeZone || IANAZone.isValidZone(tz)) ? tz : "local";
108
105
  }, [timeZone, user]);
109
- const convertFilterModelToSearchFilters = useCallback((filterModel = null) => {
106
+ return useCallback((filterModel = null) => {
110
107
  if (!filterModel) return [];
111
108
  let searchFilters = [];
112
109
  searchFilters = Object.entries(filterModel).map((item) => {
@@ -115,12 +112,9 @@ const useConvertFilterModelToSearchFilters = (timeZone = null) => {
115
112
  let type;
116
113
  let value;
117
114
  if (item[1]?.filterType === AgGridFilterTypes.DATE) {
118
- let dateFilterValueWithoutTime = item[1]?.dateFrom?.substring(0, 10);
119
- let dateSplit = dateFilterValueWithoutTime.split("-");
115
+ let dateSplit = (item[1]?.dateFrom?.substring(0, 10)).split("-");
120
116
  let date = new Date(dateSplit[0], dateSplit[1] - 1, dateSplit[2]);
121
- const filterDateTimeMidnight = DateTime.fromJSDate(date).setZone(zone, { keepLocalTime: true });
122
- let dateString = filterDateTimeMidnight.toJSDate().toISOString();
123
- value = dateString;
117
+ value = DateTime.fromJSDate(date).setZone(zone, { keepLocalTime: true }).toJSDate().toISOString();
124
118
  } else if (item[1]?.filterType === AgGridFilterTypes.SET) {
125
119
  value = item[1].values.join(",");
126
120
  operator = SqlFilterOperators.IN;
@@ -155,11 +149,9 @@ const useConvertFilterModelToSearchFilters = (timeZone = null) => {
155
149
  operator = SqlFilterOperators.BETWEEN;
156
150
  if (item[1]?.filterType === AgGridFilterTypes.NUMBER) value += "," + item[1]?.filterTo;
157
151
  else if (item[1]?.filterType === AgGridFilterTypes.DATE) {
158
- let dateFilterValueWithoutTime = item[1]?.dateTo?.substring(0, 10);
159
- let dateSplit = dateFilterValueWithoutTime.split("-");
152
+ let dateSplit = (item[1]?.dateTo?.substring(0, 10)).split("-");
160
153
  let date = new Date(dateSplit[0], dateSplit[1] - 1, dateSplit[2]);
161
- const filterDateTimeMidnight = DateTime.fromJSDate(date).setZone(zone, { keepLocalTime: true });
162
- let dateString = filterDateTimeMidnight.toJSDate().toISOString();
154
+ let dateString = DateTime.fromJSDate(date).setZone(zone, { keepLocalTime: true }).toJSDate().toISOString();
163
155
  value += "," + dateString;
164
156
  }
165
157
  break;
@@ -178,9 +170,8 @@ const useConvertFilterModelToSearchFilters = (timeZone = null) => {
178
170
  });
179
171
  return searchFilters;
180
172
  }, [zone]);
181
- return convertFilterModelToSearchFilters;
182
173
  };
183
174
 
184
175
  //#endregion
185
176
  export { SqlFilterOperators, getApiMethodIdByPath, getSearchIdentifiers, getSearchObject, useConvertFilterModelToSearchFilters };
186
- //# sourceMappingURL=SearchUtilities-Bor3HbfB.js.map
177
+ //# sourceMappingURL=SearchUtilities-Btugro8y.js.map