@australiangreens/ag-internal-components 0.0.46 → 0.0.50

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 (123) hide show
  1. package/README.md +7 -0
  2. package/dist/DevApp.d.ts +2 -0
  3. package/dist/DevApp.d.ts.map +1 -0
  4. package/dist/DevDemo/DevDemo.d.ts +2 -0
  5. package/dist/DevDemo/DevDemo.d.ts.map +1 -0
  6. package/dist/DevDemo/DomainCodeDemo.d.ts +3 -0
  7. package/dist/DevDemo/DomainCodeDemo.d.ts.map +1 -0
  8. package/dist/DevDemo/ExampleComponentDemo.d.ts +2 -0
  9. package/dist/DevDemo/ExampleComponentDemo.d.ts.map +1 -0
  10. package/dist/DevDemo/NavBarContent.d.ts +2 -0
  11. package/dist/DevDemo/NavBarContent.d.ts.map +1 -0
  12. package/dist/DevDemo/SaladBarDemo.d.ts +2 -0
  13. package/dist/DevDemo/SaladBarDemo.d.ts.map +1 -0
  14. package/dist/DevDemo/SomeRandomDemo.d.ts +2 -0
  15. package/dist/DevDemo/SomeRandomDemo.d.ts.map +1 -0
  16. package/dist/DevDemo/SpecialPageDemo.d.ts +2 -0
  17. package/dist/DevDemo/SpecialPageDemo.d.ts.map +1 -0
  18. package/dist/DevDemo/index.d.ts +2 -0
  19. package/dist/DevDemo/index.d.ts.map +1 -0
  20. package/dist/cjs/index.cjs +1 -1
  21. package/dist/cjs/index.cjs.map +1 -1
  22. package/dist/components/AgDialog/index.d.ts +1 -1
  23. package/dist/components/AgDialog/index.d.ts.map +1 -1
  24. package/dist/components/ExampleComponent/index.comp.test.d.ts +2 -0
  25. package/dist/components/ExampleComponent/index.comp.test.d.ts.map +1 -0
  26. package/dist/components/ExampleComponent/index.d.ts +1 -1
  27. package/dist/components/ExampleComponent/index.d.ts.map +1 -1
  28. package/dist/components/ExampleComponent/index.stories.d.ts +11 -0
  29. package/dist/components/ExampleComponent/index.stories.d.ts.map +1 -0
  30. package/dist/components/NavBar/NavBarContext.d.ts +1 -1
  31. package/dist/components/NavBar/NavBarContext.d.ts.map +1 -1
  32. package/dist/components/NavBar/NavBarDarkStyledList.d.ts.map +1 -1
  33. package/dist/components/NavBar/NavBarLightStyledList.d.ts.map +1 -1
  34. package/dist/components/NavBar/Styling.d.ts.map +1 -1
  35. package/dist/components/NavBar/index.comp.test.d.ts +2 -0
  36. package/dist/components/NavBar/index.comp.test.d.ts.map +1 -0
  37. package/dist/components/NavBar/index.d.ts +1 -1
  38. package/dist/components/NavBar/index.d.ts.map +1 -1
  39. package/dist/components/NavBar/index.stories.d.ts +34 -0
  40. package/dist/components/NavBar/index.stories.d.ts.map +1 -0
  41. package/dist/components/NavBar/testWrappers.d.ts.map +1 -1
  42. package/dist/components/index.d.ts.map +1 -1
  43. package/dist/devMain.d.ts +1 -0
  44. package/dist/devMain.d.ts.map +1 -0
  45. package/dist/domainCode/DomainCodeDialog.comp.test.d.ts +2 -0
  46. package/dist/domainCode/DomainCodeDialog.comp.test.d.ts.map +1 -0
  47. package/dist/domainCode/DomainCodeDialog.d.ts +1 -1
  48. package/dist/domainCode/DomainCodeDialog.d.ts.map +1 -1
  49. package/dist/domainCode/hooks.d.ts.map +1 -1
  50. package/dist/domainCode/index.d.ts.map +1 -1
  51. package/dist/errors/ContextError.d.ts.map +1 -1
  52. package/dist/errors/ContextError.unit.test.d.ts +2 -0
  53. package/dist/errors/ContextError.unit.test.d.ts.map +1 -0
  54. package/dist/errors/index.d.ts.map +1 -1
  55. package/dist/esm/index.js +604 -543
  56. package/dist/esm/index.js.map +1 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/layouts/AppLayout/AppLayout.comp.test.d.ts +2 -0
  59. package/dist/layouts/AppLayout/AppLayout.comp.test.d.ts.map +1 -0
  60. package/dist/layouts/AppLayout/AppLayout.d.ts +1 -1
  61. package/dist/layouts/AppLayout/AppLayout.d.ts.map +1 -1
  62. package/dist/layouts/AppLayout/NavBar/LinksMenu.d.ts +1 -1
  63. package/dist/layouts/AppLayout/NavBar/LinksMenu.d.ts.map +1 -1
  64. package/dist/layouts/AppLayout/NavBar/NavBar.comp.test.d.ts +2 -0
  65. package/dist/layouts/AppLayout/NavBar/NavBar.comp.test.d.ts.map +1 -0
  66. package/dist/layouts/AppLayout/NavBar/NavBar.d.ts +1 -1
  67. package/dist/layouts/AppLayout/NavBar/NavBar.d.ts.map +1 -1
  68. package/dist/layouts/AppLayout/NavBar/SettingsEtcPlaceholder.d.ts +6 -0
  69. package/dist/layouts/AppLayout/NavBar/SettingsEtcPlaceholder.d.ts.map +1 -0
  70. package/dist/layouts/AppLayout/NavBar/Styling.d.ts.map +1 -1
  71. package/dist/layouts/AppLayout/NavBar/UserInfo.d.ts +2 -1
  72. package/dist/layouts/AppLayout/NavBar/UserInfo.d.ts.map +1 -1
  73. package/dist/layouts/AppLayout/NavBar/index.d.ts.map +1 -1
  74. package/dist/layouts/AppLayout/NavBar/types.d.ts.map +1 -1
  75. package/dist/layouts/AppLayout/PageContainer.d.ts +1 -1
  76. package/dist/layouts/AppLayout/PageContainer.d.ts.map +1 -1
  77. package/dist/layouts/AppLayout/TopBar.comp.test.d.ts +2 -0
  78. package/dist/layouts/AppLayout/TopBar.comp.test.d.ts.map +1 -0
  79. package/dist/layouts/AppLayout/TopBar.d.ts +1 -1
  80. package/dist/layouts/AppLayout/TopBar.d.ts.map +1 -1
  81. package/dist/layouts/AppLayout/defaults.d.ts.map +1 -1
  82. package/dist/layouts/AppLayout/index.d.ts.map +1 -1
  83. package/dist/layouts/AppLayout/stateAtoms.d.ts.map +1 -1
  84. package/dist/layouts/PageLayout/PageContainer.d.ts +2 -2
  85. package/dist/layouts/PageLayout/PageContainer.d.ts.map +1 -1
  86. package/dist/layouts/PageLayout/PanelAwareMargins.d.ts.map +1 -1
  87. package/dist/layouts/PageLayout/SidePanel.comp.test.d.ts +2 -0
  88. package/dist/layouts/PageLayout/SidePanel.comp.test.d.ts.map +1 -0
  89. package/dist/layouts/PageLayout/SidePanel.d.ts +1 -1
  90. package/dist/layouts/PageLayout/SidePanel.d.ts.map +1 -1
  91. package/dist/layouts/PageLayout/TopBar.comp.test.d.ts +2 -0
  92. package/dist/layouts/PageLayout/TopBar.comp.test.d.ts.map +1 -0
  93. package/dist/layouts/PageLayout/TopBar.d.ts +1 -1
  94. package/dist/layouts/PageLayout/TopBar.d.ts.map +1 -1
  95. package/dist/layouts/PageLayout/index.comp.test.d.ts +2 -0
  96. package/dist/layouts/PageLayout/index.comp.test.d.ts.map +1 -0
  97. package/dist/layouts/PageLayout/index.d.ts +1 -1
  98. package/dist/layouts/PageLayout/index.d.ts.map +1 -1
  99. package/dist/layouts/PageLayout/index.stories.d.ts +76 -0
  100. package/dist/layouts/PageLayout/index.stories.d.ts.map +1 -0
  101. package/dist/layouts/index.d.ts.map +1 -1
  102. package/dist/providers/Atom/AtomProvider.d.ts +2 -5
  103. package/dist/providers/Atom/AtomProvider.d.ts.map +1 -1
  104. package/dist/providers/Atom/index.d.ts.map +1 -1
  105. package/dist/providers/SaladBar/SaladBarContext.d.ts +1 -1
  106. package/dist/providers/SaladBar/SaladBarContext.d.ts.map +1 -1
  107. package/dist/providers/SaladBar/defaults.d.ts.map +1 -1
  108. package/dist/providers/SaladBar/index.d.ts.map +1 -1
  109. package/dist/providers/SaladBar/testWrappers.d.ts.map +1 -1
  110. package/dist/providers/SaladBar/types.d.ts.map +1 -1
  111. package/dist/providers/SaladBar/useSaladBar.d.ts.map +1 -1
  112. package/dist/providers/index.d.ts.map +1 -1
  113. package/dist/testing/index.d.ts.map +1 -1
  114. package/dist/testing/wrappers.d.ts +1 -1
  115. package/dist/testing/wrappers.d.ts.map +1 -1
  116. package/dist/themes/fed21Theme.d.ts.map +1 -1
  117. package/dist/themes/index.d.ts.map +1 -1
  118. package/dist/themes/internalAgSystemsTheme.d.ts.map +1 -1
  119. package/dist/themes/types.d.ts.map +1 -1
  120. package/dist/utils/index.d.ts.map +1 -1
  121. package/dist/utils/simpleHashCode.d.ts.map +1 -1
  122. package/package.json +22 -24
  123. package/dist/.gitignore +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/components/ExampleComponent/index.tsx","../../src/components/NavBar/Styling.tsx","../../src/errors/ContextError.ts","../../src/components/NavBar/NavBarContext.tsx","../../src/components/NavBar/testWrappers.tsx","../../src/components/NavBar/NavBarDarkStyledList.tsx","../../src/components/NavBar/NavBarLightStyledList.tsx","../../src/components/NavBar/index.tsx","../../src/components/AgDialog/index.tsx","../../src/layouts/PageLayout/TopBar.tsx","../../src/layouts/PageLayout/SidePanel.tsx","../../src/layouts/PageLayout/PanelAwareMargins.tsx","../../src/layouts/PageLayout/PageContainer.tsx","../../src/layouts/PageLayout/index.tsx","../../src/providers/SaladBar/defaults.ts","../../src/providers/SaladBar/SaladBarContext.tsx","../../src/providers/SaladBar/useSaladBar.ts","../../src/providers/SaladBar/testWrappers.tsx","../../src/providers/Atom/AtomProvider.tsx","../../src/layouts/AppLayout/NavBar/Styling.tsx","../../src/layouts/AppLayout/NavBar/LinksMenu.tsx","../../src/utils/simpleHashCode.ts","../../src/layouts/AppLayout/NavBar/UserInfo.tsx","../../src/layouts/AppLayout/NavBar/NavBar.tsx","../../src/layouts/AppLayout/PageContainer.tsx","../../src/layouts/AppLayout/defaults.tsx","../../src/layouts/AppLayout/stateAtoms.ts","../../src/layouts/AppLayout/TopBar.tsx","../../src/layouts/AppLayout/AppLayout.tsx","../../src/domainCode/hooks.tsx","../../src/domainCode/DomainCodeDialog.tsx","../../src/themes/fed21Theme.ts","../../src/themes/internalAgSystemsTheme.ts","../../src/testing/wrappers.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Button, Paper, Typography } from '@mui/material';\n\nexport interface ExampleComponentProps {\n /** Test */\n text: string;\n}\n\nexport default function ExampleComponent({ text }: ExampleComponentProps) {\n const [num, setNum] = useState(0);\n\n return (\n <>\n <Typography variant=\"h6\" color=\"inherit\" component=\"div\" sx={{ fontSize: '22px' }}>\n Hello world\n </Typography>\n\n <Typography variant=\"caption\" display=\"block\">\n <span>Just ensuring MUI is working as planned as a peer dependency. v0.0.11</span>\n </Typography>\n <Button\n variant=\"outlined\"\n onClick={() => setNum((oldNum) => oldNum + 1)}\n aria-label=\"Increment\"\n >\n Hello I am a button\n </Button>\n <p>\n This is some text: <span>{text}</span>\n </p>\n <Paper>This number will incremember when button pressed: {num}</Paper>\n </>\n );\n}\n","import { styled, CSSObject } from '@mui/material/styles';\nimport Drawer from '@mui/material/Drawer';\n\nexport const NAVBAR_WIDTH_OPENED = 330;\nexport const NAVBAR_WIDTH_CLOSED = 73;\n\nconst PREFIX = 'Navbar';\n\nexport const classes = {\n root: `${PREFIX}-root`,\n menuButton: `${PREFIX}-menuButton`,\n hide: `${PREFIX}-hide`,\n content: `${PREFIX}-content`,\n userInfoHolder: `${PREFIX}-userInfoHolder`,\n settings: `${PREFIX}-settings`,\n pieChartIcon: `${PREFIX}-pieChartIcon`,\n};\n\nexport const Root = styled('div', { name: 'NavBar' })(({ theme }) => ({\n [`&.${classes.root}`]: {\n display: 'flex',\n },\n\n [`& .${classes.menuButton}`]: {\n marginRight: 36,\n },\n\n [`& .${classes.hide}`]: {\n display: 'none',\n },\n\n [`& .${classes.content}`]: {\n flexGrow: 1,\n padding: theme.spacing(3),\n },\n\n [`& .${classes.userInfoHolder}`]: {\n height: '148px',\n marginTop: '64px',\n marginBottom: '16px',\n },\n}));\n\n// The starting point for this was the \"Mini variant drawer\" of\n// https://mui.com/components/drawers/#main-content\n\nconst sharedOverrides = (): CSSObject => ({\n position: 'absolute',\n height: '100%',\n overflowX: 'hidden',\n overflowY: 'hidden',\n color: 'white',\n backgroundColor: 'black',\n // backgroundColor: '#e8e8e8',\n});\n\nconst openedMixin = (): CSSObject => ({\n width: NAVBAR_WIDTH_OPENED,\n ...sharedOverrides(),\n});\n\nconst closedMixin = (): CSSObject => ({\n width: NAVBAR_WIDTH_CLOSED,\n ...sharedOverrides(),\n});\n\nexport const NavDrawer = styled(Drawer, {\n shouldForwardProp: (prop) => prop !== 'open',\n})(({ theme, open }) => ({\n width: open ? NAVBAR_WIDTH_OPENED : NAVBAR_WIDTH_CLOSED,\n flexShrink: 0,\n whiteSpace: 'nowrap',\n boxSizing: 'border-box',\n zIndex: theme.zIndex.drawer + 100,\n\n ...(open && {\n '& .MuiDrawer-paper': openedMixin(),\n }),\n ...(!open && {\n '& .MuiDrawer-paper': closedMixin(),\n }),\n}));\n","import { AgError } from '@australiangreens/ag-error';\n\n// Superclass for errors involving React context.\nexport class ContextError extends AgError {\n static errorName = 'ContextError';\n}\n","import { createContext, useContext, PropsWithChildren, useState, useCallback } from 'react';\nimport { ContextError } from '../../errors/ContextError';\n\nexport type NavBarState = {\n open: boolean;\n};\n\nexport type NavBarActions = {\n setOpen: (newVal: boolean) => void;\n toggleOpen: () => void;\n};\n\ntype NavBarContext = NavBarState & NavBarActions;\n\nconst Context = createContext<NavBarContext | null>(null);\n\ntype NavBarProviderProps = {\n overrideState?: Partial<NavBarState>;\n overrideActions?: Partial<NavBarActions>;\n};\n\n// Note: Must be at at this scope, otherwise useEffect will loop infinitely\nconst defaultOverrideState = {};\nconst defaultOverrideActions = {};\n\nexport const NavBarProvider = ({\n overrideState = defaultOverrideState,\n overrideActions = defaultOverrideActions,\n children,\n}: PropsWithChildren<NavBarProviderProps>) => {\n const [{ open }, setNavBarState] = useState<NavBarState>({ open: true });\n\n const setOpen = useCallback((newVal: boolean) => {\n setNavBarState({ open: newVal });\n }, []);\n\n const toggleOpen = useCallback(() => {\n setNavBarState((prevState) => ({ ...prevState, open: !prevState.open }));\n }, []);\n\n const value: NavBarContext = {\n open,\n setOpen,\n toggleOpen,\n ...overrideState,\n ...overrideActions,\n };\n\n return <Context.Provider value={value}>{children}</Context.Provider>;\n};\n\nexport const useNavBar = () => {\n const context = useContext(Context);\n\n if (context === null) {\n throw new ContextError('Error: Tried to useNavBar outside of a <NavBarProvider>');\n }\n\n return context;\n};\n","/* eslint-disable react/prop-types */\n/* eslint-disable react/display-name */\nimport { createHelper } from 'souvlaki';\n\nimport { NavBarProvider, NavBarActions, NavBarState } from './NavBarContext';\n\nexport type Builder<T> = (overrides?: Partial<T>) => T;\n\nexport const buildNavBarState: Builder<NavBarState> = (overrides = {}) => ({\n open: true,\n ...overrides,\n});\n\nexport const withNavBarProvider = createHelper(\n (state: Partial<NavBarState> = buildNavBarState(), actions: Partial<NavBarActions> = {}) =>\n ({ children }) => {\n return (\n <NavBarProvider overrideState={state} overrideActions={actions}>\n {children}\n </NavBarProvider>\n );\n }\n);\n","import { styled } from '@mui/material/styles';\nimport List, { ListProps } from '@mui/material/List';\n\nconst SELECTED_INDICATOR_WIDTH = 7;\n\nexport const NavBarDarkStyledList = styled(List)<ListProps>(({ theme }) => ({\n backgroundColor: 'black',\n color: 'white',\n\n '& .MuiListItem-root': {\n padding: 'unset',\n },\n\n '& .MuiListItemButton-root': {\n ' .MuiListItemIcon-root': {\n color: 'white',\n padding: `${SELECTED_INDICATOR_WIDTH}px`,\n },\n\n // Focus state\n '&.Mui-focusVisible': {\n backgroundColor: theme.palette.grey[700],\n },\n\n // Selected state\n '&.Mui-selected': {\n borderLeftStyle: 'solid',\n borderLeftWidth: '7px',\n borderLeftColor: theme.palette.primary.main,\n paddingLeft: `calc(${theme.spacing(2)} - ${SELECTED_INDICATOR_WIDTH}px)`,\n },\n\n // Hover state\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n },\n\n // Focus+Selected state\n '&.Mui-selected.Mui-focusVisible': {\n backgroundColor: theme.palette.grey[700],\n },\n\n // Hover+Selected state\n '&.Mui-selected:hover': {\n backgroundColor: theme.palette.primary.dark,\n },\n\n // Focus+Hover+Selected state doesn't need to be specified\n // '&.Mui-selected.Mui-focusVisible:hover': {\n // },\n },\n})) as typeof List;\n","import { styled } from '@mui/material/styles';\nimport List, { ListProps } from '@mui/material/List';\n\nconst SELECTED_INDICATOR_WIDTH = 7;\n\nexport const NavBarLightStyledList = styled(List)<ListProps>(({ theme }) => ({\n backgroundColor: '#e8e8e8',\n color: 'inherit',\n\n '& .MuiListItem-root': {\n padding: 'unset',\n },\n\n '& .MuiListItemButton-root': {\n ' .MuiListItemIcon-root': {\n color: 'inherit',\n padding: `${SELECTED_INDICATOR_WIDTH}px`,\n },\n\n // Focus state\n '&.Mui-focusVisible': {\n backgroundColor: theme.palette.grey[700],\n },\n\n // Selected state\n '&.Mui-selected': {\n borderLeftStyle: 'solid',\n borderLeftWidth: '7px',\n borderLeftColor: theme.palette.primary.main,\n paddingLeft: `calc(${theme.spacing(2)} - ${SELECTED_INDICATOR_WIDTH}px)`,\n },\n\n // Hover state\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n },\n\n // Focus+Selected state\n '&.Mui-selected.Mui-focusVisible': {\n backgroundColor: theme.palette.grey[700],\n },\n\n // Hover+Selected state\n '&.Mui-selected:hover': {\n backgroundColor: theme.palette.primary.dark,\n },\n\n // Focus+Hover+Selected state doesn't need to be specified\n // '&.Mui-selected.Mui-focusVisible:hover': {\n // },\n },\n})) as typeof List;\n","import { PropsWithChildren } from 'react';\nimport CssBaseline from '@mui/material/CssBaseline';\n\nimport { classes, Root, NavDrawer } from './Styling';\nimport { useNavBar } from './NavBarContext';\n\nexport { NAVBAR_WIDTH_OPENED, NAVBAR_WIDTH_CLOSED } from './Styling';\n\nexport type NavbarProps = {\n /** Set the datatest-id on the root element for using reactdom's getByTestId()\n * function */\n 'data-testid'?: string;\n};\n\n// TODO: Add in more common elements (or make another component) for user/organisations/logout etc?\n// TODO: Should there be two sets of 'children', one for the list and one for dialogs etc?\n\n// TODO: Rather than exporting the min and max widths, would it make more sense\n// TODO: to just share them via the context provider?\n\n/**\n * A (currently uncontrolled) styled navigation bar wth a context provider to\n * retrieve its current open/closed state. At this point in time its pretty\n * unopinionated, it just renders whatever children it is given. THe\n * NavBarDarkStyledList component can be used for consistent styling against the\n * background. We'll be changing the way we use NavBars soon anyway, so not much\n * point solidying the patterns yet.\n */\nexport default function NavBar({\n 'data-testid': dataTestId,\n children,\n}: PropsWithChildren<NavbarProps>) {\n const { open } = useNavBar();\n\n return (\n <Root className={classes.root} data-testid={dataTestId}>\n <CssBaseline />\n <NavDrawer\n variant=\"permanent\"\n anchor=\"left\"\n // We aren't using transitions, and {0} will still create an unwanted timeout\n transitionDuration={null as unknown as number}\n open={open}\n >\n {children}\n </NavDrawer>\n </Root>\n );\n}\n\nexport * from './NavBarContext';\nexport * from './testWrappers';\n\nexport * from './NavBarDarkStyledList';\nexport * from './NavBarLightStyledList';\n\n// TODO: This is a temporary fix, library clients shouldn't need this\nexport { classes as navBarClasses } from './Styling';\n","import { Breakpoint } from '@mui/material';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport { PropsWithChildren, useState } from 'react';\n\nexport type AgDialogButtonConfig = {\n text: string;\n onClick?: () => Promise<void>;\n disabled?: boolean;\n testId?: string;\n buttonColor?: 'inherit' | 'primary' | 'secondary' | 'success' | 'error' | 'info' | 'warning';\n};\n\nexport type AgDialogProps = PropsWithChildren<{\n isOpen: boolean;\n dialogTitle: string;\n maxWidth?: false | Breakpoint;\n primaryButton?: AgDialogButtonConfig;\n secondaryButton?: AgDialogButtonConfig;\n onClose: () => void;\n}>;\n\n/**\n * Standard dialog that will auto disable it's buttons while the primaryButton onClick function is pending.\n *\n */\nconst AgDialog = ({\n isOpen,\n dialogTitle,\n children,\n maxWidth,\n primaryButton,\n secondaryButton,\n onClose: handleClose,\n}: AgDialogProps) => {\n const [areButtonsDisabled, setButtonsDisabled] = useState(false);\n\n return (\n <Dialog\n open={isOpen}\n onClose={() => {\n if (areButtonsDisabled) return;\n handleClose();\n }}\n fullWidth\n maxWidth={maxWidth ?? 'xs'}\n >\n <DialogTitle>{dialogTitle}</DialogTitle>\n <DialogContent sx={{ '& > :last-child': { marginBottom: 0 } }}>{children}</DialogContent>\n <DialogActions>\n <Button\n onClick={secondaryButton?.onClick ?? handleClose}\n data-testid={secondaryButton?.testId}\n disabled={secondaryButton?.disabled || areButtonsDisabled}\n color={secondaryButton?.buttonColor}\n >\n {secondaryButton?.text ?? 'Cancel'}\n </Button>\n {primaryButton && (\n <Button\n onClick={async () => {\n setButtonsDisabled(true);\n await primaryButton.onClick?.();\n setButtonsDisabled(false);\n }}\n data-testid={primaryButton.testId}\n disabled={primaryButton.disabled || areButtonsDisabled}\n color={primaryButton?.buttonColor}\n >\n {primaryButton.text}\n </Button>\n )}\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default AgDialog;\n","import { Box, IconButton, styled, Typography } from '@mui/material';\nimport { ArrowForward as ForwardIcon, ArrowBack as BackIcon } from '@mui/icons-material';\n\nconst TOP_STRIPE_HEIGHT = 24;\nconst TITLE_BAR_HEIGHT = 64;\n\nconst PREFIX = 'TopBar';\n\ninterface PanelProps {\n open: boolean;\n width: number;\n showOpenArrow: boolean;\n\n /** Called when the arrow button is pressed (if showOpenButton is true) */\n onOpen?: () => void;\n\n showOpenButton?: boolean;\n}\n\nexport interface TopBarProps {\n titleText?: string;\n leftPanel?: PanelProps;\n rightPanel?: PanelProps;\n 'data-testid'?: string;\n}\n\nexport const classes = {\n topStripe: `${PREFIX}-topStripe`,\n titleBar: `${PREFIX}-titleBar`,\n titleSlider: `${PREFIX}-titleSlider`,\n\n titleText: `${PREFIX}-titleText`,\n leftPanelButton: `${PREFIX}-leftPanelButton`,\n rightPanelButton: `${PREFIX}-leftPanelButton`,\n};\n\ninterface RootProps {\n leftPanel?: PanelProps;\n rightPanel?: PanelProps;\n}\n\nconst Root = styled('div', {\n shouldForwardProp: (prop) => !(['leftPanel', 'rightPanel'] as Array<PropertyKey>).includes(prop),\n name: PREFIX,\n})<RootProps>(({ theme, leftPanel, rightPanel }) => ({\n width: '100%',\n\n [`& .${classes.topStripe}`]: {\n width: '100%',\n height: `${TOP_STRIPE_HEIGHT}px`,\n backgroundColor: theme.palette.primary.main,\n },\n\n [`& .${classes.titleBar}`]: {\n backgroundColor: theme.palette.primary.light,\n height: `${TITLE_BAR_HEIGHT}px`,\n padding: theme.spacing(0, 3),\n width: '100%',\n },\n\n [`& .${classes.titleSlider}`]: {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n color: 'white',\n\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n\n [`& .${classes.leftPanelButton}`]: {\n marginRight: theme.spacing(2),\n flexGrow: 0,\n },\n\n [`& .${classes.titleText}`]: {\n flexGrow: 1,\n },\n\n [`& .${classes.rightPanelButton}`]: {\n flexGrow: 0,\n },\n\n ...(leftPanel?.open && {\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.enteringScreen,\n }),\n marginLeft: `${leftPanel?.width ?? 0}px`,\n }),\n\n ...(rightPanel?.open && {\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.enteringScreen,\n }),\n marginRight: `${rightPanel?.width ?? 0}px`,\n }),\n },\n}));\n\n/**\n * Goes at the top of every page. Wasn't feeling creative in naming it.\n *\n * This differs from the typical appbar with a toolbar used in most MUI apps in\n * that it has to interact with a sliding side panel that is not the main\n * navbar.\n */\nexport default function TopBar({\n titleText = '',\n leftPanel,\n rightPanel,\n 'data-testid': dataTestId,\n}: TopBarProps) {\n return (\n <Root leftPanel={leftPanel} rightPanel={rightPanel} data-testid={dataTestId}>\n <div className={classes.topStripe} />\n <div className={classes.titleBar}>\n <Box className={classes.titleSlider}>\n {leftPanel !== undefined && !leftPanel.open && leftPanel.showOpenArrow && (\n <IconButton\n className={classes.leftPanelButton}\n color=\"inherit\"\n aria-label=\"Open left side panel\"\n onClick={leftPanel?.onOpen}\n edge=\"start\"\n size=\"large\"\n >\n {' '}\n <ForwardIcon />\n </IconButton>\n )}\n\n <Typography className={classes.titleText} variant=\"h6\" noWrap>\n {titleText}\n </Typography>\n\n {rightPanel !== undefined && !rightPanel.open && rightPanel.showOpenArrow && (\n <IconButton\n className={classes.rightPanelButton}\n color=\"inherit\"\n aria-label=\"Open right side panel\"\n onClick={rightPanel?.onOpen}\n edge=\"end\"\n size=\"large\"\n >\n {' '}\n <BackIcon />\n </IconButton>\n )}\n </Box>\n </div>\n </Root>\n );\n}\n","import { PropsWithChildren } from 'react';\nimport {Box, BoxProps, Typography, styled, Drawer, DrawerProps, IconButton} from '@mui/material';\nimport {ArrowBack as BackIcon, ArrowForward as ForwardIcon} from '@mui/icons-material';\n\nexport const DEFAULT_PANEL_WIDTH = 400;\n\ninterface SidePanelDrawerProps extends DrawerProps {\n anchor: 'left' | 'right';\n width?: number;\n debugOpacity?: boolean;\n navBarOpen: boolean;\n navBarWidthOpen: number;\n navBarWidthClosed: number;\n}\n\nconst SidePanelDrawer = styled(Drawer, {\n shouldForwardProp: (prop) =>\n // Note we do want anchor to be forwarded to the Drawer component\n !(\n [\n 'width',\n 'debug',\n 'debugOpacity',\n 'navBarOpen',\n 'navBarWidthOpen',\n 'navBarWidthClosed',\n ] as Array<PropertyKey>\n ).includes(prop),\n name: 'SidePanelDrawer',\n})<SidePanelDrawerProps>(\n ({ width, debugOpacity = false, anchor, navBarOpen, navBarWidthOpen, navBarWidthClosed }) => ({\n width,\n\n '& .MuiDrawer-paper': {\n position: 'absolute',\n width,\n boxSizing: 'border-box',\n border: 'unset',\n boxShadow:\n '0px 4px 5px rgba(0, 0, 0, 0.14), 0px 1px 10px rgba(0, 0, 0, 0.12), 0px 2px 4px rgba(0, 0, 0, 0.2)',\n\n ...(debugOpacity && {\n opacity: '50%',\n }),\n\n ...(anchor === 'left' && {\n marginLeft: `${navBarWidthClosed}px`,\n ...(navBarOpen && {\n marginLeft: `${navBarWidthOpen}px`,\n }),\n }),\n },\n })\n);\n\ninterface DrawerHeaderBoxProps {\n anchor: 'left' | 'right';\n}\n\nconst DrawerHeaderBox = styled(Box, {\n shouldForwardProp: (prop) => !(['anchor'] as Array<PropertyKey>).includes(prop),\n})<DrawerHeaderBoxProps>(({ theme, anchor }) => ({\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(2),\n ...theme.mixins.toolbar,\n justifyContent: anchor === 'left' ? 'space-between' : 'flex-start',\n backgroundColor: theme.palette.primary.light,\n height: '88px',\n\n '&,*': {\n color: 'white',\n },\n\n ' .MuiTypography-root': {\n fontSize: '22px',\n },\n\n ' .MuiButtonBase-root': {\n marginRight: anchor === 'right' ? theme.spacing(2) : 0,\n },\n}));\n\ntype SidePanelProps = PropsWithChildren<{\n open: boolean;\n anchor?: 'left' | 'right';\n onClose?: React.MouseEventHandler<HTMLElement>;\n titleText?: string;\n width?: number;\n showCloseArrow?: boolean;\n debugOpacity?: boolean;\n headerBoxProps?: BoxProps;\n onOpened?: () => void;\n onClosed?: () => void;\n 'data-testid'?: string;\n navBarOpen?: boolean;\n navBarWidthOpen?: number;\n navBarWidthClosed?: number;\n}>;\n\n/**\n * The SidePanel is designed to be used along with the TopBar component for a\n * consistent look and feel.\n */\nexport default function SidePanel({\n children,\n anchor = 'left',\n open,\n onClose = () => {},\n titleText = '',\n width = DEFAULT_PANEL_WIDTH,\n showCloseArrow = true,\n debugOpacity = false,\n headerBoxProps = {},\n onOpened,\n onClosed,\n 'data-testid': dataTestId,\n navBarOpen = false,\n navBarWidthOpen = 0,\n navBarWidthClosed = 0,\n}: SidePanelProps) {\n return (\n <SidePanelDrawer\n SlideProps={{\n onEntered: () => onOpened?.(),\n onExited: () => onClosed?.(),\n }}\n variant=\"persistent\"\n anchor={anchor}\n open={open}\n width={width}\n debugOpacity={debugOpacity}\n data-testid={dataTestId}\n navBarOpen={navBarOpen}\n navBarWidthOpen={navBarWidthOpen}\n navBarWidthClosed={navBarWidthClosed}\n >\n <DrawerHeaderBox anchor={anchor} {...headerBoxProps}>\n {/* Might be a cleaner way to do this, but it does the job */}\n {anchor === 'left' ? (\n <>\n <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n {titleText}\n </Typography>\n\n {showCloseArrow && (\n <IconButton onClick={onClose} size=\"large\" aria-label=\"Close left side panel\">\n <BackIcon data-testid=\"arrowbackicon\" />{' '}\n </IconButton>\n )}\n </>\n ) : (\n <>\n {showCloseArrow && (\n <IconButton onClick={onClose} size=\"large\" aria-label=\"Close right side panel\">\n <ForwardIcon />{' '}\n </IconButton>\n )}\n\n <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n {titleText}\n </Typography>\n </>\n )}\n </DrawerHeaderBox>\n {children}\n </SidePanelDrawer>\n );\n}\n","import { styled } from '@mui/material';\n\ninterface PanelProps {\n width: number;\n open: boolean;\n}\n\ninterface PanelAwareMarginsProps {\n /** If the leftPanel prop is omitted but a left panel is still in use on the\n * page, it will slide over the top instead of the default pushing */\n leftPanel?: PanelProps;\n\n /** If the rightPanel prop is omitted but a right panel is still in use on the\n * page, it will slide over the top instead of the default pushing */\n rightPanel?: PanelProps;\n}\n\n/** With the optional leftPanel and rightPanel props providing state and width,\n * the children of of the PanelAwareMargins will looks like they is pushed aside\n * by the panels by transitioning the margins. */\nconst PanelAwareMargins = styled('div', {\n shouldForwardProp: (prop) => !(['leftPanel', 'rightPanel'] as Array<PropertyKey>).includes(prop),\n name: 'PanelAwareMargins',\n})<PanelAwareMarginsProps>(({ theme, leftPanel, rightPanel }) => ({\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n\n ...(leftPanel?.open && {\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.enteringScreen,\n }),\n marginLeft: `${leftPanel?.width ?? 0}px`,\n }),\n ...(rightPanel?.open && {\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.enteringScreen,\n }),\n marginRight: `${rightPanel?.width ?? 0}px`,\n }),\n}));\n\nexport default PanelAwareMargins;\n","import { styled, Container } from '@mui/material';\n\n/** Just a simple styled container applying our spacings*/\nconst PageContainer = styled(Container, {\n name: 'PageContainer',\n})(({ theme }) => ({\n // Horizontal padding comes from the Container's gutter\n paddingTop: theme.spacing(3),\n paddingBottom: theme.spacing(3),\n}));\n\nexport default PageContainer;\n","import { ComponentProps, PropsWithChildren, ReactNode, useEffect, useState } from 'react';\nimport { Box } from '@mui/material';\n\nimport TopBar from './TopBar';\nimport SidePanel, { DEFAULT_PANEL_WIDTH } from './SidePanel';\nimport PanelAwareMargins from './PanelAwareMargins';\nimport PageContainer from './PageContainer';\n\nconst INITIAL_LEFT_PANEL_OPEN = false;\nconst INITIAL_RIGHT_PANEL_OPEN = false;\n\nconst PANEL_DEFAULTS = {\n titleText: '',\n flavour: 'push',\n width: DEFAULT_PANEL_WIDTH,\n arrowButtons: 'both',\n startOpen: false,\n open: undefined,\n onChangeOpen: undefined,\n content: <></>,\n onOpened: undefined,\n onClosed: undefined,\n dataTestId: undefined,\n};\n\nexport interface SidePanelProps {\n titleText?: string;\n content?: ReactNode;\n flavour?: 'push' | 'overlay';\n arrowButtons?: 'open' | 'close' | 'both' | 'none';\n width?: number;\n startOpen?: boolean;\n\n /** Use this and onChangeOpen if you want to use component as a controlled component */\n open?: boolean;\n onChangeOpen?: (open: boolean) => void;\n\n /** Called when the sliding transition to open has finished */\n onOpened?: () => void;\n\n /** Called when the sliding transition to open has finished */\n onClosed?: () => void;\n\n dataTestId?: string;\n}\n\ninterface BasePageLayoutProps {\n titleText?: string;\n\n leftPanel?: SidePanelProps;\n rightPanel?: SidePanelProps;\n\n /** This will only have an effect for panels whose state is not controlled by\n * parent */\n sidePanelsAreMutuallyExclusive?: boolean;\n\n /** Temporary, get rid of later */\n debugOpacity?: boolean;\n\n /** Props applied to the PageContainer component, which is a styled MUI Container */\n pageContainerProps?: ComponentProps<typeof PageContainer>;\n\n topBarDataTestId?: string;\n pageContentDataTestId?: string;\n}\n\ninterface PageLayoutWithNavBarProps extends BasePageLayoutProps {\n /** Only used by side panels for alignment purposes */\n navBarOpen: boolean;\n /** Only used by side panels for alignment purposes */\n navBarWidthOpen: number;\n /** Only used by side panels for alignment purposes */\n navBarWidthClosed: number;\n}\n\ninterface PagelayoutWithoutNavBarProps extends BasePageLayoutProps {\n navBarOpen?: never;\n navBarWidthOpen?: never;\n navBarWidthClosed?: never;\n}\n\nexport type PageLayoutProps = PropsWithChildren<\n PageLayoutWithNavBarProps | PagelayoutWithoutNavBarProps\n>;\n\n/**\n * To be used by all Page components in our apps to use a standard Top Bar, Left\n * Panel, Right Panel and Page Contents within the contents for a uniform look.\n *\n * At present it is somewhat crudely adapted from the code used in the\n * ListManager app. It _assumes_ NavBar component on the left.\n *\n * It is in the process of being tidied up, and as such is very much in flux.\n * The end goal is to unify the left most NavBar component with the PageLayout,\n * but this has to be done incrementally.\n */\nexport default function PageLayout({\n children,\n titleText = '',\n leftPanel,\n rightPanel,\n sidePanelsAreMutuallyExclusive = true,\n debugOpacity = false,\n pageContainerProps,\n pageContentDataTestId,\n topBarDataTestId,\n navBarOpen,\n navBarWidthOpen,\n navBarWidthClosed,\n}: PageLayoutProps) {\n const [leftPanelOpenInternal, setLeftPanelOpenInternal] = useState(INITIAL_LEFT_PANEL_OPEN);\n const [rightPanelOpenInternal, setRightPanelOpenInternal] = useState(INITIAL_RIGHT_PANEL_OPEN);\n const [leftPanelOpenInternalPrevious, setLeftPanelOpenInternalPrevious] =\n useState(INITIAL_LEFT_PANEL_OPEN);\n const [rightPanelOpenInternalPrevious, setRightPanelOpenInternalPrevious] =\n useState(INITIAL_RIGHT_PANEL_OPEN);\n\n const includeLeftPanel = leftPanel !== undefined;\n const includeRightPanel = rightPanel !== undefined;\n\n const {\n titleText: leftPanelTitleText,\n content: leftPanelContent,\n flavour: leftPanelFlavour,\n open: leftPanelOpen,\n onChangeOpen: leftPanelOnChangeOpen,\n width: leftPanelWidth,\n arrowButtons: leftPanelArrowButtons,\n startOpen: leftPanelStartOpen,\n onOpened: leftPanelOnOpened,\n onClosed: leftPanelOnClosed,\n dataTestId: leftPanelDataTestId,\n } = leftPanel ? { ...PANEL_DEFAULTS, ...leftPanel } : { ...PANEL_DEFAULTS };\n\n const {\n titleText: rightPanelTitleText,\n content: rightPanelContent,\n flavour: rightPanelFlavour,\n open: rightPanelOpen,\n onChangeOpen: rightPanelOnChangeOpen,\n width: rightPanelWidth,\n arrowButtons: rightPanelArrowButtons,\n startOpen: rightPanelStartOpen,\n onOpened: rightPanelOnOpened,\n onClosed: rightPanelOnClosed,\n dataTestId: rightPanelDataTestId,\n } = rightPanel ? { ...PANEL_DEFAULTS, ...rightPanel } : { ...PANEL_DEFAULTS };\n\n useEffect(() => {\n if (leftPanelStartOpen !== INITIAL_LEFT_PANEL_OPEN) {\n setLeftPanelOpenInternal(leftPanelStartOpen);\n setLeftPanelOpenInternalPrevious(leftPanelStartOpen);\n }\n }, [leftPanelStartOpen]);\n\n useEffect(() => {\n if (rightPanelStartOpen !== INITIAL_RIGHT_PANEL_OPEN) {\n setRightPanelOpenInternal(rightPanelStartOpen);\n setRightPanelOpenInternalPrevious(rightPanelStartOpen);\n }\n }, [rightPanelStartOpen]);\n\n const leftPanelOpenCurrent = leftPanelOpen === undefined ? leftPanelOpenInternal : leftPanelOpen;\n\n const rightPanelOpenCurrent =\n rightPanelOpen === undefined ? rightPanelOpenInternal : rightPanelOpen;\n\n const handleLeftPanelChangeOpen = (open: boolean) => {\n if (leftPanelOpen === undefined) {\n // If not in controlled mode, update the internal state\n setLeftPanelOpenInternal(open);\n\n if (sidePanelsAreMutuallyExclusive && includeRightPanel) {\n if (open) {\n setRightPanelOpenInternal(false);\n setRightPanelOpenInternalPrevious(rightPanelOpenInternal);\n } else {\n setRightPanelOpenInternal(rightPanelOpenInternalPrevious);\n }\n }\n }\n // Likewise, if callback provided, call it\n if (leftPanelOnChangeOpen) leftPanelOnChangeOpen(open);\n };\n\n const handleRightPanelChangeOpen = (open: boolean) => {\n if (rightPanelOpen === undefined) {\n setRightPanelOpenInternal(open);\n if (sidePanelsAreMutuallyExclusive && includeLeftPanel) {\n if (open) {\n setLeftPanelOpenInternal(false);\n setLeftPanelOpenInternalPrevious(leftPanelOpenInternal);\n } else {\n setLeftPanelOpenInternal(leftPanelOpenInternalPrevious);\n }\n }\n }\n if (rightPanelOnChangeOpen) rightPanelOnChangeOpen(open);\n };\n\n return (\n <Box>\n {includeLeftPanel && (\n <SidePanel\n data-testid={leftPanelDataTestId}\n anchor=\"left\"\n open={leftPanelOpenCurrent}\n onClose={() => handleLeftPanelChangeOpen(false)}\n width={leftPanelWidth}\n titleText={leftPanelTitleText}\n debugOpacity={debugOpacity}\n showCloseArrow={leftPanelArrowButtons === 'both' || leftPanelArrowButtons === 'close'}\n onOpened={leftPanelOnOpened}\n onClosed={leftPanelOnClosed}\n navBarOpen={navBarOpen}\n navBarWidthOpen={navBarWidthOpen}\n navBarWidthClosed={navBarWidthClosed}\n >\n {leftPanelContent}\n </SidePanel>\n )}\n\n {includeRightPanel && (\n <SidePanel\n data-testid={rightPanelDataTestId}\n anchor=\"right\"\n open={rightPanelOpenCurrent}\n onClose={() => handleRightPanelChangeOpen(false)}\n width={rightPanelWidth}\n titleText={rightPanelTitleText}\n debugOpacity={debugOpacity}\n showCloseArrow={rightPanelArrowButtons === 'both' || rightPanelArrowButtons === 'close'}\n onOpened={rightPanelOnOpened}\n onClosed={rightPanelOnClosed}\n navBarOpen={navBarOpen}\n navBarWidthOpen={navBarWidthOpen}\n navBarWidthClosed={navBarWidthClosed}\n >\n {rightPanelContent}\n </SidePanel>\n )}\n\n <TopBar\n titleText={titleText}\n data-testid={topBarDataTestId}\n {...(includeLeftPanel && leftPanelFlavour === 'push'\n ? {\n leftPanel: {\n open: leftPanelOpenCurrent,\n width: leftPanelWidth,\n onOpen: () => handleLeftPanelChangeOpen(true),\n showOpenArrow: leftPanelArrowButtons === 'both' || leftPanelArrowButtons === 'open',\n },\n }\n : {})}\n {...(includeRightPanel && rightPanelFlavour === 'push'\n ? {\n rightPanel: {\n open: rightPanelOpenCurrent,\n width: rightPanelWidth,\n onOpen: () => handleRightPanelChangeOpen(true),\n showOpenArrow:\n rightPanelArrowButtons === 'both' || rightPanelArrowButtons === 'open',\n },\n }\n : {})}\n />\n\n <PanelAwareMargins\n {...(leftPanelFlavour === 'push'\n ? {\n leftPanel: {\n open: leftPanelOpenCurrent,\n width: leftPanelWidth,\n },\n }\n : {})}\n {...(rightPanelFlavour === 'push'\n ? {\n rightPanel: {\n open: rightPanelOpenCurrent,\n width: rightPanelWidth,\n },\n }\n : {})}\n >\n <PageContainer data-testid={pageContentDataTestId} {...pageContainerProps}>\n {children}\n </PageContainer>\n </PanelAwareMargins>\n </Box>\n );\n}\n","// The default props passed to the underlying Snackbar component\nimport { SnackbarOrigin } from '@mui/material/Snackbar';\n\nexport const defaultSnackbarProps = {\n autoHideDuration: 6000,\n anchorOrigin: { vertical: 'top', horizontal: 'center' } as SnackbarOrigin,\n\n // The default is false. If we prefer timer to continue when window loses\n // focus, change to true\n disableWindowBlurListener: false,\n};\n\nexport const defaultSaladBarProps = {\n shouldClose: (_event: Event | React.SyntheticEvent<Element, Event>, reason: string) => {\n return reason !== 'clickaway';\n },\n};\n\nexport const defaultEnqueueNotificationOptions = {\n message: '',\n severity: 'info',\n variant: 'standard',\n progressIndicator: undefined, // Can use 'circular' or 'linear'\n};\n","import React, { useRef, useState, createContext, useCallback } from 'react';\nimport { Alert, LinearProgress, CircularProgress, Snackbar, SnackbarProps } from '@mui/material';\n\nimport {\n Notification,\n SaladBarCloseReason,\n SaladBarState,\n SaladBarActions,\n SaladBarContext,\n} from './types';\nimport {\n defaultSaladBarProps,\n defaultSnackbarProps,\n defaultEnqueueNotificationOptions,\n} from './defaults';\n\nconst MAX_QUEUE_LENGTH = 100;\nconst MAX_QUEUE_HIT_REPORT_INTERVAL = 2000;\nconst SALADBAR_INDEX = 2000;\n\n// No need to use uuids, just use an incremented value\nconst generateNotificationKey = (() => {\n let previousKey = 0;\n return () => {\n previousKey += 1;\n return previousKey;\n };\n})();\n\nconst alertWithLinearProgressStyle = {\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n};\n\n// Note: Must be at at this scope, otherwise useEffect will loop infinitely\nconst defaultOverrideState = {};\nconst defaultOverrideActions = {};\n\nexport const Context = createContext<SaladBarContext | null>(null);\n\nexport interface SaladBarProviderProps extends SnackbarProps {\n /** Allow overriding the state of the SaladBar (for tests etc)*/\n overrideState?: Partial<SaladBarState>;\n\n /** Allow overriding the actions of the SaladBar (for tests etc)*/\n overrideActions?: Partial<SaladBarActions>;\n\n /** Called when an event triggers closing of currently displayed snackbar.\n * Default implementation returns false if reason is 'clickaway', otherwise\n * true.*/\n shouldClose?: (\n event: Event | React.SyntheticEvent<Element, Event>,\n reason: SaladBarCloseReason\n ) => boolean;\n}\n\nexport default function SaladBarProvider({\n overrideState = defaultOverrideState,\n overrideActions = defaultOverrideActions,\n shouldClose = defaultSaladBarProps.shouldClose,\n children,\n ...snackbarProps\n}: SaladBarProviderProps) {\n const [{ open }, setSaladBarState] = useState({ open: false });\n\n // We use a ref instead of a state to store the actual data, because we want\n // queue to be persistent across the whole lifetime of component. I considered\n // using yocto-queue because it would be O(1) instead of O(n), but its not\n // designed to access the head without removing it and its not going to make\n // much difference anyway.\n const queueRef = useRef<Notification[]>([]);\n\n const limitLastHitAt = useRef(Date.now());\n const limitHitCountSinceLastReport = useRef(0);\n\n const setOpen = useCallback((newVal: boolean) => {\n setSaladBarState({ open: newVal });\n }, []);\n\n const enqueueNotification = useCallback((notification: Notification = {}) => {\n limitHitCountSinceLastReport.current += 1;\n if (queueRef.current.length >= MAX_QUEUE_LENGTH) {\n // If the queue length is hit, probably stuck in some sort of loop, so\n // don't want to spam logs instantly so space it out\n if (Date.now() - limitLastHitAt.current >= MAX_QUEUE_HIT_REPORT_INTERVAL) {\n limitLastHitAt.current = Date.now();\n console.error(\n `SaladBarProvider: MAX_QUEUE_LENGTH (${MAX_QUEUE_LENGTH}) hit ${limitHitCountSinceLastReport.current} times in last ${MAX_QUEUE_HIT_REPORT_INTERVAL}ms)`\n );\n limitHitCountSinceLastReport.current = 0;\n }\n }\n\n const newNotification = {\n ...defaultEnqueueNotificationOptions,\n key: generateNotificationKey(), // Can be overridden.\n ...notification, // This could result in collisons, but unlikely.\n };\n\n // Add to the end of queue\n queueRef.current.push(newNotification as Notification);\n\n // If the queue was previously empty, then open the snackbar. We don't do it\n // whenever enqueueNotification is called since it will mess up transitions\n if (queueRef.current.length === 1) setSaladBarState({ open: true });\n\n return newNotification.key;\n }, []);\n\n const enqueueSuccessNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'success', ...options });\n\n const enqueueInfoNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'info', ...options });\n\n const enqueueWarningNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'warning', ...options });\n\n const enqueueErrorNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'error', ...options });\n\n /**\n * Remove the notification with specified key from the queue. If the key is\n * not found, immediately returns null.\n *\n * @param key - The key as returned from enqueue...() function.\n *\n * @returns The removed notification\n */\n const removeNotification = (key: Notification['key']) => {\n const index = queueRef.current.findIndex((x) => x.key === key);\n if (index === -1) return;\n\n if (index === 0) {\n // If its at the front of the queue, it is either currently being\n // displayed or in process of being closed. Either way, we can just set\n // open to false\n setSaladBarState({ open: false });\n return queueRef.current[0];\n }\n // Otherwise we just remove it from the queue, it won't need to transition\n return queueRef.current.splice(index, 1);\n };\n\n const handleClose = (\n event: Event | React.SyntheticEvent<Element, Event>,\n reason: SaladBarCloseReason\n ) => {\n if (shouldClose(event, reason)) setSaladBarState({ open: false });\n };\n\n // Callback fired before the transition is exiting.\n const handleExit = () => {};\n\n // Callback fired when the transition has exited.\n const handleExited = () => {\n // Remove head of queue\n queueRef.current.shift();\n\n // If there is still something on the queue, then re-open\n if (queueRef.current.length > 0) setSaladBarState({ open: true });\n };\n\n // The notification to display is the one at head of queue\n const currentNotification = queueRef.current[0] ?? {\n ...defaultEnqueueNotificationOptions,\n };\n\n // Can also override certain props on a notification level\n const currentNotificationSnackbarProps: { autoHideDuration?: number } = {};\n // Probably a better way of doing this\n if ('autoHideDuration' in currentNotification) {\n currentNotificationSnackbarProps.autoHideDuration = currentNotification.autoHideDuration;\n }\n\n // Note the order of props in Snackbar, we don't allow overriding open and\n // onClose directly.\n const snackbarFinalProps = {\n ...defaultSnackbarProps,\n ...snackbarProps,\n };\n\n const value: SaladBarContext = {\n open,\n setOpen,\n enqueueNotification,\n enqueueSuccessNotification,\n enqueueInfoNotification,\n enqueueWarningNotification,\n enqueueErrorNotification,\n removeNotification,\n ...overrideState,\n ...overrideActions,\n };\n\n return (\n <Context.Provider value={value}>\n {children}\n <Snackbar\n {...snackbarFinalProps}\n {...currentNotificationSnackbarProps}\n open={open}\n onClose={handleClose}\n TransitionProps={{\n onExited: handleExited,\n onExit: handleExit,\n }}\n sx={{ zIndex: SALADBAR_INDEX }}\n >\n <div>\n <Alert\n onClose={(event) => handleClose(event, 'closeAlert')}\n severity={currentNotification.severity}\n variant={'filled'}\n icon={\n currentNotification.progressIndicator === 'circular' ? (\n <CircularProgress size=\"1em\" />\n ) : undefined\n }\n style={\n currentNotification.progressIndicator === 'linear'\n ? alertWithLinearProgressStyle\n : undefined\n }\n >\n {currentNotification.message}\n </Alert>\n {currentNotification.progressIndicator === 'linear' && <LinearProgress color=\"primary\" />}\n </div>\n </Snackbar>\n </Context.Provider>\n );\n}\n","import { useContext } from 'react';\n\nimport { Context } from './SaladBarContext';\nimport { ContextError } from '../../errors/ContextError';\n\n/**\n * Use the `useSaladBar` hook in components to access the enqueueNotification()\n * method to add a snackbar message to queue.\n *\n * Must be used inside a <SaladBarProvider>\n *\n * Example:\n *\n * ```js\n * const {\n * enqueueNotification,\n * enqueueSuccessNotification,\n * enqueueInfoNotification,\n * enqueueWarningNotification,\n * enqueueErrorNotification,\n * } = useSaladBar();\n * ...\n * enqueueNotification({message: 'hello', severity: 'info'});\n * // or\n * enqueueInfoNotification('hello');\n * ```\n */\nexport function useSaladBar() {\n const context = useContext(Context);\n\n if (context === null) {\n throw new ContextError('Error: Tried to useSaladBar outside of a <SaladBarProvider>');\n }\n\n return context;\n}\n","/* eslint-disable react/prop-types */\n/* eslint-disable react/display-name */\nimport { createHelper } from 'souvlaki';\n\nimport SaladBarProvider, { SaladBarProviderProps } from './SaladBarContext';\n\nexport const withSaladBarProvider = createHelper(\n (\n props: SaladBarProviderProps = { autoHideDuration: 1 },\n state: Partial<unknown> = {},\n actions: Partial<unknown> = {}\n ) =>\n ({ children }) => {\n return (\n <SaladBarProvider {...props} overrideState={state} overrideActions={actions}>\n {children}\n </SaladBarProvider>\n );\n }\n);\n","import { Provider, createStore, getDefaultStore, useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport { PropsWithChildren } from 'react';\n\nexport const atomStore = getDefaultStore();\n\nexport const AtomProvider = ({\n children,\n store,\n}: PropsWithChildren<{ store?: ReturnType<typeof createStore> }>) => (\n <Provider store={store ?? atomStore}>{children}</Provider>\n);\n\nexport const useLibraryAtom: typeof useAtom = (...atom: Parameters<typeof useAtom>) =>\n useAtom(...atom);\n\nexport const useSetLibraryAtom: typeof useSetAtom = <A, B extends [], C>(\n ...atom: Parameters<typeof useSetAtom<A, B, C>>\n) => useSetAtom(...atom);\n\nexport const useLibraryAtomValue: typeof useAtomValue = (\n ...atom: Parameters<typeof useAtomValue>\n) => useLibraryAtomValue(...atom);\n","import { styled, CSSObject, Theme } from '@mui/material/styles';\nimport Drawer from '@mui/material/Drawer';\n\nconst PREFIX = 'Navbar';\n\nexport const classes = {\n root: `${PREFIX}-root`,\n menuButton: `${PREFIX}-menuButton`,\n hide: `${PREFIX}-hide`,\n content: `${PREFIX}-content`,\n // userInfoHolder: `${PREFIX}-userInfoHolder`,\n // settings: `${PREFIX}-settings`,\n // pieChartIcon: `${PREFIX}-pieChartIcon`,\n};\n\nexport const Root = styled('div', { name: 'NavBar' })(({ theme }) => ({\n [`&.${classes.root}`]: {\n display: 'flex',\n },\n\n [`& .${classes.menuButton}`]: {\n marginRight: 36,\n },\n\n [`& .${classes.hide}`]: {\n display: 'none',\n },\n\n [`& .${classes.content}`]: {\n flexGrow: 1,\n padding: theme.spacing(3),\n },\n\n // [`& .${classes.userInfoHolder}`]: {\n // height: '148px',\n // marginTop: '64px',\n // marginBottom: '16px',\n // },\n}));\n\nconst sharedOverrides = (theme: Theme, offsetTop: number): CSSObject => ({\n height: `calc(100vh - ${offsetTop})`,\n top: offsetTop,\n overflowX: 'hidden',\n overflowY: 'hidden',\n color: 'inherit',\n backgroundColor: theme?.navBar?.backgroundColor ?? 'white', // Provide default so tests don't need to wrap theme provider\n});\n\nconst openedMixin = (theme: Theme, width: number, offsetTop: number): CSSObject => ({\n width,\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n ...sharedOverrides(theme, offsetTop),\n});\n\nconst closedMixin = (theme: Theme, width: number, offsetTop: number): CSSObject => ({\n width,\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n overflowX: 'hidden',\n\n ...sharedOverrides(theme, offsetTop),\n});\n\ninterface NavDrawerProps {\n open: boolean;\n widthOpen: number;\n widthClosed: number;\n offsetTop: number;\n}\n\nexport const NavDrawer = styled(Drawer, {\n shouldForwardProp: (prop) =>\n !['open', 'widthOpen', 'widthClosed', 'offsetTop'].includes(prop as string),\n})<NavDrawerProps>(({ theme, open, widthOpen, widthClosed, offsetTop }) => ({\n flexShrink: 0,\n whiteSpace: 'nowrap',\n boxSizing: 'border-box',\n\n ...(open && {\n ...openedMixin(theme, widthOpen, offsetTop),\n '& .MuiDrawer-paper': openedMixin(theme, widthOpen, offsetTop),\n }),\n ...(!open && {\n ...closedMixin(theme, widthClosed, offsetTop),\n '& .MuiDrawer-paper': closedMixin(theme, widthClosed, offsetTop),\n }),\n}));\n","// import { Link as RouterLink } from 'react-router-dom';\n\nimport { NavBarLink } from './types';\n\nexport interface LinksMenuProps {\n links: NavBarLink[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function LinksMenu({ links }: LinksMenuProps) {\n return <div>LinksMenu not implemented yet</div>;\n}\n","// https://stackoverflow.com/a/8831937\nexport function simpleHashCode(str: string) {\n let hash = 0;\n for (let i = 0, len = str.length; i < len; i++) {\n const chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n}\n","import { Box, Avatar, Typography, Skeleton } from '@mui/material';\n\nimport { DomainCode } from '../../../domainCode';\nimport { simpleHashCode } from '../../../utils';\nimport { User } from './types';\n\nconst avatarSize = {\n width: '5rem',\n height: '5rem',\n};\n\n// These all have good contrast against our typical navbar background colour\nconst avatarColours = ['#A62A21', '#7e3794', '#0B51C1', '#3A6024', '#A81563', '#B3003C'];\n\nconst extractInitials = (name: string) =>\n name\n .split(/\\s/)\n .map((part) => part.substring(0, 1).toUpperCase())\n .filter((v) => !!v)\n .slice(0, 2)\n .join('')\n .toUpperCase();\n\nexport interface UserInfoProps {\n user?: User;\n domainCode?: DomainCode;\n}\n\n/**\n * If user has a defined name and a valid url for picture, the picture will for\n * the avatar image.\n *\n * If there is a defined name but the picture is invalid or undefined, the\n * intials will be used to generate the avatar image. The colour will be random\n * for different names, but always the same for the same name.\n *\n * If user is undefined or the name is undefined, a generic empty avatar image\n * will be displayed.\n */\nexport default function UserInfo({ user, domainCode }: UserInfoProps) {\n return (\n <Box marginY=\"2rem\" display=\"flex\" flexDirection=\"column\" alignItems=\"center\" gap=\"1rem\">\n {user?.name ? (\n <Avatar\n src={user?.picture}\n sx={{\n ...avatarSize,\n bgcolor: avatarColours[Math.abs(simpleHashCode(user.name)) % avatarColours.length],\n }}\n >\n {extractInitials(user.name)}\n </Avatar>\n ) : (\n <Avatar sx={avatarSize} />\n )}\n\n <Box alignItems=\"center\" display=\"flex\" flexDirection=\"column\">\n {user?.name ? (\n <Typography>{user.name}</Typography>\n ) : (\n <Skeleton animation={false} width={avatarSize.width} />\n )}\n\n {domainCode ? (\n <Typography>{domainCode.toUpperCase()}</Typography>\n ) : (\n <Skeleton animation={false} width={avatarSize.width} />\n )}\n </Box>\n </Box>\n );\n}\n","import { ReactNode } from 'react';\nimport { Divider, Box } from '@mui/material';\n\nimport { NavBarLink, User } from './types';\nimport { classes, Root, NavDrawer } from './Styling';\nimport { LinksMenu } from './LinksMenu';\nimport { DomainCode } from '../../../domainCode';\nimport UserInfo from './UserInfo';\n\nexport interface NavBarProps {\n open: boolean;\n\n offsetTop?: number;\n\n widthOpen: number;\n\n widthClosed: number;\n\n /** Set the datatest-id on the root element for using reactdom's getByTestId()\n * function */\n 'data-testid'?: string;\n\n /** The contents to be displayed at the top, specified to the current page */\n top?: ReactNode;\n\n /** Display be below the top section, always the same regardless of page. Can\n * be provided either as a node directly, or an array of objects that will be\n * used to generate a standard navbar menu.\n *\n * @example\n *\n * ```\n * // As a ReactNode\n * <NavBar open: {open} middle={<TheContent}/>\n * ```\n *\n * @example\n *\n * ```\n * // As an Array\n * <NavBar open: {open} middle={[\n * {label: 'foo', destPathname: '/foo', icon: {FooIcon}},\n * {label: 'bar', destPathname: '/bar', icon: {BarIcon}},\n * ]}/>\n * ```\n */\n middle: ReactNode | NavBarLink[];\n\n /** User information displayed at bottom of navabar when it is open*/\n user?: User;\n\n /** Displayed below the user information when available */\n domainCode?: DomainCode;\n}\n\n/**\n * A styled navigation bar. At this point in time its pretty unopinionated, it\n * just renders whatever children it is given. The NavBarLightStyledList\n * component can be used for consistent styling against the background.\n */\nexport default function NavBar({\n open,\n offsetTop = 0,\n widthOpen,\n widthClosed,\n 'data-testid': dataTestId,\n top,\n middle,\n user,\n domainCode,\n}: NavBarProps) {\n return (\n <Root className={classes.root} data-testid={dataTestId}>\n <NavDrawer\n variant=\"permanent\"\n anchor=\"left\"\n open={open}\n widthOpen={widthOpen}\n widthClosed={widthClosed}\n offsetTop={offsetTop}\n >\n <Box component=\"nav\" sx={{}}>\n {top && (\n <Box sx={{ flexGrow: 1 }}>\n {top}\n <Divider variant=\"middle\" />\n </Box>\n )}\n\n {/* middle is either a ReactNode or an array of NavBarLink objects */}\n {Array.isArray(middle) ? <LinksMenu links={middle as unknown as NavBarLink[]} /> : middle}\n\n <Divider variant=\"middle\" />\n <UserInfo user={user} domainCode={domainCode} />\n </Box>\n </NavDrawer>\n </Root>\n );\n}\n\n// TODO: This is a temporary fix, library clients shouldn't need this\n// export { classes as navBarClasses } from './Styling';\n","import { PropsWithChildren } from 'react';\nimport { Container, Box } from '@mui/material';\n\n// const NavBarAwareMargins = styled('div', {\n// shouldForwardProp: (prop) => !(['leftPanel', 'rightPanel'] as Array<PropertyKey>).includes(prop),\n// name: 'PanelAwareMargins',\n// })<PanelAwareMarginsProps>(({ theme, leftPanel, rightPanel }) => ({\n// transition: theme.transitions.create('margin', {\n// easing: theme.transitions.easing.sharp,\n// duration: theme.transitions.duration.leavingScreen,\n// }),\n\n// ...(leftPanel?.open && {\n// transition: theme.transitions.create('margin', {\n// easing: theme.transitions.easing.easeOut,\n// duration: theme.transitions.duration.enteringScreen,\n// }),\n// marginLeft: `${leftPanel?.width ?? 0}px`,\n// }),\n// ...(rightPanel?.open && {\n// transition: theme.transitions.create('margin', {\n// easing: theme.transitions.easing.easeOut,\n// duration: theme.transitions.duration.enteringScreen,\n// }),\n// marginRight: `${rightPanel?.width ?? 0}px`,\n// }),\n// }));\n\ninterface PageContainerProps {\n topBarHeight: number;\n}\n\nfunction PageContainer({ children, topBarHeight }: PropsWithChildren<PageContainerProps>) {\n return (\n <Box\n sx={{\n overflow: 'auto',\n height: `calc(100vh - ${topBarHeight}px)`,\n scrollbarGutter: 'stable',\n // scrollbarGutter: 'stable both-edges',\n flexGrow: 1,\n }}\n >\n <Container\n component=\"main\"\n id=\"main-content\"\n sx={{ paddingTop: 3, paddingBottom: 3, flexGrow: 1 }}\n >\n {children}\n </Container>\n </Box>\n );\n}\n\nexport default PageContainer;\n","// export const SIDE_PANEL_DEFAULTS = {\n// titleText: '',\n// flavour: 'push',\n// width: 400,\n// arrowButtons: 'both',\n// startOpen: false,\n// open: undefined,\n// onChangeOpen: undefined,\n// content: <></>,\n// onOpened: undefined,\n// onClosed: undefined,\n// dataTestId: undefined,\n// };\n\n// export const INITIAL_LEFT_PANEL_OPEN = false;\n// export const INITIAL_RIGHT_PANEL_OPEN = false;\n\nexport const DEFAULT_INITIAL_NAV_BAR_OPEN = true;\n\nexport const DEFAULT_TOP_BAR_HEIGHT = 64;\nexport const DEFAULT_NAV_BAR_WIDTH_CLOSED = 64;\nexport const DEFAULT_NAV_BAR_WIDTH_OPEN = 256;\n","import { ReactNode } from 'react';\nimport { atom } from 'jotai';\n\nimport {\n DEFAULT_TOP_BAR_HEIGHT,\n DEFAULT_NAV_BAR_WIDTH_OPEN,\n DEFAULT_NAV_BAR_WIDTH_CLOSED,\n} from './defaults';\n\nexport const navBarOpenAtom = atom(true);\n\nexport const navBarWidthOpenAtom = atom(DEFAULT_NAV_BAR_WIDTH_OPEN);\n\nexport const navBarWidthClosedAtom = atom(DEFAULT_NAV_BAR_WIDTH_CLOSED);\n\nexport const titleTextAtom = atom('');\n\nexport const topBarHeightAtom = atom(DEFAULT_TOP_BAR_HEIGHT);\n\n// TODO: Would navBarTop be handled better with a portal?\nexport const navBarTopAtom = atom<ReactNode>(undefined);\n","import { ViewHeadline as HamburgerIcon } from '@mui/icons-material';\nimport { IconButton, Paper, Typography } from '@mui/material';\n\nimport { useSetLibraryAtom } from '../../providers';\nimport { navBarOpenAtom } from './stateAtoms';\n\nconst PREFIX = 'TopBar';\n\nexport interface TopBarProps {\n titleText?: string;\n height: number;\n 'data-testid'?: string;\n}\n\nexport const classes = {\n titleText: `${PREFIX}-titleText`,\n};\n\n/**\n * Top bar of every page, above the content. Works a bit like MUI's AppBar but\n * the scroll bar will not appear for the whole page, instead just the page\n * content\n */\nexport default function TopBar({ titleText = '', height, 'data-testid': dataTestId }: TopBarProps) {\n const setNavBarOpen = useSetLibraryAtom(navBarOpenAtom);\n\n const toggleNavBar = () => setNavBarOpen((prevVal) => !prevVal);\n\n return (\n <header data-testid={dataTestId}>\n <Paper\n square\n elevation={0}\n sx={{\n width: '100%',\n position: 'sticky',\n color: 'primary.contrastText',\n backgroundColor: 'primary.main',\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexShrink: 0,\n height,\n }}\n >\n <IconButton size=\"medium\" color=\"inherit\" sx={{ padding: 1.5 }} onClick={toggleNavBar}>\n <HamburgerIcon fontSize=\"medium\" />\n </IconButton>\n <Typography className={classes.titleText} variant=\"h6\">\n {titleText}\n </Typography>\n </Paper>\n </header>\n );\n}\n","import { Box, CssBaseline } from '@mui/material';\nimport { ComponentProps, PropsWithChildren, useEffect } from 'react';\n\nimport { useLibraryAtom } from '../../providers';\nimport NavBar, { NavBarProps } from './NavBar';\nimport PageContainer from './PageContainer';\nimport TopBar from './TopBar';\nimport {\n navBarOpenAtom,\n navBarTopAtom,\n navBarWidthClosedAtom,\n navBarWidthOpenAtom,\n titleTextAtom,\n topBarHeightAtom,\n} from './stateAtoms';\n\nexport interface BaseAppLayoutProps {\n /** Either an array of objects used to automatically generate the content of\n * the navbar (WIP), or a node to render directly.*/\n navBarMiddle: NavBarProps['middle'];\n\n /**\n * The initial titleText. Shortcut for calling a setter from useAppLayout()\n * hook since its such a common action.\n */\n initialTitleText?: string;\n\n /**\n * The initial open state of the navbar, which is true by default. Shortcut\n * for calling a setter from useAppLayout() hook since its such a common\n * action.\n */\n initialNavBarOpen?: boolean;\n\n /** Props applied to the PageContainer component, which is a styled MUI\n * Container */\n pageContainerProps?: ComponentProps<typeof PageContainer>;\n\n /** Passed directly as prop of TopBar component */\n topBarDataTestId?: string;\n\n /** Passed directly as prop of PageContainer component */\n pageContentDataTestId?: string;\n\n /** Passed down as prop to the root element of the NavBar component */\n navBarDataTestId?: string;\n\n /** Used to display user name and provided picture as avatar or one generated\n * from unitials of the name */\n user?: NavBarProps['user'];\n\n /** Display under the user's name */\n domainCode?: NavBarProps['domainCode'];\n}\n\ntype AppLayoutProps = PropsWithChildren<BaseAppLayoutProps>;\n\nexport default function AppLayout({\n children,\n initialTitleText,\n initialNavBarOpen,\n pageContainerProps,\n pageContentDataTestId,\n topBarDataTestId,\n navBarDataTestId,\n navBarMiddle,\n user,\n domainCode,\n}: AppLayoutProps) {\n const [navBarOpen, setNavBarOpen] = useLibraryAtom(navBarOpenAtom);\n const [navBarWidthOpen] = useLibraryAtom(navBarWidthOpenAtom);\n const [navBarWidthClosed] = useLibraryAtom(navBarWidthClosedAtom);\n const [titleText, setTitleText] = useLibraryAtom(titleTextAtom);\n const [topBarHeight] = useLibraryAtom(topBarHeightAtom);\n const [navBarTop] = useLibraryAtom(navBarTopAtom);\n\n // Allow open state of navbar to start differently than the default. Unlike\n // changing widths and such, this could be a common scenario.\n useEffect(() => {\n if (initialTitleText !== undefined) setTitleText(initialTitleText);\n }, [initialTitleText, setTitleText]);\n\n // Similarly for navbar open state.\n useEffect(() => {\n if (initialNavBarOpen !== undefined) setNavBarOpen(initialNavBarOpen);\n }, [initialNavBarOpen, setNavBarOpen]);\n\n // Can't imagine initial prop values for other states would be useful\n\n return (\n <Box>\n <CssBaseline />\n <TopBar titleText={titleText} data-testid={topBarDataTestId} height={topBarHeight} />\n\n <Box sx={{ display: 'flex' }}>\n <NavBar\n open={navBarOpen}\n top={navBarTop}\n middle={navBarMiddle}\n user={user}\n domainCode={domainCode}\n widthOpen={navBarWidthOpen}\n widthClosed={navBarWidthClosed}\n offsetTop={topBarHeight}\n data-testid={navBarDataTestId}\n />\n\n <PageContainer\n data-testid={pageContentDataTestId}\n topBarHeight={topBarHeight}\n {...pageContainerProps}\n >\n {children}\n </PageContainer>\n </Box>\n </Box>\n );\n}\n","import { atom } from 'jotai';\nimport { DomainCode } from './DomainCodeDialog';\n\nconst DOMAIN_CODE_KEY = 'domainCode';\n\nconst baseDomainCodeAtom = atom<DomainCode>(\n JSON.parse(localStorage.getItem(DOMAIN_CODE_KEY) ?? '{\"domainCode\": \"\"}').domainCode as DomainCode\n);\n\nexport const domainCodeAtom = atom(\n (get) => get(baseDomainCodeAtom),\n (_, set, newValue: DomainCode) => {\n set(baseDomainCodeAtom, newValue);\n localStorage.setItem(DOMAIN_CODE_KEY, JSON.stringify({ domainCode: newValue }));\n }\n);\n","import {\n Autocomplete,\n CircularProgress,\n FormHelperText,\n TextField,\n Typography,\n} from '@mui/material';\nimport { PropsWithChildren, useState } from 'react';\nimport AgDialog from '../components/AgDialog';\nimport { useLibraryAtom, useSaladBar } from '../providers';\nimport { domainCodeAtom } from './hooks';\n\nconst DOMAIN_CODE_LABELS = {\n act: 'ACT',\n nsw: 'NSW',\n nt: 'NT',\n qld: 'QLD',\n sa: 'SA',\n tas: 'TAS',\n vic: 'VIC',\n wa: 'WA',\n ag: 'AG',\n fedmps: 'Fedmps',\n '': '',\n} as const;\n\nexport type DomainCode = keyof typeof DOMAIN_CODE_LABELS;\n\nconst getOptionLabel = (domainCode: DomainCode | null) => {\n return domainCode === null ? 'N/A' : DOMAIN_CODE_LABELS[domainCode] ?? '';\n};\n\ntype Props = PropsWithChildren<{\n isLoading: boolean;\n isOpen: boolean;\n onClose: () => void;\n domainOptions: DomainCode[];\n applicationName: string;\n handleLogout: () => void;\n}>;\n\nconst DomainCodeDialog = ({\n isLoading,\n isOpen,\n onClose: handleClose,\n domainOptions,\n applicationName,\n handleLogout,\n}: Props) => {\n const [domainCode, setDomainCode] = useLibraryAtom(domainCodeAtom);\n const [selectedDomainCode, setSelectedDomainCode] = useState(domainCode);\n const { enqueueSuccessNotification } = useSaladBar();\n\n const userHasNoDomains = domainOptions.length === 0;\n const userHasNoRolesInDomain =\n Boolean(domainCode) &&\n !domainOptions.includes(domainCode) &&\n !domainOptions.includes(selectedDomainCode);\n\n const shouldLogout = !domainCode || userHasNoDomains || userHasNoRolesInDomain;\n\n const handleConfirmDomainCode = async () => {\n if (selectedDomainCode) {\n setDomainCode(selectedDomainCode);\n enqueueSuccessNotification(`Set domain to ${selectedDomainCode}`);\n handleClose();\n } else setDomainCode('');\n };\n\n const handleDialogClose = async () => {\n if (domainCode && !userHasNoDomains && !userHasNoRolesInDomain) {\n setSelectedDomainCode(domainCode);\n handleClose();\n } else if (shouldLogout) {\n handleLogout();\n }\n };\n\n let errorMessage: string | undefined;\n if (userHasNoDomains) {\n errorMessage = 'Unable to retrieve your active organisations. Try logging in again.';\n } else if (userHasNoRolesInDomain) {\n errorMessage =\n 'You no longer have any roles in your chosen organisation. Please choose another.';\n }\n\n return (\n <AgDialog\n isOpen={isOpen}\n dialogTitle=\"Select an organisation\"\n primaryButton={{\n text: 'Confirm',\n onClick: handleConfirmDomainCode,\n disabled: !selectedDomainCode || userHasNoDomains || userHasNoRolesInDomain,\n buttonColor: 'primary',\n }}\n secondaryButton={{\n text: shouldLogout ? 'Logout' : 'Cancel',\n onClick: handleDialogClose,\n }}\n onClose={shouldLogout ? () => {} : handleClose}\n >\n <Typography marginBottom={2}>\n Select the default organisation that you want to use with the {applicationName}.\n </Typography>\n\n <Autocomplete\n loading={isLoading}\n multiple={false}\n disableClearable={false}\n value={selectedDomainCode !== '' ? selectedDomainCode : null}\n onChange={(_, value) => setSelectedDomainCode(value ?? '')}\n getOptionLabel={getOptionLabel}\n options={[...domainOptions]}\n renderInput={(params) => (\n <TextField\n {...params}\n variant=\"filled\"\n label={'Select organisation'}\n InputProps={{\n ...params.InputProps,\n endAdornment: (\n <>\n {isLoading ? (\n <CircularProgress color=\"inherit\" size={20} sx={{ marginTop: '-20px' }} />\n ) : null}\n {params.InputProps.endAdornment}\n </>\n ),\n }}\n />\n )}\n />\n {errorMessage && <FormHelperText error>{errorMessage}</FormHelperText>}\n </AgDialog>\n );\n};\n\nexport default DomainCodeDialog;\n","import { createTheme } from '@mui/material/styles';\n\nconst theme = createTheme({\n palette: {\n primary: {\n dark: '#00A651',\n light: '#A3D39C',\n main: '#007236',\n contrastText: '#FFF',\n },\n warning: {\n main: '#F5871F',\n light: '#FCC589',\n dark: '#A2590A',\n contrastText: '#FFF',\n },\n secondary: {\n main: '#662D91',\n light: '#BD8CBF',\n dark: '#440E62',\n contrastText: '#FFF',\n },\n error: {\n main: '#D43C95',\n light: '#8F2064',\n dark: '#F9CDE0',\n contrastText: '#FFF',\n },\n info: {\n main: '#00A88D',\n light: '#ADDCCF',\n dark: '#005243',\n contrastText: '#FFF',\n },\n success: {\n main: '#00A651',\n light: '#A3D39C',\n dark: '#007236',\n contrastText: '#FFF',\n },\n },\n typography: {\n // I couldn't think of what to call this. It is an attempt to match\n // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730\n // but not sure if line height should be changed\n explainer: {\n fontSize: '14px',\n marginBlockStart: '1em',\n },\n },\n\n navBar: {\n backgroundColor: '#E8E8E8',\n },\n});\n\nexport default theme;\n","import { alpha, createTheme } from '@mui/material/styles';\n\nconst theme = createTheme({\n palette: {\n primary: {\n main: '#007236',\n dark: '#005221',\n light: '#00A04E',\n contrastText: '#FFFFFF',\n },\n secondary: {\n main: '#662D91',\n dark: '#440E62',\n light: '#93268F',\n contrastText: '#FFFFFF',\n },\n error: {\n main: '#D32F2F',\n dark: '#C62828',\n light: '#EF5350',\n },\n info: {\n main: '#0288D1',\n dark: '#01579B',\n light: '#03A9F4',\n },\n success: {\n main: '#0288D1',\n dark: '#01579B',\n light: '#03A9F4',\n },\n },\n components: {\n MuiTextField: {\n defaultProps: { color: 'secondary' },\n },\n MuiToggleButtonGroup: {\n defaultProps: { color: 'secondary' },\n },\n MuiCheckbox: {\n defaultProps: { color: 'secondary' },\n },\n MuiSelect: {\n defaultProps: { color: 'secondary' },\n },\n MuiSwitch: {\n defaultProps: { color: 'secondary' },\n },\n MuiFormControl: {\n defaultProps: { color: 'secondary' },\n },\n MuiMenuItem: {\n // Setting defaultProps for color on MenuItem does not work, so update manually\n styleOverrides: {\n root: ({ theme: origTheme }) => ({\n '&.Mui-selected': {\n backgroundColor: alpha(\n origTheme.palette.secondary.main,\n origTheme.palette.action.selectedOpacity\n ),\n '&:hover': {\n backgroundColor: alpha(\n origTheme.palette.secondary.main,\n origTheme.palette.action.selectedOpacity\n ),\n },\n '&.Mui-focusVisible': {\n backgroundColor: alpha(\n origTheme.palette.secondary.main,\n origTheme.palette.action.focusOpacity\n ),\n },\n },\n }),\n },\n },\n },\n typography: {\n // I couldn't think of what to call this. It is an attempt to match\n // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730\n // but not sure if line height should be changed\n explainer: {\n fontSize: '14px',\n marginBlockStart: '1em',\n },\n h3: {\n fontSize: '1rem',\n fontWeight: 700,\n },\n },\n navBar: {\n backgroundColor: '#E8E8E8',\n },\n});\n\nexport default theme;\n","/* eslint-disable @typescript-eslint/no-inferrable-types */\n/* eslint-disable react/prop-types */\n/* eslint-disable react/display-name */\nimport { Provider, WritableAtom, useAtomValue } from 'jotai';\nimport { useHydrateAtoms } from 'jotai/utils';\nimport { PropsWithChildren } from 'react';\nimport { createHelper } from 'souvlaki';\nimport { domainCodeAtom } from '../domainCode';\nimport {\n navBarOpenAtom,\n navBarTopAtom,\n navBarWidthClosedAtom,\n navBarWidthOpenAtom,\n titleTextAtom,\n topBarHeightAtom,\n} from '../layouts/AppLayout';\n\n/**\n * When you need to want to set an initial value for an atom, you can use either:\n * - withOverrideDefaults (first add your atom to the atomsToOverride with your choice of key)\n * - your own custom wrapper that extends HydrateAtoms, like withDomainCode.\n * You'll need to pass it:\n * -- an array of tuples of atoms and their values.\n * -- i.e. [[your_atom, value], [another_atom, value2]]\n */\n\nconst atomsToOverride = {\n domainCode: domainCodeAtom,\n navBarOpen: navBarOpenAtom,\n navBarWidthOpen: navBarWidthOpenAtom,\n navBarWidthClosed: navBarWidthClosedAtom,\n titleText: titleTextAtom,\n topBarHeight: topBarHeightAtom,\n navBarTop: navBarTopAtom,\n};\n\ntype OverrideValues<T> = [WritableAtom<T, T[], void>, T][];\n\ntype AtomConfigOption = keyof typeof atomsToOverride;\n\ntype AtomConfigValue<T extends AtomConfigOption> = ReturnType<\n typeof useAtomValue<(typeof atomsToOverride)[T]>\n>;\n\ntype AtomConfig = { [K in AtomConfigOption]: AtomConfigValue<K> };\n\nexport const withAtomProvider = createHelper(() => ({ children }) => (\n <Provider>{children}</Provider>\n));\n\nexport const HydrateAtoms = <T,>({\n initialValues,\n children,\n}: PropsWithChildren<{ initialValues: OverrideValues<T> }>) => {\n useHydrateAtoms<OverrideValues<T>>(initialValues);\n return <>{children}</>;\n};\n\nexport const withOverrideDefaults = createHelper(\n (overrides: Partial<AtomConfig>) =>\n ({ children }) =>\n (\n <HydrateAtoms\n // Typescript doesn't type Object.entries well yet\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initialValues={(Object.entries(overrides) as any).map(\n <T extends AtomConfigOption>([key, value]: [T, AtomConfigValue<T>]) => [\n atomsToOverride[key],\n value,\n ]\n )}\n >\n {children}\n </HydrateAtoms>\n )\n);\n"],"names":["ExampleComponent","text","num","setNum","useState","jsxs","Fragment","jsx","Typography","Button","oldNum","Paper","NAVBAR_WIDTH_OPENED","NAVBAR_WIDTH_CLOSED","PREFIX","classes","Root","styled","theme","sharedOverrides","openedMixin","__spreadValues","closedMixin","NavDrawer","Drawer","prop","open","ContextError","AgError","__publicField","Context","createContext","defaultOverrideState","defaultOverrideActions","NavBarProvider","overrideState","overrideActions","children","setNavBarState","setOpen","useCallback","newVal","toggleOpen","prevState","__spreadProps","value","useNavBar","context","useContext","buildNavBarState","overrides","withNavBarProvider","createHelper","state","actions","SELECTED_INDICATOR_WIDTH","NavBarDarkStyledList","List","NavBarLightStyledList","NavBar","dataTestId","CssBaseline","AgDialog","isOpen","dialogTitle","maxWidth","primaryButton","secondaryButton","handleClose","areButtonsDisabled","setButtonsDisabled","Dialog","DialogTitle","DialogContent","DialogActions","_a","__async","TOP_STRIPE_HEIGHT","TITLE_BAR_HEIGHT","leftPanel","rightPanel","_b","TopBar","titleText","Box","IconButton","ForwardIcon","BackIcon","DEFAULT_PANEL_WIDTH","SidePanelDrawer","width","debugOpacity","anchor","navBarOpen","navBarWidthOpen","navBarWidthClosed","DrawerHeaderBox","SidePanel","onClose","showCloseArrow","headerBoxProps","onOpened","onClosed","PanelAwareMargins","PageContainer","Container","INITIAL_LEFT_PANEL_OPEN","INITIAL_RIGHT_PANEL_OPEN","PANEL_DEFAULTS","PageLayout","sidePanelsAreMutuallyExclusive","pageContainerProps","pageContentDataTestId","topBarDataTestId","leftPanelOpenInternal","setLeftPanelOpenInternal","rightPanelOpenInternal","setRightPanelOpenInternal","leftPanelOpenInternalPrevious","setLeftPanelOpenInternalPrevious","rightPanelOpenInternalPrevious","setRightPanelOpenInternalPrevious","includeLeftPanel","includeRightPanel","leftPanelTitleText","leftPanelContent","leftPanelFlavour","leftPanelOpen","leftPanelOnChangeOpen","leftPanelWidth","leftPanelArrowButtons","leftPanelStartOpen","leftPanelOnOpened","leftPanelOnClosed","leftPanelDataTestId","rightPanelTitleText","rightPanelContent","rightPanelFlavour","rightPanelOpen","rightPanelOnChangeOpen","rightPanelWidth","rightPanelArrowButtons","rightPanelStartOpen","rightPanelOnOpened","rightPanelOnClosed","rightPanelDataTestId","useEffect","leftPanelOpenCurrent","rightPanelOpenCurrent","handleLeftPanelChangeOpen","handleRightPanelChangeOpen","defaultSnackbarProps","defaultSaladBarProps","_event","reason","defaultEnqueueNotificationOptions","MAX_QUEUE_LENGTH","MAX_QUEUE_HIT_REPORT_INTERVAL","SALADBAR_INDEX","generateNotificationKey","previousKey","alertWithLinearProgressStyle","SaladBarProvider","shouldClose","snackbarProps","__objRest","setSaladBarState","queueRef","useRef","limitLastHitAt","limitHitCountSinceLastReport","enqueueNotification","notification","newNotification","enqueueSuccessNotification","message","options","enqueueInfoNotification","enqueueWarningNotification","enqueueErrorNotification","removeNotification","key","index","x","event","handleExit","handleExited","currentNotification","currentNotificationSnackbarProps","snackbarFinalProps","Snackbar","Alert","CircularProgress","LinearProgress","useSaladBar","withSaladBarProvider","props","atomStore","getDefaultStore","AtomProvider","store","Provider","useLibraryAtom","atom","useAtom","useSetLibraryAtom","useSetAtom","useLibraryAtomValue","offsetTop","widthOpen","widthClosed","LinksMenu","links","simpleHashCode","str","hash","i","len","chr","avatarSize","avatarColours","extractInitials","name","part","v","UserInfo","user","domainCode","Avatar","Skeleton","top","middle","Divider","topBarHeight","DEFAULT_TOP_BAR_HEIGHT","DEFAULT_NAV_BAR_WIDTH_CLOSED","DEFAULT_NAV_BAR_WIDTH_OPEN","navBarOpenAtom","navBarWidthOpenAtom","navBarWidthClosedAtom","titleTextAtom","topBarHeightAtom","navBarTopAtom","height","setNavBarOpen","prevVal","HamburgerIcon","AppLayout","initialTitleText","initialNavBarOpen","navBarDataTestId","navBarMiddle","setTitleText","navBarTop","DOMAIN_CODE_KEY","baseDomainCodeAtom","domainCodeAtom","get","_","set","newValue","DOMAIN_CODE_LABELS","getOptionLabel","DomainCodeDialog","isLoading","domainOptions","applicationName","handleLogout","setDomainCode","selectedDomainCode","setSelectedDomainCode","userHasNoDomains","userHasNoRolesInDomain","shouldLogout","handleConfirmDomainCode","handleDialogClose","errorMessage","Autocomplete","params","TextField","FormHelperText","createTheme","origTheme","alpha","atomsToOverride","withAtomProvider","HydrateAtoms","initialValues","useHydrateAtoms","withOverrideDefaults"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/components/ExampleComponent/index.tsx","../../src/components/NavBar/Styling.tsx","../../src/errors/ContextError.ts","../../src/components/NavBar/NavBarContext.tsx","../../src/components/NavBar/testWrappers.tsx","../../src/components/NavBar/NavBarDarkStyledList.tsx","../../src/components/NavBar/NavBarLightStyledList.tsx","../../src/components/NavBar/index.tsx","../../src/components/AgDialog/index.tsx","../../src/layouts/PageLayout/TopBar.tsx","../../src/layouts/PageLayout/SidePanel.tsx","../../src/layouts/PageLayout/PanelAwareMargins.tsx","../../src/layouts/PageLayout/PageContainer.tsx","../../src/layouts/PageLayout/index.tsx","../../src/layouts/AppLayout/NavBar/Styling.tsx","../../src/layouts/AppLayout/NavBar/LinksMenu.tsx","../../src/utils/simpleHashCode.ts","../../src/layouts/AppLayout/NavBar/UserInfo.tsx","../../src/layouts/AppLayout/NavBar/SettingsEtcPlaceholder.tsx","../../src/layouts/AppLayout/NavBar/NavBar.tsx","../../src/layouts/AppLayout/PageContainer.tsx","../../src/layouts/AppLayout/defaults.tsx","../../src/layouts/AppLayout/stateAtoms.ts","../../src/layouts/AppLayout/TopBar.tsx","../../src/layouts/AppLayout/AppLayout.tsx","../../src/providers/SaladBar/defaults.ts","../../src/providers/SaladBar/SaladBarContext.tsx","../../src/providers/SaladBar/useSaladBar.ts","../../src/providers/SaladBar/testWrappers.tsx","../../src/providers/Atom/AtomProvider.tsx","../../src/domainCode/hooks.tsx","../../src/domainCode/DomainCodeDialog.tsx","../../src/themes/fed21Theme.ts","../../src/themes/internalAgSystemsTheme.ts","../../src/testing/wrappers.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Button, Paper, Typography } from '@mui/material';\n\nexport interface ExampleComponentProps {\n /** Test */\n text: string;\n}\n\nexport default function ExampleComponent({ text }: ExampleComponentProps) {\n const [num, setNum] = useState(0);\n\n return (\n <>\n <Typography variant=\"h6\" color=\"inherit\" component=\"div\" sx={{ fontSize: '22px' }}>\n Hello world\n </Typography>\n\n <Typography variant=\"caption\" display=\"block\">\n <span>Just ensuring MUI is working as planned as a peer dependency. v0.0.11</span>\n </Typography>\n <Button\n variant=\"outlined\"\n onClick={() => setNum((oldNum) => oldNum + 1)}\n aria-label=\"Increment\"\n >\n Hello I am a button\n </Button>\n <p>\n This is some text: <span>{text}</span>\n </p>\n <Paper>This number will incremember when button pressed: {num}</Paper>\n </>\n );\n}\n","import { styled, CSSObject } from '@mui/material/styles';\nimport Drawer from '@mui/material/Drawer';\n\nexport const NAVBAR_WIDTH_OPENED = 330;\nexport const NAVBAR_WIDTH_CLOSED = 73;\n\nconst PREFIX = 'Navbar';\n\nexport const classes = {\n root: `${PREFIX}-root`,\n menuButton: `${PREFIX}-menuButton`,\n hide: `${PREFIX}-hide`,\n content: `${PREFIX}-content`,\n userInfoHolder: `${PREFIX}-userInfoHolder`,\n settings: `${PREFIX}-settings`,\n pieChartIcon: `${PREFIX}-pieChartIcon`,\n};\n\nexport const Root = styled('div', { name: 'NavBar' })(({ theme }) => ({\n [`&.${classes.root}`]: {\n display: 'flex',\n },\n\n [`& .${classes.menuButton}`]: {\n marginRight: 36,\n },\n\n [`& .${classes.hide}`]: {\n display: 'none',\n },\n\n [`& .${classes.content}`]: {\n flexGrow: 1,\n padding: theme.spacing(3),\n },\n\n [`& .${classes.userInfoHolder}`]: {\n height: '148px',\n marginTop: '64px',\n marginBottom: '16px',\n },\n}));\n\n// The starting point for this was the \"Mini variant drawer\" of\n// https://mui.com/components/drawers/#main-content\n\nconst sharedOverrides = (): CSSObject => ({\n position: 'absolute',\n height: '100%',\n overflowX: 'hidden',\n overflowY: 'hidden',\n color: 'white',\n backgroundColor: 'black',\n // backgroundColor: '#e8e8e8',\n});\n\nconst openedMixin = (): CSSObject => ({\n width: NAVBAR_WIDTH_OPENED,\n ...sharedOverrides(),\n});\n\nconst closedMixin = (): CSSObject => ({\n width: NAVBAR_WIDTH_CLOSED,\n ...sharedOverrides(),\n});\n\nexport const NavDrawer = styled(Drawer, {\n shouldForwardProp: (prop) => prop !== 'open',\n})(({ theme, open }) => ({\n width: open ? NAVBAR_WIDTH_OPENED : NAVBAR_WIDTH_CLOSED,\n flexShrink: 0,\n whiteSpace: 'nowrap',\n boxSizing: 'border-box',\n zIndex: theme.zIndex.drawer + 100,\n\n ...(open && {\n '& .MuiDrawer-paper': openedMixin(),\n }),\n ...(!open && {\n '& .MuiDrawer-paper': closedMixin(),\n }),\n}));\n","import { AgError } from '@australiangreens/ag-error';\n\n// Superclass for errors involving React context.\nexport class ContextError extends AgError {\n static errorName = 'ContextError';\n}\n","import { createContext, useContext, PropsWithChildren, useState, useCallback } from 'react';\nimport { ContextError } from '../../errors/ContextError';\n\nexport type NavBarState = {\n open: boolean;\n};\n\nexport type NavBarActions = {\n setOpen: (newVal: boolean) => void;\n toggleOpen: () => void;\n};\n\ntype NavBarContext = NavBarState & NavBarActions;\n\nconst Context = createContext<NavBarContext | null>(null);\n\ntype NavBarProviderProps = {\n overrideState?: Partial<NavBarState>;\n overrideActions?: Partial<NavBarActions>;\n};\n\n// Note: Must be at at this scope, otherwise useEffect will loop infinitely\nconst defaultOverrideState = {};\nconst defaultOverrideActions = {};\n\nexport const NavBarProvider = ({\n overrideState = defaultOverrideState,\n overrideActions = defaultOverrideActions,\n children,\n}: PropsWithChildren<NavBarProviderProps>) => {\n const [{ open }, setNavBarState] = useState<NavBarState>({ open: true });\n\n const setOpen = useCallback((newVal: boolean) => {\n setNavBarState({ open: newVal });\n }, []);\n\n const toggleOpen = useCallback(() => {\n setNavBarState((prevState) => ({ ...prevState, open: !prevState.open }));\n }, []);\n\n const value: NavBarContext = {\n open,\n setOpen,\n toggleOpen,\n ...overrideState,\n ...overrideActions,\n };\n\n return <Context.Provider value={value}>{children}</Context.Provider>;\n};\n\nexport const useNavBar = () => {\n const context = useContext(Context);\n\n if (context === null) {\n throw new ContextError('Error: Tried to useNavBar outside of a <NavBarProvider>');\n }\n\n return context;\n};\n","/* eslint-disable react/prop-types */\n/* eslint-disable react/display-name */\nimport { createHelper } from 'souvlaki';\n\nimport { NavBarProvider, NavBarActions, NavBarState } from './NavBarContext';\n\nexport type Builder<T> = (overrides?: Partial<T>) => T;\n\nexport const buildNavBarState: Builder<NavBarState> = (overrides = {}) => ({\n open: true,\n ...overrides,\n});\n\nexport const withNavBarProvider = createHelper(\n (state: Partial<NavBarState> = buildNavBarState(), actions: Partial<NavBarActions> = {}) =>\n ({ children }) => {\n return (\n <NavBarProvider overrideState={state} overrideActions={actions}>\n {children}\n </NavBarProvider>\n );\n }\n);\n","import { styled } from '@mui/material/styles';\nimport List, { ListProps } from '@mui/material/List';\n\nconst SELECTED_INDICATOR_WIDTH = 7;\n\nexport const NavBarDarkStyledList = styled(List)<ListProps>(({ theme }) => ({\n backgroundColor: 'black',\n color: 'white',\n\n '& .MuiListItem-root': {\n padding: 'unset',\n },\n\n '& .MuiListItemButton-root': {\n ' .MuiListItemIcon-root': {\n color: 'white',\n padding: `${SELECTED_INDICATOR_WIDTH}px`,\n },\n\n // Focus state\n '&.Mui-focusVisible': {\n backgroundColor: theme.palette.grey[700],\n },\n\n // Selected state\n '&.Mui-selected': {\n borderLeftStyle: 'solid',\n borderLeftWidth: '7px',\n borderLeftColor: theme.palette.primary.main,\n paddingLeft: `calc(${theme.spacing(2)} - ${SELECTED_INDICATOR_WIDTH}px)`,\n },\n\n // Hover state\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n },\n\n // Focus+Selected state\n '&.Mui-selected.Mui-focusVisible': {\n backgroundColor: theme.palette.grey[700],\n },\n\n // Hover+Selected state\n '&.Mui-selected:hover': {\n backgroundColor: theme.palette.primary.dark,\n },\n\n // Focus+Hover+Selected state doesn't need to be specified\n // '&.Mui-selected.Mui-focusVisible:hover': {\n // },\n },\n})) as typeof List;\n","import { styled } from '@mui/material/styles';\nimport List, { ListProps } from '@mui/material/List';\n\nconst SELECTED_INDICATOR_WIDTH = 7;\n\nexport const NavBarLightStyledList = styled(List)<ListProps>(({ theme }) => ({\n backgroundColor: '#e8e8e8',\n color: 'inherit',\n\n '& .MuiListItem-root': {\n padding: 'unset',\n },\n\n '& .MuiListItemButton-root': {\n ' .MuiListItemIcon-root': {\n color: 'inherit',\n padding: `${SELECTED_INDICATOR_WIDTH}px`,\n },\n\n // Focus state\n '&.Mui-focusVisible': {\n backgroundColor: theme.palette.grey[700],\n },\n\n // Selected state\n '&.Mui-selected': {\n borderLeftStyle: 'solid',\n borderLeftWidth: '7px',\n borderLeftColor: theme.palette.primary.main,\n paddingLeft: `calc(${theme.spacing(2)} - ${SELECTED_INDICATOR_WIDTH}px)`,\n },\n\n // Hover state\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n },\n\n // Focus+Selected state\n '&.Mui-selected.Mui-focusVisible': {\n backgroundColor: theme.palette.grey[700],\n },\n\n // Hover+Selected state\n '&.Mui-selected:hover': {\n backgroundColor: theme.palette.primary.dark,\n },\n\n // Focus+Hover+Selected state doesn't need to be specified\n // '&.Mui-selected.Mui-focusVisible:hover': {\n // },\n },\n})) as typeof List;\n","import { PropsWithChildren } from 'react';\nimport CssBaseline from '@mui/material/CssBaseline';\n\nimport { classes, Root, NavDrawer } from './Styling';\nimport { useNavBar } from './NavBarContext';\n\nexport { NAVBAR_WIDTH_OPENED, NAVBAR_WIDTH_CLOSED } from './Styling';\n\nexport type NavbarProps = {\n /** Set the datatest-id on the root element for using reactdom's getByTestId()\n * function */\n 'data-testid'?: string;\n};\n\n// TODO: Add in more common elements (or make another component) for user/organisations/logout etc?\n// TODO: Should there be two sets of 'children', one for the list and one for dialogs etc?\n\n// TODO: Rather than exporting the min and max widths, would it make more sense\n// TODO: to just share them via the context provider?\n\n/**\n * A (currently uncontrolled) styled navigation bar wth a context provider to\n * retrieve its current open/closed state. At this point in time its pretty\n * unopinionated, it just renders whatever children it is given. THe\n * NavBarDarkStyledList component can be used for consistent styling against the\n * background. We'll be changing the way we use NavBars soon anyway, so not much\n * point solidying the patterns yet.\n */\nexport default function NavBar({\n 'data-testid': dataTestId,\n children,\n}: PropsWithChildren<NavbarProps>) {\n const { open } = useNavBar();\n\n return (\n <Root className={classes.root} data-testid={dataTestId}>\n <CssBaseline />\n <NavDrawer\n variant=\"permanent\"\n anchor=\"left\"\n // We aren't using transitions, and {0} will still create an unwanted timeout\n transitionDuration={null as unknown as number}\n open={open}\n >\n {children}\n </NavDrawer>\n </Root>\n );\n}\n\nexport * from './NavBarContext';\nexport * from './testWrappers';\n\nexport * from './NavBarDarkStyledList';\nexport * from './NavBarLightStyledList';\n\n// TODO: This is a temporary fix, library clients shouldn't need this\nexport { classes as navBarClasses } from './Styling';\n","import { Breakpoint } from '@mui/material';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport { PropsWithChildren, useState } from 'react';\n\nexport type AgDialogButtonConfig = {\n text: string;\n onClick?: () => Promise<void>;\n disabled?: boolean;\n testId?: string;\n buttonColor?: 'inherit' | 'primary' | 'secondary' | 'success' | 'error' | 'info' | 'warning';\n};\n\nexport type AgDialogProps = PropsWithChildren<{\n isOpen: boolean;\n dialogTitle: string;\n maxWidth?: false | Breakpoint;\n primaryButton?: AgDialogButtonConfig;\n secondaryButton?: AgDialogButtonConfig;\n onClose: () => void;\n}>;\n\n/**\n * Standard dialog that will auto disable it's buttons while the primaryButton onClick function is pending.\n *\n */\nconst AgDialog = ({\n isOpen,\n dialogTitle,\n children,\n maxWidth,\n primaryButton,\n secondaryButton,\n onClose: handleClose,\n}: AgDialogProps) => {\n const [areButtonsDisabled, setButtonsDisabled] = useState(false);\n\n return (\n <Dialog\n open={isOpen}\n onClose={() => {\n if (areButtonsDisabled) return;\n handleClose();\n }}\n fullWidth\n maxWidth={maxWidth ?? 'xs'}\n >\n <DialogTitle>{dialogTitle}</DialogTitle>\n <DialogContent sx={{ '& > :last-child': { marginBottom: 0 } }}>{children}</DialogContent>\n <DialogActions>\n <Button\n onClick={secondaryButton?.onClick ?? handleClose}\n data-testid={secondaryButton?.testId}\n disabled={secondaryButton?.disabled || areButtonsDisabled}\n color={secondaryButton?.buttonColor}\n >\n {secondaryButton?.text ?? 'Cancel'}\n </Button>\n {primaryButton && (\n <Button\n onClick={async () => {\n setButtonsDisabled(true);\n await primaryButton.onClick?.();\n setButtonsDisabled(false);\n }}\n data-testid={primaryButton.testId}\n disabled={primaryButton.disabled || areButtonsDisabled}\n color={primaryButton?.buttonColor}\n >\n {primaryButton.text}\n </Button>\n )}\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default AgDialog;\n","import { Box, IconButton, styled, Typography } from '@mui/material';\nimport { ArrowForward as ForwardIcon, ArrowBack as BackIcon } from '@mui/icons-material';\n\nconst TOP_STRIPE_HEIGHT = 24;\nconst TITLE_BAR_HEIGHT = 64;\n\nconst PREFIX = 'TopBar';\n\ninterface PanelProps {\n open: boolean;\n width: number;\n showOpenArrow: boolean;\n\n /** Called when the arrow button is pressed (if showOpenButton is true) */\n onOpen?: () => void;\n\n showOpenButton?: boolean;\n}\n\nexport interface TopBarProps {\n titleText?: string;\n leftPanel?: PanelProps;\n rightPanel?: PanelProps;\n 'data-testid'?: string;\n}\n\nexport const classes = {\n topStripe: `${PREFIX}-topStripe`,\n titleBar: `${PREFIX}-titleBar`,\n titleSlider: `${PREFIX}-titleSlider`,\n\n titleText: `${PREFIX}-titleText`,\n leftPanelButton: `${PREFIX}-leftPanelButton`,\n rightPanelButton: `${PREFIX}-leftPanelButton`,\n};\n\ninterface RootProps {\n leftPanel?: PanelProps;\n rightPanel?: PanelProps;\n}\n\nconst Root = styled('div', {\n shouldForwardProp: (prop) => !(['leftPanel', 'rightPanel'] as Array<PropertyKey>).includes(prop),\n name: PREFIX,\n})<RootProps>(({ theme, leftPanel, rightPanel }) => ({\n width: '100%',\n\n [`& .${classes.topStripe}`]: {\n width: '100%',\n height: `${TOP_STRIPE_HEIGHT}px`,\n backgroundColor: theme.palette.primary.main,\n },\n\n [`& .${classes.titleBar}`]: {\n backgroundColor: theme.palette.primary.light,\n height: `${TITLE_BAR_HEIGHT}px`,\n padding: theme.spacing(0, 3),\n width: '100%',\n },\n\n [`& .${classes.titleSlider}`]: {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n color: 'white',\n\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n\n [`& .${classes.leftPanelButton}`]: {\n marginRight: theme.spacing(2),\n flexGrow: 0,\n },\n\n [`& .${classes.titleText}`]: {\n flexGrow: 1,\n },\n\n [`& .${classes.rightPanelButton}`]: {\n flexGrow: 0,\n },\n\n ...(leftPanel?.open && {\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.enteringScreen,\n }),\n marginLeft: `${leftPanel?.width ?? 0}px`,\n }),\n\n ...(rightPanel?.open && {\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.enteringScreen,\n }),\n marginRight: `${rightPanel?.width ?? 0}px`,\n }),\n },\n}));\n\n/**\n * Goes at the top of every page. Wasn't feeling creative in naming it.\n *\n * This differs from the typical appbar with a toolbar used in most MUI apps in\n * that it has to interact with a sliding side panel that is not the main\n * navbar.\n */\nexport default function TopBar({\n titleText = '',\n leftPanel,\n rightPanel,\n 'data-testid': dataTestId,\n}: TopBarProps) {\n return (\n <Root leftPanel={leftPanel} rightPanel={rightPanel} data-testid={dataTestId}>\n <div className={classes.topStripe} />\n <div className={classes.titleBar}>\n <Box className={classes.titleSlider}>\n {leftPanel !== undefined && !leftPanel.open && leftPanel.showOpenArrow && (\n <IconButton\n className={classes.leftPanelButton}\n color=\"inherit\"\n aria-label=\"Open left side panel\"\n onClick={leftPanel?.onOpen}\n edge=\"start\"\n size=\"large\"\n >\n {' '}\n <ForwardIcon />\n </IconButton>\n )}\n\n <Typography className={classes.titleText} variant=\"h6\" noWrap>\n {titleText}\n </Typography>\n\n {rightPanel !== undefined && !rightPanel.open && rightPanel.showOpenArrow && (\n <IconButton\n className={classes.rightPanelButton}\n color=\"inherit\"\n aria-label=\"Open right side panel\"\n onClick={rightPanel?.onOpen}\n edge=\"end\"\n size=\"large\"\n >\n {' '}\n <BackIcon />\n </IconButton>\n )}\n </Box>\n </div>\n </Root>\n );\n}\n","import { PropsWithChildren } from 'react';\nimport {Box, BoxProps, Typography, styled, Drawer, DrawerProps, IconButton} from '@mui/material';\nimport {ArrowBack as BackIcon, ArrowForward as ForwardIcon} from '@mui/icons-material';\n\nexport const DEFAULT_PANEL_WIDTH = 400;\n\ninterface SidePanelDrawerProps extends DrawerProps {\n anchor: 'left' | 'right';\n width?: number;\n debugOpacity?: boolean;\n navBarOpen: boolean;\n navBarWidthOpen: number;\n navBarWidthClosed: number;\n}\n\nconst SidePanelDrawer = styled(Drawer, {\n shouldForwardProp: (prop) =>\n // Note we do want anchor to be forwarded to the Drawer component\n !(\n [\n 'width',\n 'debug',\n 'debugOpacity',\n 'navBarOpen',\n 'navBarWidthOpen',\n 'navBarWidthClosed',\n ] as Array<PropertyKey>\n ).includes(prop),\n name: 'SidePanelDrawer',\n})<SidePanelDrawerProps>(\n ({ width, debugOpacity = false, anchor, navBarOpen, navBarWidthOpen, navBarWidthClosed }) => ({\n width,\n\n '& .MuiDrawer-paper': {\n position: 'absolute',\n width,\n boxSizing: 'border-box',\n border: 'unset',\n boxShadow:\n '0px 4px 5px rgba(0, 0, 0, 0.14), 0px 1px 10px rgba(0, 0, 0, 0.12), 0px 2px 4px rgba(0, 0, 0, 0.2)',\n\n ...(debugOpacity && {\n opacity: '50%',\n }),\n\n ...(anchor === 'left' && {\n marginLeft: `${navBarWidthClosed}px`,\n ...(navBarOpen && {\n marginLeft: `${navBarWidthOpen}px`,\n }),\n }),\n },\n })\n);\n\ninterface DrawerHeaderBoxProps {\n anchor: 'left' | 'right';\n}\n\nconst DrawerHeaderBox = styled(Box, {\n shouldForwardProp: (prop) => !(['anchor'] as Array<PropertyKey>).includes(prop),\n})<DrawerHeaderBoxProps>(({ theme, anchor }) => ({\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(2),\n ...theme.mixins.toolbar,\n justifyContent: anchor === 'left' ? 'space-between' : 'flex-start',\n backgroundColor: theme.palette.primary.light,\n height: '88px',\n\n '&,*': {\n color: 'white',\n },\n\n ' .MuiTypography-root': {\n fontSize: '22px',\n },\n\n ' .MuiButtonBase-root': {\n marginRight: anchor === 'right' ? theme.spacing(2) : 0,\n },\n}));\n\ntype SidePanelProps = PropsWithChildren<{\n open: boolean;\n anchor?: 'left' | 'right';\n onClose?: React.MouseEventHandler<HTMLElement>;\n titleText?: string;\n width?: number;\n showCloseArrow?: boolean;\n debugOpacity?: boolean;\n headerBoxProps?: BoxProps;\n onOpened?: () => void;\n onClosed?: () => void;\n 'data-testid'?: string;\n navBarOpen?: boolean;\n navBarWidthOpen?: number;\n navBarWidthClosed?: number;\n}>;\n\n/**\n * The SidePanel is designed to be used along with the TopBar component for a\n * consistent look and feel.\n */\nexport default function SidePanel({\n children,\n anchor = 'left',\n open,\n onClose = () => {},\n titleText = '',\n width = DEFAULT_PANEL_WIDTH,\n showCloseArrow = true,\n debugOpacity = false,\n headerBoxProps = {},\n onOpened,\n onClosed,\n 'data-testid': dataTestId,\n navBarOpen = false,\n navBarWidthOpen = 0,\n navBarWidthClosed = 0,\n}: SidePanelProps) {\n return (\n <SidePanelDrawer\n SlideProps={{\n onEntered: () => onOpened?.(),\n onExited: () => onClosed?.(),\n }}\n variant=\"persistent\"\n anchor={anchor}\n open={open}\n width={width}\n debugOpacity={debugOpacity}\n data-testid={dataTestId}\n navBarOpen={navBarOpen}\n navBarWidthOpen={navBarWidthOpen}\n navBarWidthClosed={navBarWidthClosed}\n >\n <DrawerHeaderBox anchor={anchor} {...headerBoxProps}>\n {/* Might be a cleaner way to do this, but it does the job */}\n {anchor === 'left' ? (\n <>\n <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n {titleText}\n </Typography>\n\n {showCloseArrow && (\n <IconButton onClick={onClose} size=\"large\" aria-label=\"Close left side panel\">\n <BackIcon data-testid=\"arrowbackicon\" />{' '}\n </IconButton>\n )}\n </>\n ) : (\n <>\n {showCloseArrow && (\n <IconButton onClick={onClose} size=\"large\" aria-label=\"Close right side panel\">\n <ForwardIcon />{' '}\n </IconButton>\n )}\n\n <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n {titleText}\n </Typography>\n </>\n )}\n </DrawerHeaderBox>\n {children}\n </SidePanelDrawer>\n );\n}\n","import { styled } from '@mui/material';\n\ninterface PanelProps {\n width: number;\n open: boolean;\n}\n\ninterface PanelAwareMarginsProps {\n /** If the leftPanel prop is omitted but a left panel is still in use on the\n * page, it will slide over the top instead of the default pushing */\n leftPanel?: PanelProps;\n\n /** If the rightPanel prop is omitted but a right panel is still in use on the\n * page, it will slide over the top instead of the default pushing */\n rightPanel?: PanelProps;\n}\n\n/** With the optional leftPanel and rightPanel props providing state and width,\n * the children of of the PanelAwareMargins will looks like they is pushed aside\n * by the panels by transitioning the margins. */\nconst PanelAwareMargins = styled('div', {\n shouldForwardProp: (prop) => !(['leftPanel', 'rightPanel'] as Array<PropertyKey>).includes(prop),\n name: 'PanelAwareMargins',\n})<PanelAwareMarginsProps>(({ theme, leftPanel, rightPanel }) => ({\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n\n ...(leftPanel?.open && {\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.enteringScreen,\n }),\n marginLeft: `${leftPanel?.width ?? 0}px`,\n }),\n ...(rightPanel?.open && {\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.enteringScreen,\n }),\n marginRight: `${rightPanel?.width ?? 0}px`,\n }),\n}));\n\nexport default PanelAwareMargins;\n","import { styled, Container } from '@mui/material';\n\n/** Just a simple styled container applying our spacings*/\nconst PageContainer = styled(Container, {\n name: 'PageContainer',\n})(({ theme }) => ({\n // Horizontal padding comes from the Container's gutter\n paddingTop: theme.spacing(3),\n paddingBottom: theme.spacing(3),\n}));\n\nexport default PageContainer;\n","import { ComponentProps, PropsWithChildren, ReactNode, useEffect, useState } from 'react';\nimport { Box } from '@mui/material';\n\nimport TopBar from './TopBar';\nimport SidePanel, { DEFAULT_PANEL_WIDTH } from './SidePanel';\nimport PanelAwareMargins from './PanelAwareMargins';\nimport PageContainer from './PageContainer';\n\nconst INITIAL_LEFT_PANEL_OPEN = false;\nconst INITIAL_RIGHT_PANEL_OPEN = false;\n\nconst PANEL_DEFAULTS = {\n titleText: '',\n flavour: 'push',\n width: DEFAULT_PANEL_WIDTH,\n arrowButtons: 'both',\n startOpen: false,\n open: undefined,\n onChangeOpen: undefined,\n content: <></>,\n onOpened: undefined,\n onClosed: undefined,\n dataTestId: undefined,\n};\n\nexport interface SidePanelProps {\n titleText?: string;\n content?: ReactNode;\n flavour?: 'push' | 'overlay';\n arrowButtons?: 'open' | 'close' | 'both' | 'none';\n width?: number;\n startOpen?: boolean;\n\n /** Use this and onChangeOpen if you want to use component as a controlled component */\n open?: boolean;\n onChangeOpen?: (open: boolean) => void;\n\n /** Called when the sliding transition to open has finished */\n onOpened?: () => void;\n\n /** Called when the sliding transition to open has finished */\n onClosed?: () => void;\n\n dataTestId?: string;\n}\n\ninterface BasePageLayoutProps {\n titleText?: string;\n\n leftPanel?: SidePanelProps;\n rightPanel?: SidePanelProps;\n\n /** This will only have an effect for panels whose state is not controlled by\n * parent */\n sidePanelsAreMutuallyExclusive?: boolean;\n\n /** Temporary, get rid of later */\n debugOpacity?: boolean;\n\n /** Props applied to the PageContainer component, which is a styled MUI Container */\n pageContainerProps?: ComponentProps<typeof PageContainer>;\n\n topBarDataTestId?: string;\n pageContentDataTestId?: string;\n}\n\ninterface PageLayoutWithNavBarProps extends BasePageLayoutProps {\n /** Only used by side panels for alignment purposes */\n navBarOpen: boolean;\n /** Only used by side panels for alignment purposes */\n navBarWidthOpen: number;\n /** Only used by side panels for alignment purposes */\n navBarWidthClosed: number;\n}\n\ninterface PagelayoutWithoutNavBarProps extends BasePageLayoutProps {\n navBarOpen?: never;\n navBarWidthOpen?: never;\n navBarWidthClosed?: never;\n}\n\nexport type PageLayoutProps = PropsWithChildren<\n PageLayoutWithNavBarProps | PagelayoutWithoutNavBarProps\n>;\n\n/**\n * To be used by all Page components in our apps to use a standard Top Bar, Left\n * Panel, Right Panel and Page Contents within the contents for a uniform look.\n *\n * At present it is somewhat crudely adapted from the code used in the\n * ListManager app. It _assumes_ NavBar component on the left.\n *\n * It is in the process of being tidied up, and as such is very much in flux.\n * The end goal is to unify the left most NavBar component with the PageLayout,\n * but this has to be done incrementally.\n */\nexport default function PageLayout({\n children,\n titleText = '',\n leftPanel,\n rightPanel,\n sidePanelsAreMutuallyExclusive = true,\n debugOpacity = false,\n pageContainerProps,\n pageContentDataTestId,\n topBarDataTestId,\n navBarOpen,\n navBarWidthOpen,\n navBarWidthClosed,\n}: PageLayoutProps) {\n const [leftPanelOpenInternal, setLeftPanelOpenInternal] = useState(INITIAL_LEFT_PANEL_OPEN);\n const [rightPanelOpenInternal, setRightPanelOpenInternal] = useState(INITIAL_RIGHT_PANEL_OPEN);\n const [leftPanelOpenInternalPrevious, setLeftPanelOpenInternalPrevious] =\n useState(INITIAL_LEFT_PANEL_OPEN);\n const [rightPanelOpenInternalPrevious, setRightPanelOpenInternalPrevious] =\n useState(INITIAL_RIGHT_PANEL_OPEN);\n\n const includeLeftPanel = leftPanel !== undefined;\n const includeRightPanel = rightPanel !== undefined;\n\n const {\n titleText: leftPanelTitleText,\n content: leftPanelContent,\n flavour: leftPanelFlavour,\n open: leftPanelOpen,\n onChangeOpen: leftPanelOnChangeOpen,\n width: leftPanelWidth,\n arrowButtons: leftPanelArrowButtons,\n startOpen: leftPanelStartOpen,\n onOpened: leftPanelOnOpened,\n onClosed: leftPanelOnClosed,\n dataTestId: leftPanelDataTestId,\n } = leftPanel ? { ...PANEL_DEFAULTS, ...leftPanel } : { ...PANEL_DEFAULTS };\n\n const {\n titleText: rightPanelTitleText,\n content: rightPanelContent,\n flavour: rightPanelFlavour,\n open: rightPanelOpen,\n onChangeOpen: rightPanelOnChangeOpen,\n width: rightPanelWidth,\n arrowButtons: rightPanelArrowButtons,\n startOpen: rightPanelStartOpen,\n onOpened: rightPanelOnOpened,\n onClosed: rightPanelOnClosed,\n dataTestId: rightPanelDataTestId,\n } = rightPanel ? { ...PANEL_DEFAULTS, ...rightPanel } : { ...PANEL_DEFAULTS };\n\n useEffect(() => {\n if (leftPanelStartOpen !== INITIAL_LEFT_PANEL_OPEN) {\n setLeftPanelOpenInternal(leftPanelStartOpen);\n setLeftPanelOpenInternalPrevious(leftPanelStartOpen);\n }\n }, [leftPanelStartOpen]);\n\n useEffect(() => {\n if (rightPanelStartOpen !== INITIAL_RIGHT_PANEL_OPEN) {\n setRightPanelOpenInternal(rightPanelStartOpen);\n setRightPanelOpenInternalPrevious(rightPanelStartOpen);\n }\n }, [rightPanelStartOpen]);\n\n const leftPanelOpenCurrent = leftPanelOpen === undefined ? leftPanelOpenInternal : leftPanelOpen;\n\n const rightPanelOpenCurrent =\n rightPanelOpen === undefined ? rightPanelOpenInternal : rightPanelOpen;\n\n const handleLeftPanelChangeOpen = (open: boolean) => {\n if (leftPanelOpen === undefined) {\n // If not in controlled mode, update the internal state\n setLeftPanelOpenInternal(open);\n\n if (sidePanelsAreMutuallyExclusive && includeRightPanel) {\n if (open) {\n setRightPanelOpenInternal(false);\n setRightPanelOpenInternalPrevious(rightPanelOpenInternal);\n } else {\n setRightPanelOpenInternal(rightPanelOpenInternalPrevious);\n }\n }\n }\n // Likewise, if callback provided, call it\n if (leftPanelOnChangeOpen) leftPanelOnChangeOpen(open);\n };\n\n const handleRightPanelChangeOpen = (open: boolean) => {\n if (rightPanelOpen === undefined) {\n setRightPanelOpenInternal(open);\n if (sidePanelsAreMutuallyExclusive && includeLeftPanel) {\n if (open) {\n setLeftPanelOpenInternal(false);\n setLeftPanelOpenInternalPrevious(leftPanelOpenInternal);\n } else {\n setLeftPanelOpenInternal(leftPanelOpenInternalPrevious);\n }\n }\n }\n if (rightPanelOnChangeOpen) rightPanelOnChangeOpen(open);\n };\n\n return (\n <Box>\n {includeLeftPanel && (\n <SidePanel\n data-testid={leftPanelDataTestId}\n anchor=\"left\"\n open={leftPanelOpenCurrent}\n onClose={() => handleLeftPanelChangeOpen(false)}\n width={leftPanelWidth}\n titleText={leftPanelTitleText}\n debugOpacity={debugOpacity}\n showCloseArrow={leftPanelArrowButtons === 'both' || leftPanelArrowButtons === 'close'}\n onOpened={leftPanelOnOpened}\n onClosed={leftPanelOnClosed}\n navBarOpen={navBarOpen}\n navBarWidthOpen={navBarWidthOpen}\n navBarWidthClosed={navBarWidthClosed}\n >\n {leftPanelContent}\n </SidePanel>\n )}\n\n {includeRightPanel && (\n <SidePanel\n data-testid={rightPanelDataTestId}\n anchor=\"right\"\n open={rightPanelOpenCurrent}\n onClose={() => handleRightPanelChangeOpen(false)}\n width={rightPanelWidth}\n titleText={rightPanelTitleText}\n debugOpacity={debugOpacity}\n showCloseArrow={rightPanelArrowButtons === 'both' || rightPanelArrowButtons === 'close'}\n onOpened={rightPanelOnOpened}\n onClosed={rightPanelOnClosed}\n navBarOpen={navBarOpen}\n navBarWidthOpen={navBarWidthOpen}\n navBarWidthClosed={navBarWidthClosed}\n >\n {rightPanelContent}\n </SidePanel>\n )}\n\n <TopBar\n titleText={titleText}\n data-testid={topBarDataTestId}\n {...(includeLeftPanel && leftPanelFlavour === 'push'\n ? {\n leftPanel: {\n open: leftPanelOpenCurrent,\n width: leftPanelWidth,\n onOpen: () => handleLeftPanelChangeOpen(true),\n showOpenArrow: leftPanelArrowButtons === 'both' || leftPanelArrowButtons === 'open',\n },\n }\n : {})}\n {...(includeRightPanel && rightPanelFlavour === 'push'\n ? {\n rightPanel: {\n open: rightPanelOpenCurrent,\n width: rightPanelWidth,\n onOpen: () => handleRightPanelChangeOpen(true),\n showOpenArrow:\n rightPanelArrowButtons === 'both' || rightPanelArrowButtons === 'open',\n },\n }\n : {})}\n />\n\n <PanelAwareMargins\n {...(leftPanelFlavour === 'push'\n ? {\n leftPanel: {\n open: leftPanelOpenCurrent,\n width: leftPanelWidth,\n },\n }\n : {})}\n {...(rightPanelFlavour === 'push'\n ? {\n rightPanel: {\n open: rightPanelOpenCurrent,\n width: rightPanelWidth,\n },\n }\n : {})}\n >\n <PageContainer data-testid={pageContentDataTestId} {...pageContainerProps}>\n {children}\n </PageContainer>\n </PanelAwareMargins>\n </Box>\n );\n}\n","import { styled, CSSObject, Theme } from '@mui/material/styles';\nimport Drawer from '@mui/material/Drawer';\n\nconst PREFIX = 'Navbar';\n\nexport const classes = {\n root: `${PREFIX}-root`,\n menuButton: `${PREFIX}-menuButton`,\n hide: `${PREFIX}-hide`,\n content: `${PREFIX}-content`,\n // userInfoHolder: `${PREFIX}-userInfoHolder`,\n // settings: `${PREFIX}-settings`,\n // pieChartIcon: `${PREFIX}-pieChartIcon`,\n};\n\nexport const Root = styled('div', { name: 'NavBar' })(({ theme }) => ({\n [`&.${classes.root}`]: {\n display: 'flex',\n },\n\n [`& .${classes.menuButton}`]: {\n marginRight: 36,\n },\n\n [`& .${classes.hide}`]: {\n display: 'none',\n },\n\n [`& .${classes.content}`]: {\n flexGrow: 1,\n padding: theme.spacing(3),\n },\n\n // [`& .${classes.userInfoHolder}`]: {\n // height: '148px',\n // marginTop: '64px',\n // marginBottom: '16px',\n // },\n}));\n\nconst sharedOverrides = (theme: Theme, offsetTop: number): CSSObject => ({\n height: `calc(100vh - ${offsetTop}px)`,\n top: offsetTop,\n overflowX: 'hidden',\n overflowY: 'hidden',\n color: 'inherit',\n backgroundColor: theme?.navBar?.backgroundColor ?? 'white', // Provide default so tests don't need to wrap theme provider\n});\n\nconst openedMixin = (theme: Theme, width: number, offsetTop: number): CSSObject => ({\n width,\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n ...sharedOverrides(theme, offsetTop),\n});\n\nconst closedMixin = (theme: Theme, width: number, offsetTop: number): CSSObject => ({\n width,\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n overflowX: 'hidden',\n\n ...sharedOverrides(theme, offsetTop),\n});\n\ninterface NavDrawerProps {\n open: boolean;\n widthOpen: number;\n widthClosed: number;\n offsetTop: number;\n}\n\nexport const NavDrawer = styled(Drawer, {\n shouldForwardProp: (prop) =>\n !['open', 'widthOpen', 'widthClosed', 'offsetTop'].includes(prop as string),\n})<NavDrawerProps>(({ theme, open, widthOpen, widthClosed, offsetTop }) => ({\n flexShrink: 0,\n whiteSpace: 'nowrap',\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n\n ...(open && {\n ...openedMixin(theme, widthOpen, offsetTop),\n '& .MuiDrawer-paper': openedMixin(theme, widthOpen, offsetTop),\n }),\n ...(!open && {\n ...closedMixin(theme, widthClosed, offsetTop),\n '& .MuiDrawer-paper': closedMixin(theme, widthClosed, offsetTop),\n }),\n}));\n","// import { Link as RouterLink } from 'react-router-dom';\n\nimport { NavBarLink } from './types';\n\nexport interface LinksMenuProps {\n links: NavBarLink[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function LinksMenu({ links }: LinksMenuProps) {\n return <div>LinksMenu not implemented yet</div>;\n}\n","// https://stackoverflow.com/a/8831937\nexport function simpleHashCode(str: string) {\n let hash = 0;\n for (let i = 0, len = str.length; i < len; i++) {\n const chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n}\n","import { Box, Avatar, Typography, Skeleton } from '@mui/material';\nimport { useAtomValue } from 'jotai';\n\nimport { DomainCode } from '../../../domainCode';\nimport { simpleHashCode } from '../../../utils';\nimport { User } from './types';\nimport { navBarWidthClosedAtom, navBarWidthOpenAtom } from '..';\n\n// These all have good contrast against our typical navbar background colour\nconst avatarColours = ['#A62A21', '#7e3794', '#0B51C1', '#3A6024', '#A81563', '#B3003C'];\n\nconst extractInitials = (name: string) =>\n name\n .split(/\\s/)\n .map((part) => part.substring(0, 1).toUpperCase())\n .filter((v) => !!v)\n .slice(0, 2)\n .join('')\n .toUpperCase();\n\nexport interface UserInfoProps {\n user?: User;\n domainCode?: DomainCode;\n open: boolean;\n}\n\n/**\n * If user has a defined name and a valid url for picture, the picture will for\n * the avatar image.\n *\n * If there is a defined name but the picture is invalid or undefined, the\n * intials will be used to generate the avatar image. The colour will be random\n * for different names, but always the same for the same name.\n *\n * If user is undefined or the name is undefined, a generic empty avatar image\n * will be displayed.\n */\nexport default function UserInfo({ user, domainCode, open }: UserInfoProps) {\n // ! Using these hooks is a temporary hack while working on [EVNT-19]\n // ! In [EVNT-30] we can add in proper transitions involving percentage widths instead\n const navBarWidthClosed = useAtomValue(navBarWidthClosedAtom);\n const navBarWidthOpen = useAtomValue(navBarWidthOpenAtom);\n\n return (\n <Box sx={{ paddingTop: 3 }}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n flexDirection: 'column',\n }}\n >\n {open ? (\n <>\n <Box\n sx={{\n width: `${navBarWidthOpen * 0.33}px`,\n aspectRatio: 1,\n marginBottom: 1,\n }}\n >\n {user?.name ? (\n <Avatar\n src={user?.picture}\n sx={{\n width: '100%',\n height: '100%',\n bgcolor:\n avatarColours[Math.abs(simpleHashCode(user.name)) % avatarColours.length],\n }}\n >\n {extractInitials(user.name)}\n </Avatar>\n ) : (\n <Avatar sx={{ width: '100%', height: '100%' }} />\n )}\n </Box>\n {user?.name ? (\n <Typography>{user.name}</Typography>\n ) : (\n <Skeleton animation={false} width={'50%'} />\n )}\n {domainCode ? (\n <Typography>{domainCode.toUpperCase()}</Typography>\n ) : (\n <Skeleton animation={false} width={'25%'} />\n )}\n </>\n ) : (\n <Box sx={{ width: `${navBarWidthClosed * 0.5}px`, aspectRatio: 1, marginBottom: 1 }}>\n {user?.name ? (\n <Avatar\n src={user?.picture}\n sx={{\n width: '100%',\n height: '100%',\n bgcolor:\n avatarColours[Math.abs(simpleHashCode(user.name)) % avatarColours.length],\n }}\n >\n {extractInitials(user.name)}\n </Avatar>\n ) : (\n <Avatar sx={{ width: '100%', height: '100%' }} />\n )}\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n","import { useState } from 'react';\nimport {\n Dashboard as SwitchToIcon, // TODO: The SpaceDashboard icon in figma design is not in MUI 5.11.0\n Settings as SettingsIcon,\n Logout as LogoutIcon,\n ExpandLess as ExpandLessIcon,\n ExpandMore as ExpandMoreIcon,\n} from '@mui/icons-material';\nimport { Collapse, List, ListItemButton, ListItemIcon, ListItemText } from '@mui/material';\n\ninterface SettingsEtcPlaceholderProps {\n navBarOpen: boolean;\n}\n\nexport default function SettingsEtcPlaceholder({ navBarOpen }: SettingsEtcPlaceholderProps) {\n const [menuOpen, setMenuOpen] = useState(false);\n\n return (\n <List>\n <ListItemButton onClick={() => setMenuOpen((prev: boolean) => !prev)}>\n <ListItemIcon>\n <SwitchToIcon />\n </ListItemIcon>\n <ListItemText primary=\"Switch to ...\" />\n {menuOpen && navBarOpen ? <ExpandLessIcon /> : <ExpandMoreIcon />}\n </ListItemButton>\n\n <Collapse in={menuOpen && navBarOpen} timeout=\"auto\" unmountOnExit>\n <List component=\"div\" disablePadding>\n <ListItemButton sx={{ pl: 2 }}>\n <ListItemText primary=\"1. Something\" inset />\n </ListItemButton>\n <ListItemButton sx={{ pl: 2 }}>\n <ListItemText primary=\"2. Something else\" inset />\n </ListItemButton>\n <ListItemButton sx={{ pl: 2 }}>\n <ListItemText primary=\"3. Puppies!\" inset />\n </ListItemButton>\n </List>\n </Collapse>\n\n <ListItemButton>\n <ListItemIcon>\n <SettingsIcon />\n </ListItemIcon>\n <ListItemText primary=\"Settings\" />\n </ListItemButton>\n\n <ListItemButton>\n <ListItemIcon>\n <LogoutIcon />\n </ListItemIcon>\n <ListItemText primary=\"Log out\" />\n </ListItemButton>\n </List>\n );\n}\n","import { ReactNode } from 'react';\nimport { Divider, Box } from '@mui/material';\n\nimport { NavBarLink, User } from './types';\nimport { classes, Root, NavDrawer } from './Styling';\nimport { LinksMenu } from './LinksMenu';\nimport { DomainCode } from '../../../domainCode';\nimport UserInfo from './UserInfo';\nimport SettingsEtcPlaceholder from './SettingsEtcPlaceholder';\n\nexport interface NavBarProps {\n open: boolean;\n\n offsetTop?: number;\n\n widthOpen: number;\n\n widthClosed: number;\n\n /** Set the datatest-id on the root element for using reactdom's getByTestId()\n * function */\n 'data-testid'?: string;\n\n /** The contents to be displayed at the top, specified to the current page */\n top?: ReactNode;\n\n /** Display be below the top section, always the same regardless of page. Can\n * be provided either as a node directly, or an array of objects that will be\n * used to generate a standard navbar menu.\n *\n * @example\n *\n * ```\n * // As a ReactNode\n * <NavBar open: {open} middle={<TheContent}/>\n * ```\n *\n * @example\n *\n * ```\n * // As an Array\n * <NavBar open: {open} middle={[\n * {label: 'foo', destPathname: '/foo', icon: {FooIcon}},\n * {label: 'bar', destPathname: '/bar', icon: {BarIcon}},\n * ]}/>\n * ```\n */\n middle: ReactNode | NavBarLink[];\n\n /** User information displayed at bottom of navabar when it is open*/\n user?: User;\n\n /** Displayed below the user information when available */\n domainCode?: DomainCode;\n}\n\n/**\n * A styled navigation bar. At this point in time its pretty unopinionated, it\n * just renders whatever children it is given. The NavBarLightStyledList\n * component can be used for consistent styling against the background.\n */\nexport default function NavBar({\n open,\n offsetTop = 0,\n widthOpen,\n widthClosed,\n 'data-testid': dataTestId,\n top,\n middle,\n user,\n domainCode,\n}: NavBarProps) {\n return (\n <Root className={classes.root} data-testid={dataTestId}>\n <NavDrawer\n variant=\"permanent\"\n anchor=\"left\"\n open={open}\n widthOpen={widthOpen}\n widthClosed={widthClosed}\n offsetTop={offsetTop}\n PaperProps={{\n // https://github.com/mui/material-ui/issues/27703\n // This isn't fixed in the version we are using at time of writing\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n component: 'nav',\n }}\n >\n {top && (\n <Box sx={{ flex: '0 0 auto' }}>\n {top}\n <Divider variant=\"middle\" />\n </Box>\n )}\n\n <Box sx={{ flex: '1 0 auto' }}>\n {/* middle is either a ReactNode or an array of NavBarLink objects */}\n {Array.isArray(middle) ? <LinksMenu links={middle as unknown as NavBarLink[]} /> : middle}\n </Box>\n\n <Box sx={{ flex: '0 0 auto' }}>\n <Divider variant=\"middle\" />\n <UserInfo user={user} domainCode={domainCode} open={open} />\n <SettingsEtcPlaceholder navBarOpen={open} />\n </Box>\n </NavDrawer>\n </Root>\n );\n}\n\n// TODO: This is a temporary fix, library clients shouldn't need this\n// export { classes as navBarClasses } from './Styling';\n","import { PropsWithChildren } from 'react';\nimport { Container, Box } from '@mui/material';\n\n// const NavBarAwareMargins = styled('div', {\n// shouldForwardProp: (prop) => !(['leftPanel', 'rightPanel'] as Array<PropertyKey>).includes(prop),\n// name: 'PanelAwareMargins',\n// })<PanelAwareMarginsProps>(({ theme, leftPanel, rightPanel }) => ({\n// transition: theme.transitions.create('margin', {\n// easing: theme.transitions.easing.sharp,\n// duration: theme.transitions.duration.leavingScreen,\n// }),\n\n// ...(leftPanel?.open && {\n// transition: theme.transitions.create('margin', {\n// easing: theme.transitions.easing.easeOut,\n// duration: theme.transitions.duration.enteringScreen,\n// }),\n// marginLeft: `${leftPanel?.width ?? 0}px`,\n// }),\n// ...(rightPanel?.open && {\n// transition: theme.transitions.create('margin', {\n// easing: theme.transitions.easing.easeOut,\n// duration: theme.transitions.duration.enteringScreen,\n// }),\n// marginRight: `${rightPanel?.width ?? 0}px`,\n// }),\n// }));\n\ninterface PageContainerProps {\n topBarHeight: number;\n}\n\nfunction PageContainer({ children, topBarHeight }: PropsWithChildren<PageContainerProps>) {\n return (\n <Box\n sx={{\n overflow: 'auto',\n height: `calc(100vh - ${topBarHeight}px)`,\n scrollbarGutter: 'stable',\n // scrollbarGutter: 'stable both-edges',\n flexGrow: 1,\n }}\n >\n <Container\n component=\"main\"\n id=\"main-content\"\n sx={{ paddingTop: 3, paddingBottom: 3, flexGrow: 1 }}\n >\n {children}\n </Container>\n </Box>\n );\n}\n\nexport default PageContainer;\n","// export const SIDE_PANEL_DEFAULTS = {\n// titleText: '',\n// flavour: 'push',\n// width: 400,\n// arrowButtons: 'both',\n// startOpen: false,\n// open: undefined,\n// onChangeOpen: undefined,\n// content: <></>,\n// onOpened: undefined,\n// onClosed: undefined,\n// dataTestId: undefined,\n// };\n\n// export const INITIAL_LEFT_PANEL_OPEN = false;\n// export const INITIAL_RIGHT_PANEL_OPEN = false;\n\nexport const DEFAULT_INITIAL_NAV_BAR_OPEN = true;\n\nexport const DEFAULT_TOP_BAR_HEIGHT = 64;\nexport const DEFAULT_NAV_BAR_WIDTH_CLOSED = 64;\nexport const DEFAULT_NAV_BAR_WIDTH_OPEN = 256;\n","import { ReactNode } from 'react';\nimport { atom } from 'jotai';\n\nimport {\n DEFAULT_TOP_BAR_HEIGHT,\n DEFAULT_NAV_BAR_WIDTH_OPEN,\n DEFAULT_NAV_BAR_WIDTH_CLOSED,\n} from './defaults';\n\nexport const navBarOpenAtom = atom(true);\n\nexport const navBarWidthOpenAtom = atom(DEFAULT_NAV_BAR_WIDTH_OPEN);\n\nexport const navBarWidthClosedAtom = atom(DEFAULT_NAV_BAR_WIDTH_CLOSED);\n\nexport const titleTextAtom = atom('');\n\nexport const topBarHeightAtom = atom(DEFAULT_TOP_BAR_HEIGHT);\n\n// TODO: Would navBarTop be handled better with a portal?\nexport const navBarTopAtom = atom<ReactNode>(undefined);\n","import { ViewHeadline as HamburgerIcon } from '@mui/icons-material';\nimport { IconButton, Paper, Typography } from '@mui/material';\n\nimport { useSetAtom } from 'jotai';\nimport { navBarOpenAtom } from './stateAtoms';\n\nconst PREFIX = 'TopBar';\n\nexport interface TopBarProps {\n titleText?: string;\n height: number;\n 'data-testid'?: string;\n}\n\nexport const classes = {\n titleText: `${PREFIX}-titleText`,\n};\n\n/**\n * Top bar of every page, above the content. Works a bit like MUI's AppBar but\n * the scroll bar will not appear for the whole page, instead just the page\n * content\n */\nexport default function TopBar({ titleText = '', height, 'data-testid': dataTestId }: TopBarProps) {\n const setNavBarOpen = useSetAtom(navBarOpenAtom);\n\n const toggleNavBar = () => setNavBarOpen((prevVal) => !prevVal);\n\n return (\n <header data-testid={dataTestId}>\n <Paper\n square\n elevation={0}\n sx={{\n width: '100%',\n position: 'sticky',\n color: 'primary.contrastText',\n backgroundColor: 'primary.main',\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexShrink: 0,\n height,\n }}\n >\n <IconButton size=\"medium\" color=\"inherit\" sx={{ padding: 1.5 }} onClick={toggleNavBar}>\n <HamburgerIcon fontSize=\"medium\" />\n </IconButton>\n <Typography className={classes.titleText} variant=\"h6\">\n {titleText}\n </Typography>\n </Paper>\n </header>\n );\n}\n","import { Box, CssBaseline } from '@mui/material';\nimport { ComponentProps, PropsWithChildren, useEffect } from 'react';\n\nimport { useAtom } from 'jotai';\nimport NavBar, { NavBarProps } from './NavBar';\nimport PageContainer from './PageContainer';\nimport TopBar from './TopBar';\nimport {\n navBarOpenAtom,\n navBarTopAtom,\n navBarWidthClosedAtom,\n navBarWidthOpenAtom,\n titleTextAtom,\n topBarHeightAtom,\n} from './stateAtoms';\n\nexport interface BaseAppLayoutProps {\n /** Either an array of objects used to automatically generate the content of\n * the navbar (WIP), or a node to render directly.*/\n navBarMiddle: NavBarProps['middle'];\n\n /**\n * The initial titleText. Shortcut for calling a setter from useAppLayout()\n * hook since its such a common action.\n */\n initialTitleText?: string;\n\n /**\n * The initial open state of the navbar, which is true by default. Shortcut\n * for calling a setter from useAppLayout() hook since its such a common\n * action.\n */\n initialNavBarOpen?: boolean;\n\n /** Props applied to the PageContainer component, which is a styled MUI\n * Container */\n pageContainerProps?: ComponentProps<typeof PageContainer>;\n\n /** Passed directly as prop of TopBar component */\n topBarDataTestId?: string;\n\n /** Passed directly as prop of PageContainer component */\n pageContentDataTestId?: string;\n\n /** Passed down as prop to the root element of the NavBar component */\n navBarDataTestId?: string;\n\n /** Used to display user name and provided picture as avatar or one generated\n * from unitials of the name */\n user?: NavBarProps['user'];\n\n /** Display under the user's name */\n domainCode?: NavBarProps['domainCode'];\n}\n\ntype AppLayoutProps = PropsWithChildren<BaseAppLayoutProps>;\n\nexport default function AppLayout({\n children,\n initialTitleText,\n initialNavBarOpen,\n pageContainerProps,\n pageContentDataTestId,\n topBarDataTestId,\n navBarDataTestId,\n navBarMiddle,\n user,\n domainCode,\n}: AppLayoutProps) {\n const [navBarOpen, setNavBarOpen] = useAtom(navBarOpenAtom);\n const [navBarWidthOpen] = useAtom(navBarWidthOpenAtom);\n const [navBarWidthClosed] = useAtom(navBarWidthClosedAtom);\n const [titleText, setTitleText] = useAtom(titleTextAtom);\n const [topBarHeight] = useAtom(topBarHeightAtom);\n const [navBarTop] = useAtom(navBarTopAtom);\n\n // Allow open state of navbar to start differently than the default. Unlike\n // changing widths and such, this could be a common scenario.\n useEffect(() => {\n if (initialTitleText !== undefined) setTitleText(initialTitleText);\n }, [initialTitleText, setTitleText]);\n\n // Similarly for navbar open state.\n useEffect(() => {\n if (initialNavBarOpen !== undefined) setNavBarOpen(initialNavBarOpen);\n }, [initialNavBarOpen, setNavBarOpen]);\n\n // Can't imagine initial prop values for other states would be useful\n\n return (\n <Box>\n <CssBaseline />\n <TopBar titleText={titleText} data-testid={topBarDataTestId} height={topBarHeight} />\n\n <Box sx={{ display: 'flex' }}>\n <NavBar\n open={navBarOpen}\n top={navBarTop}\n middle={navBarMiddle}\n user={user}\n domainCode={domainCode}\n widthOpen={navBarWidthOpen}\n widthClosed={navBarWidthClosed}\n offsetTop={topBarHeight}\n data-testid={navBarDataTestId}\n />\n\n <PageContainer\n data-testid={pageContentDataTestId}\n topBarHeight={topBarHeight}\n {...pageContainerProps}\n >\n {children}\n </PageContainer>\n </Box>\n </Box>\n );\n}\n","// The default props passed to the underlying Snackbar component\nimport { SnackbarOrigin } from '@mui/material/Snackbar';\n\nexport const defaultSnackbarProps = {\n autoHideDuration: 6000,\n anchorOrigin: { vertical: 'top', horizontal: 'center' } as SnackbarOrigin,\n\n // The default is false. If we prefer timer to continue when window loses\n // focus, change to true\n disableWindowBlurListener: false,\n};\n\nexport const defaultSaladBarProps = {\n shouldClose: (_event: Event | React.SyntheticEvent<Element, Event>, reason: string) => {\n return reason !== 'clickaway';\n },\n};\n\nexport const defaultEnqueueNotificationOptions = {\n message: '',\n severity: 'info',\n variant: 'standard',\n progressIndicator: undefined, // Can use 'circular' or 'linear'\n};\n","import React, { useRef, useState, createContext, useCallback } from 'react';\nimport { Alert, LinearProgress, CircularProgress, Snackbar, SnackbarProps } from '@mui/material';\n\nimport {\n Notification,\n SaladBarCloseReason,\n SaladBarState,\n SaladBarActions,\n SaladBarContext,\n} from './types';\nimport {\n defaultSaladBarProps,\n defaultSnackbarProps,\n defaultEnqueueNotificationOptions,\n} from './defaults';\n\nconst MAX_QUEUE_LENGTH = 100;\nconst MAX_QUEUE_HIT_REPORT_INTERVAL = 2000;\nconst SALADBAR_INDEX = 2000;\n\n// No need to use uuids, just use an incremented value\nconst generateNotificationKey = (() => {\n let previousKey = 0;\n return () => {\n previousKey += 1;\n return previousKey;\n };\n})();\n\nconst alertWithLinearProgressStyle = {\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n};\n\n// Note: Must be at at this scope, otherwise useEffect will loop infinitely\nconst defaultOverrideState = {};\nconst defaultOverrideActions = {};\n\nexport const Context = createContext<SaladBarContext | null>(null);\n\nexport interface SaladBarProviderProps extends SnackbarProps {\n /** Allow overriding the state of the SaladBar (for tests etc)*/\n overrideState?: Partial<SaladBarState>;\n\n /** Allow overriding the actions of the SaladBar (for tests etc)*/\n overrideActions?: Partial<SaladBarActions>;\n\n /** Called when an event triggers closing of currently displayed snackbar.\n * Default implementation returns false if reason is 'clickaway', otherwise\n * true.*/\n shouldClose?: (\n event: Event | React.SyntheticEvent<Element, Event>,\n reason: SaladBarCloseReason\n ) => boolean;\n}\n\nexport default function SaladBarProvider({\n overrideState = defaultOverrideState,\n overrideActions = defaultOverrideActions,\n shouldClose = defaultSaladBarProps.shouldClose,\n children,\n ...snackbarProps\n}: SaladBarProviderProps) {\n const [{ open }, setSaladBarState] = useState({ open: false });\n\n // We use a ref instead of a state to store the actual data, because we want\n // queue to be persistent across the whole lifetime of component. I considered\n // using yocto-queue because it would be O(1) instead of O(n), but its not\n // designed to access the head without removing it and its not going to make\n // much difference anyway.\n const queueRef = useRef<Notification[]>([]);\n\n const limitLastHitAt = useRef(Date.now());\n const limitHitCountSinceLastReport = useRef(0);\n\n const setOpen = useCallback((newVal: boolean) => {\n setSaladBarState({ open: newVal });\n }, []);\n\n const enqueueNotification = useCallback((notification: Notification = {}) => {\n limitHitCountSinceLastReport.current += 1;\n if (queueRef.current.length >= MAX_QUEUE_LENGTH) {\n // If the queue length is hit, probably stuck in some sort of loop, so\n // don't want to spam logs instantly so space it out\n if (Date.now() - limitLastHitAt.current >= MAX_QUEUE_HIT_REPORT_INTERVAL) {\n limitLastHitAt.current = Date.now();\n console.error(\n `SaladBarProvider: MAX_QUEUE_LENGTH (${MAX_QUEUE_LENGTH}) hit ${limitHitCountSinceLastReport.current} times in last ${MAX_QUEUE_HIT_REPORT_INTERVAL}ms)`\n );\n limitHitCountSinceLastReport.current = 0;\n }\n }\n\n const newNotification = {\n ...defaultEnqueueNotificationOptions,\n key: generateNotificationKey(), // Can be overridden.\n ...notification, // This could result in collisons, but unlikely.\n };\n\n // Add to the end of queue\n queueRef.current.push(newNotification as Notification);\n\n // If the queue was previously empty, then open the snackbar. We don't do it\n // whenever enqueueNotification is called since it will mess up transitions\n if (queueRef.current.length === 1) setSaladBarState({ open: true });\n\n return newNotification.key;\n }, []);\n\n const enqueueSuccessNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'success', ...options });\n\n const enqueueInfoNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'info', ...options });\n\n const enqueueWarningNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'warning', ...options });\n\n const enqueueErrorNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'error', ...options });\n\n /**\n * Remove the notification with specified key from the queue. If the key is\n * not found, immediately returns null.\n *\n * @param key - The key as returned from enqueue...() function.\n *\n * @returns The removed notification\n */\n const removeNotification = (key: Notification['key']) => {\n const index = queueRef.current.findIndex((x) => x.key === key);\n if (index === -1) return;\n\n if (index === 0) {\n // If its at the front of the queue, it is either currently being\n // displayed or in process of being closed. Either way, we can just set\n // open to false\n setSaladBarState({ open: false });\n return queueRef.current[0];\n }\n // Otherwise we just remove it from the queue, it won't need to transition\n return queueRef.current.splice(index, 1);\n };\n\n const handleClose = (\n event: Event | React.SyntheticEvent<Element, Event>,\n reason: SaladBarCloseReason\n ) => {\n if (shouldClose(event, reason)) setSaladBarState({ open: false });\n };\n\n // Callback fired before the transition is exiting.\n const handleExit = () => {};\n\n // Callback fired when the transition has exited.\n const handleExited = () => {\n // Remove head of queue\n queueRef.current.shift();\n\n // If there is still something on the queue, then re-open\n if (queueRef.current.length > 0) setSaladBarState({ open: true });\n };\n\n // The notification to display is the one at head of queue\n const currentNotification = queueRef.current[0] ?? {\n ...defaultEnqueueNotificationOptions,\n };\n\n // Can also override certain props on a notification level\n const currentNotificationSnackbarProps: { autoHideDuration?: number } = {};\n // Probably a better way of doing this\n if ('autoHideDuration' in currentNotification) {\n currentNotificationSnackbarProps.autoHideDuration = currentNotification.autoHideDuration;\n }\n\n // Note the order of props in Snackbar, we don't allow overriding open and\n // onClose directly.\n const snackbarFinalProps = {\n ...defaultSnackbarProps,\n ...snackbarProps,\n };\n\n const value: SaladBarContext = {\n open,\n setOpen,\n enqueueNotification,\n enqueueSuccessNotification,\n enqueueInfoNotification,\n enqueueWarningNotification,\n enqueueErrorNotification,\n removeNotification,\n ...overrideState,\n ...overrideActions,\n };\n\n return (\n <Context.Provider value={value}>\n {children}\n <Snackbar\n {...snackbarFinalProps}\n {...currentNotificationSnackbarProps}\n open={open}\n onClose={handleClose}\n TransitionProps={{\n onExited: handleExited,\n onExit: handleExit,\n }}\n sx={{ zIndex: SALADBAR_INDEX }}\n >\n <div>\n <Alert\n onClose={(event) => handleClose(event, 'closeAlert')}\n severity={currentNotification.severity}\n variant={'filled'}\n icon={\n currentNotification.progressIndicator === 'circular' ? (\n <CircularProgress size=\"1em\" />\n ) : undefined\n }\n style={\n currentNotification.progressIndicator === 'linear'\n ? alertWithLinearProgressStyle\n : undefined\n }\n >\n {currentNotification.message}\n </Alert>\n {currentNotification.progressIndicator === 'linear' && <LinearProgress color=\"primary\" />}\n </div>\n </Snackbar>\n </Context.Provider>\n );\n}\n","import { useContext } from 'react';\n\nimport { Context } from './SaladBarContext';\nimport { ContextError } from '../../errors/ContextError';\n\n/**\n * Use the `useSaladBar` hook in components to access the enqueueNotification()\n * method to add a snackbar message to queue.\n *\n * Must be used inside a <SaladBarProvider>\n *\n * Example:\n *\n * ```js\n * const {\n * enqueueNotification,\n * enqueueSuccessNotification,\n * enqueueInfoNotification,\n * enqueueWarningNotification,\n * enqueueErrorNotification,\n * } = useSaladBar();\n * ...\n * enqueueNotification({message: 'hello', severity: 'info'});\n * // or\n * enqueueInfoNotification('hello');\n * ```\n */\nexport function useSaladBar() {\n const context = useContext(Context);\n\n if (context === null) {\n throw new ContextError('Error: Tried to useSaladBar outside of a <SaladBarProvider>');\n }\n\n return context;\n}\n","/* eslint-disable react/prop-types */\n/* eslint-disable react/display-name */\nimport { createHelper } from 'souvlaki';\n\nimport SaladBarProvider, { SaladBarProviderProps } from './SaladBarContext';\n\nexport const withSaladBarProvider = createHelper(\n (\n props: SaladBarProviderProps = { autoHideDuration: 1 },\n state: Partial<unknown> = {},\n actions: Partial<unknown> = {}\n ) =>\n ({ children }) => {\n return (\n <SaladBarProvider {...props} overrideState={state} overrideActions={actions}>\n {children}\n </SaladBarProvider>\n );\n }\n);\n","import { Provider, createStore, getDefaultStore } from 'jotai';\nimport { PropsWithChildren } from 'react';\n\nexport const atomStore = getDefaultStore();\n\nexport const AtomProvider = ({\n children,\n store,\n}: PropsWithChildren<{ store?: ReturnType<typeof createStore> }>) => (\n <Provider store={store ?? atomStore}>{children}</Provider>\n);\n","import { atom } from 'jotai';\nimport { DomainCode } from './DomainCodeDialog';\n\nconst DOMAIN_CODE_KEY = 'domainCode';\n\nconst baseDomainCodeAtom = atom<DomainCode>(\n JSON.parse(localStorage.getItem(DOMAIN_CODE_KEY) ?? '{\"domainCode\": \"\"}').domainCode as DomainCode\n);\n\nexport const domainCodeAtom = atom(\n (get) => get(baseDomainCodeAtom),\n (_, set, newValue: DomainCode) => {\n set(baseDomainCodeAtom, newValue);\n localStorage.setItem(DOMAIN_CODE_KEY, JSON.stringify({ domainCode: newValue }));\n }\n);\n","import {\n Autocomplete,\n CircularProgress,\n FormHelperText,\n TextField,\n Typography,\n} from '@mui/material';\nimport { useAtom } from 'jotai';\nimport { PropsWithChildren, useState } from 'react';\nimport AgDialog from '../components/AgDialog';\nimport { useSaladBar } from '../providers';\nimport { domainCodeAtom } from './hooks';\n\nconst DOMAIN_CODE_LABELS = {\n act: 'ACT',\n nsw: 'NSW',\n nt: 'NT',\n qld: 'QLD',\n sa: 'SA',\n tas: 'TAS',\n vic: 'VIC',\n wa: 'WA',\n ag: 'AG',\n fedmps: 'Fedmps',\n '': '',\n} as const;\n\nexport type DomainCode = keyof typeof DOMAIN_CODE_LABELS;\n\nconst getOptionLabel = (domainCode: DomainCode | null) => {\n return domainCode === null ? 'N/A' : DOMAIN_CODE_LABELS[domainCode] ?? '';\n};\n\ntype Props = PropsWithChildren<{\n isLoading: boolean;\n isOpen: boolean;\n onClose: () => void;\n domainOptions: DomainCode[];\n applicationName: string;\n handleLogout: () => void;\n}>;\n\nconst DomainCodeDialog = ({\n isLoading,\n isOpen,\n onClose: handleClose,\n domainOptions,\n applicationName,\n handleLogout,\n}: Props) => {\n const [domainCode, setDomainCode] = useAtom(domainCodeAtom);\n const [selectedDomainCode, setSelectedDomainCode] = useState(domainCode);\n const { enqueueSuccessNotification } = useSaladBar();\n\n const userHasNoDomains = domainOptions.length === 0;\n const userHasNoRolesInDomain =\n Boolean(domainCode) &&\n !domainOptions.includes(domainCode) &&\n !domainOptions.includes(selectedDomainCode);\n\n const shouldLogout = !domainCode || userHasNoDomains || userHasNoRolesInDomain;\n\n const handleConfirmDomainCode = async () => {\n if (selectedDomainCode) {\n setDomainCode(selectedDomainCode);\n enqueueSuccessNotification(`Set domain to ${selectedDomainCode}`);\n handleClose();\n } else setDomainCode('');\n };\n\n const handleDialogClose = async () => {\n if (domainCode && !userHasNoDomains && !userHasNoRolesInDomain) {\n setSelectedDomainCode(domainCode);\n handleClose();\n } else if (shouldLogout) {\n handleLogout();\n }\n };\n\n let errorMessage: string | undefined;\n if (userHasNoDomains) {\n errorMessage = 'Unable to retrieve your active organisations. Try logging in again.';\n } else if (userHasNoRolesInDomain) {\n errorMessage =\n 'You no longer have any roles in your chosen organisation. Please choose another.';\n }\n\n return (\n <AgDialog\n isOpen={isOpen}\n dialogTitle=\"Select an organisation\"\n primaryButton={{\n text: 'Confirm',\n onClick: handleConfirmDomainCode,\n disabled: !selectedDomainCode || userHasNoDomains || userHasNoRolesInDomain,\n buttonColor: 'primary',\n }}\n secondaryButton={{\n text: shouldLogout ? 'Logout' : 'Cancel',\n onClick: handleDialogClose,\n }}\n onClose={shouldLogout ? () => {} : handleClose}\n >\n <Typography marginBottom={2}>\n Select the default organisation that you want to use with the {applicationName}.\n </Typography>\n\n <Autocomplete\n loading={isLoading}\n multiple={false}\n disableClearable={false}\n value={selectedDomainCode !== '' ? selectedDomainCode : null}\n onChange={(_, value) => setSelectedDomainCode(value ?? '')}\n getOptionLabel={getOptionLabel}\n options={[...domainOptions]}\n renderInput={(params) => (\n <TextField\n {...params}\n variant=\"filled\"\n label={'Select organisation'}\n InputProps={{\n ...params.InputProps,\n endAdornment: (\n <>\n {isLoading ? (\n <CircularProgress color=\"inherit\" size={20} sx={{ marginTop: '-20px' }} />\n ) : null}\n {params.InputProps.endAdornment}\n </>\n ),\n }}\n />\n )}\n />\n {errorMessage && <FormHelperText error>{errorMessage}</FormHelperText>}\n </AgDialog>\n );\n};\n\nexport default DomainCodeDialog;\n","import { createTheme } from '@mui/material/styles';\n\nconst theme = createTheme({\n palette: {\n primary: {\n dark: '#00A651',\n light: '#A3D39C',\n main: '#007236',\n contrastText: '#FFF',\n },\n warning: {\n main: '#F5871F',\n light: '#FCC589',\n dark: '#A2590A',\n contrastText: '#FFF',\n },\n secondary: {\n main: '#662D91',\n light: '#BD8CBF',\n dark: '#440E62',\n contrastText: '#FFF',\n },\n error: {\n main: '#D43C95',\n light: '#8F2064',\n dark: '#F9CDE0',\n contrastText: '#FFF',\n },\n info: {\n main: '#00A88D',\n light: '#ADDCCF',\n dark: '#005243',\n contrastText: '#FFF',\n },\n success: {\n main: '#00A651',\n light: '#A3D39C',\n dark: '#007236',\n contrastText: '#FFF',\n },\n },\n typography: {\n // I couldn't think of what to call this. It is an attempt to match\n // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730\n // but not sure if line height should be changed\n explainer: {\n fontSize: '14px',\n marginBlockStart: '1em',\n },\n },\n\n navBar: {\n backgroundColor: '#E8E8E8',\n },\n});\n\nexport default theme;\n","import { alpha, createTheme } from '@mui/material/styles';\n\nconst theme = createTheme({\n palette: {\n primary: {\n main: '#007236',\n dark: '#005221',\n light: '#00A04E',\n contrastText: '#FFFFFF',\n },\n secondary: {\n main: '#662D91',\n dark: '#440E62',\n light: '#93268F',\n contrastText: '#FFFFFF',\n },\n error: {\n main: '#D32F2F',\n dark: '#C62828',\n light: '#EF5350',\n },\n info: {\n main: '#0288D1',\n dark: '#01579B',\n light: '#03A9F4',\n },\n success: {\n main: '#0288D1',\n dark: '#01579B',\n light: '#03A9F4',\n },\n },\n components: {\n MuiTextField: {\n defaultProps: { color: 'secondary' },\n },\n MuiToggleButtonGroup: {\n defaultProps: { color: 'secondary' },\n },\n MuiCheckbox: {\n defaultProps: { color: 'secondary' },\n },\n MuiSelect: {\n defaultProps: { color: 'secondary' },\n },\n MuiSwitch: {\n defaultProps: { color: 'secondary' },\n },\n MuiFormControl: {\n defaultProps: { color: 'secondary' },\n },\n MuiMenuItem: {\n // Setting defaultProps for color on MenuItem does not work, so update manually\n styleOverrides: {\n root: ({ theme: origTheme }) => ({\n '&.Mui-selected': {\n backgroundColor: alpha(\n origTheme.palette.secondary.main,\n origTheme.palette.action.selectedOpacity\n ),\n '&:hover': {\n backgroundColor: alpha(\n origTheme.palette.secondary.main,\n origTheme.palette.action.selectedOpacity\n ),\n },\n '&.Mui-focusVisible': {\n backgroundColor: alpha(\n origTheme.palette.secondary.main,\n origTheme.palette.action.focusOpacity\n ),\n },\n },\n }),\n },\n },\n },\n typography: {\n // I couldn't think of what to call this. It is an attempt to match\n // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730\n // but not sure if line height should be changed\n explainer: {\n fontSize: '14px',\n marginBlockStart: '1em',\n },\n h3: {\n fontSize: '1rem',\n fontWeight: 700,\n },\n },\n navBar: {\n backgroundColor: '#E8E8E8',\n },\n});\n\nexport default theme;\n","/* eslint-disable @typescript-eslint/no-inferrable-types */\n/* eslint-disable react/prop-types */\n/* eslint-disable react/display-name */\nimport { Provider, WritableAtom, useAtomValue } from 'jotai';\nimport { useHydrateAtoms } from 'jotai/utils';\nimport { PropsWithChildren } from 'react';\nimport { createHelper } from 'souvlaki';\nimport { domainCodeAtom } from '../domainCode';\nimport {\n navBarOpenAtom,\n navBarTopAtom,\n navBarWidthClosedAtom,\n navBarWidthOpenAtom,\n titleTextAtom,\n topBarHeightAtom,\n} from '../layouts/AppLayout';\n\n/**\n * When you need to want to set an initial value for an atom, you can use either:\n * - withOverrideDefaults (first add your atom to the atomsToOverride with your choice of key)\n * - your own custom wrapper that extends HydrateAtoms, like withDomainCode.\n * You'll need to pass it:\n * -- an array of tuples of atoms and their values.\n * -- i.e. [[your_atom, value], [another_atom, value2]]\n */\n\nconst atomsToOverride = {\n domainCode: domainCodeAtom,\n navBarOpen: navBarOpenAtom,\n navBarWidthOpen: navBarWidthOpenAtom,\n navBarWidthClosed: navBarWidthClosedAtom,\n titleText: titleTextAtom,\n topBarHeight: topBarHeightAtom,\n navBarTop: navBarTopAtom,\n};\n\ntype OverrideValues<T> = [WritableAtom<T, T[], void>, T][];\n\ntype AtomConfigOption = keyof typeof atomsToOverride;\n\ntype AtomConfigValue<T extends AtomConfigOption> = ReturnType<\n typeof useAtomValue<(typeof atomsToOverride)[T]>\n>;\n\ntype AtomConfig = { [K in AtomConfigOption]: AtomConfigValue<K> };\n\nexport const withAtomProvider = createHelper(() => ({ children }) => (\n <Provider>{children}</Provider>\n));\n\nexport const HydrateAtoms = <T,>({\n initialValues,\n children,\n}: PropsWithChildren<{ initialValues: OverrideValues<T> }>) => {\n useHydrateAtoms<OverrideValues<T>>(initialValues);\n return <>{children}</>;\n};\n\nexport const withOverrideDefaults = createHelper(\n (overrides: Partial<AtomConfig>) =>\n ({ children }) =>\n (\n <HydrateAtoms\n // Typescript doesn't type Object.entries well yet\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initialValues={(Object.entries(overrides) as any).map(\n <T extends AtomConfigOption>([key, value]: [T, AtomConfigValue<T>]) => [\n atomsToOverride[key],\n value,\n ]\n )}\n >\n {children}\n </HydrateAtoms>\n )\n);\n"],"names":["ExampleComponent","text","num","setNum","useState","jsxs","Fragment","jsx","Typography","Button","oldNum","Paper","NAVBAR_WIDTH_OPENED","NAVBAR_WIDTH_CLOSED","PREFIX","classes","Root","styled","theme","sharedOverrides","openedMixin","__spreadValues","closedMixin","NavDrawer","Drawer","prop","open","ContextError","AgError","__publicField","Context","createContext","defaultOverrideState","defaultOverrideActions","NavBarProvider","overrideState","overrideActions","children","setNavBarState","setOpen","useCallback","newVal","toggleOpen","prevState","__spreadProps","value","useNavBar","context","useContext","buildNavBarState","overrides","withNavBarProvider","createHelper","state","actions","SELECTED_INDICATOR_WIDTH","NavBarDarkStyledList","List","NavBarLightStyledList","NavBar","dataTestId","CssBaseline","AgDialog","isOpen","dialogTitle","maxWidth","primaryButton","secondaryButton","handleClose","areButtonsDisabled","setButtonsDisabled","Dialog","DialogTitle","DialogContent","DialogActions","_a","__async","TOP_STRIPE_HEIGHT","TITLE_BAR_HEIGHT","leftPanel","rightPanel","_b","TopBar","titleText","Box","IconButton","ForwardIcon","BackIcon","DEFAULT_PANEL_WIDTH","SidePanelDrawer","width","debugOpacity","anchor","navBarOpen","navBarWidthOpen","navBarWidthClosed","DrawerHeaderBox","SidePanel","onClose","showCloseArrow","headerBoxProps","onOpened","onClosed","PanelAwareMargins","PageContainer","Container","INITIAL_LEFT_PANEL_OPEN","INITIAL_RIGHT_PANEL_OPEN","PANEL_DEFAULTS","PageLayout","sidePanelsAreMutuallyExclusive","pageContainerProps","pageContentDataTestId","topBarDataTestId","leftPanelOpenInternal","setLeftPanelOpenInternal","rightPanelOpenInternal","setRightPanelOpenInternal","leftPanelOpenInternalPrevious","setLeftPanelOpenInternalPrevious","rightPanelOpenInternalPrevious","setRightPanelOpenInternalPrevious","includeLeftPanel","includeRightPanel","leftPanelTitleText","leftPanelContent","leftPanelFlavour","leftPanelOpen","leftPanelOnChangeOpen","leftPanelWidth","leftPanelArrowButtons","leftPanelStartOpen","leftPanelOnOpened","leftPanelOnClosed","leftPanelDataTestId","rightPanelTitleText","rightPanelContent","rightPanelFlavour","rightPanelOpen","rightPanelOnChangeOpen","rightPanelWidth","rightPanelArrowButtons","rightPanelStartOpen","rightPanelOnOpened","rightPanelOnClosed","rightPanelDataTestId","useEffect","leftPanelOpenCurrent","rightPanelOpenCurrent","handleLeftPanelChangeOpen","handleRightPanelChangeOpen","offsetTop","widthOpen","widthClosed","LinksMenu","links","simpleHashCode","str","hash","i","len","chr","avatarColours","extractInitials","name","part","v","UserInfo","user","domainCode","useAtomValue","navBarWidthClosedAtom","navBarWidthOpenAtom","Avatar","Skeleton","SettingsEtcPlaceholder","menuOpen","setMenuOpen","ListItemButton","prev","ListItemIcon","SwitchToIcon","ListItemText","ExpandLessIcon","ExpandMoreIcon","Collapse","SettingsIcon","LogoutIcon","top","middle","Divider","topBarHeight","DEFAULT_TOP_BAR_HEIGHT","DEFAULT_NAV_BAR_WIDTH_CLOSED","DEFAULT_NAV_BAR_WIDTH_OPEN","navBarOpenAtom","atom","titleTextAtom","topBarHeightAtom","navBarTopAtom","height","setNavBarOpen","useSetAtom","prevVal","HamburgerIcon","AppLayout","initialTitleText","initialNavBarOpen","navBarDataTestId","navBarMiddle","useAtom","setTitleText","navBarTop","defaultSnackbarProps","defaultSaladBarProps","_event","reason","defaultEnqueueNotificationOptions","MAX_QUEUE_LENGTH","MAX_QUEUE_HIT_REPORT_INTERVAL","SALADBAR_INDEX","generateNotificationKey","previousKey","alertWithLinearProgressStyle","SaladBarProvider","shouldClose","snackbarProps","__objRest","setSaladBarState","queueRef","useRef","limitLastHitAt","limitHitCountSinceLastReport","enqueueNotification","notification","newNotification","enqueueSuccessNotification","message","options","enqueueInfoNotification","enqueueWarningNotification","enqueueErrorNotification","removeNotification","key","index","x","event","handleExit","handleExited","currentNotification","currentNotificationSnackbarProps","snackbarFinalProps","Snackbar","Alert","CircularProgress","LinearProgress","useSaladBar","withSaladBarProvider","props","atomStore","getDefaultStore","AtomProvider","store","Provider","DOMAIN_CODE_KEY","baseDomainCodeAtom","domainCodeAtom","get","_","set","newValue","DOMAIN_CODE_LABELS","getOptionLabel","DomainCodeDialog","isLoading","domainOptions","applicationName","handleLogout","setDomainCode","selectedDomainCode","setSelectedDomainCode","userHasNoDomains","userHasNoRolesInDomain","shouldLogout","handleConfirmDomainCode","handleDialogClose","errorMessage","Autocomplete","params","TextField","FormHelperText","createTheme","origTheme","alpha","atomsToOverride","withAtomProvider","HydrateAtoms","initialValues","useHydrateAtoms","withOverrideDefaults"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=AppLayout.comp.test.d.ts.map