udp-react-enterprise-component-library 25.1.0-beta.9 → 25.1.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AmbientGridTemplate-BqlMt5Su.js → AmbientGridTemplate-6xfwTiz-.js} +24 -62
- package/dist/AmbientGridTemplate-6xfwTiz-.js.map +1 -0
- package/dist/ClientSideUdpGrid-CEhDqIId.js +56 -0
- package/dist/ClientSideUdpGrid-CEhDqIId.js.map +1 -0
- package/dist/{EnvironmentRibbon-DaDmKAPO.js → EnvironmentRibbon-oEmbWjEq.js} +4 -148
- package/dist/EnvironmentRibbon-oEmbWjEq.js.map +1 -0
- package/dist/{MenuPage-CO6_GWwB.js → MenuPage-CZHpoopY.js} +12 -13
- package/dist/{MenuPage-CO6_GWwB.js.map → MenuPage-CZHpoopY.js.map} +1 -1
- package/dist/{MyExportsPage-CX9tzqHk.js → MyExportsPage-CS2Bw2mF.js} +56 -69
- package/dist/{MyExportsPage-CX9tzqHk.js.map → MyExportsPage-CS2Bw2mF.js.map} +1 -1
- package/dist/MyExportsPage-hyX42CN6.js +11 -0
- package/dist/{PageContainer-k8KCfGsM.js → PageContainer-BPHLFGju.js} +12 -17
- package/dist/PageContainer-BPHLFGju.js.map +1 -0
- package/dist/{PageNotFoundRoute-CxYZNEhN.js → PageNotFoundRoute-D9dLbM_w.js} +1 -1
- package/dist/{PageNotFoundRoute-CxYZNEhN.js.map → PageNotFoundRoute-D9dLbM_w.js.map} +1 -1
- package/dist/PageNotFoundRoute-DUj0Q9J8.js +3 -0
- package/dist/{PasswordResetRedirect-BHnkAW40.js → PasswordResetRedirect-C3g8L0vA.js} +2 -3
- package/dist/{PasswordResetRedirect-BHnkAW40.js.map → PasswordResetRedirect-C3g8L0vA.js.map} +1 -1
- package/dist/PasswordResetRedirect-Dh-S5Ril.js +3 -0
- package/dist/{SearchUtilities-Bor3HbfB.js → SearchUtilities-Btugro8y.js} +11 -20
- package/dist/{SearchUtilities-Bor3HbfB.js.map → SearchUtilities-Btugro8y.js.map} +1 -1
- package/dist/{SideSheet-DUsxG1FN.js → SideSheet-BsDoeNmq.js} +7 -47
- package/dist/SideSheet-BsDoeNmq.js.map +1 -0
- package/dist/UdpMaintenanceConfigPage-DcHntunS.js +88 -0
- package/dist/UdpMaintenanceConfigPage-DcHntunS.js.map +1 -0
- package/dist/UdpPublicForm-DTt-lMfk.js +4 -0
- package/dist/{UdpPublicForm-Caa1tH6z.js → UdpPublicForm-LDSuOwV2.js} +2 -2
- package/dist/{UdpPublicForm-Caa1tH6z.js.map → UdpPublicForm-LDSuOwV2.js.map} +1 -1
- package/dist/{UtilitySideBar-D4CXGtW2.js → UtilitySideBar-95k0edSA.js} +45 -89
- package/dist/{UtilitySideBar-D4CXGtW2.js.map → UtilitySideBar-95k0edSA.js.map} +1 -1
- package/dist/{VirtualBrowser-BXL0hdy0.js → VirtualBrowser-_epMjUkE.js} +23 -29
- package/dist/{VirtualBrowser-BXL0hdy0.js.map → VirtualBrowser-_epMjUkE.js.map} +1 -1
- package/dist/{WorkflowContainer-DrqzuQtU.js → WorkflowContainer-ClPvY2mG.js} +14 -20
- package/dist/{WorkflowContainer-DrqzuQtU.js.map → WorkflowContainer-ClPvY2mG.js.map} +1 -1
- package/dist/WorkflowContainer-D0QUOc-f.js +11 -0
- package/dist/{apiHelpers-DZots3og.js → apiHelpers-CmM6DWAT.js} +7 -12
- package/dist/{apiHelpers-DZots3og.js.map → apiHelpers-CmM6DWAT.js.map} +1 -1
- package/dist/entityUtilities-Dy-jsB5c.js +22 -0
- package/dist/entityUtilities-Dy-jsB5c.js.map +1 -0
- package/dist/index.js +1528 -2114
- package/dist/index.js.map +1 -1
- package/dist/{propertyTypeEnums-Civy7RJv.js → propertyTypeEnums-BCCGQqVB.js} +2 -2
- package/dist/{propertyTypeEnums-Civy7RJv.js.map → propertyTypeEnums-BCCGQqVB.js.map} +1 -1
- package/dist/types/index.d.ts +0 -4
- package/dist/types/maintenanceEngine/crudBrowser/CrudTableColumnDefs.d.ts +1 -9
- package/dist/types/maintenanceEngine/crudBrowser/crudHelper.d.ts +1 -0
- package/dist/types/menuPage/MenuPage.d.ts +2 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/types/udp/pages/UdpMaintenanceConfigPage.d.ts +2 -1
- package/dist/useAxiosGet-Dh5pVURP.js +144 -0
- package/dist/useAxiosGet-Dh5pVURP.js.map +1 -0
- package/dist/useAxiosMutate-DlG255x9.js +43 -0
- package/dist/useAxiosMutate-DlG255x9.js.map +1 -0
- package/package.json +2 -2
- package/dist/AmbientGridTemplate-BqlMt5Su.js.map +0 -1
- package/dist/EnvironmentRibbon-DaDmKAPO.js.map +0 -1
- package/dist/MyExportsPage-CkzQ0MRq.js +0 -8
- package/dist/PageContainer-k8KCfGsM.js.map +0 -1
- package/dist/PageNotFoundRoute-BbBtA9Cz.js +0 -3
- package/dist/PasswordResetRedirect-tUV2yEkH.js +0 -3
- package/dist/SideSheet-DUsxG1FN.js.map +0 -1
- package/dist/UdpPublicForm-Cvw5tOHe.js +0 -4
- package/dist/WorkflowContainer-Q8gtuaB7.js +0 -9
- package/dist/types/maintenanceEngine/crudBrowser/CrudTableActionRender.d.ts +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuPage-CO6_GWwB.js","names":["useStyles","other","useStyles","tree","expanded"],"sources":["../src/treeMenu/BaseTreeMenuItem.jsx","../src/treeMenu/BaseTreeMenu.jsx","../src/menuPage/MenuPage.jsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport {\n makeStyles,\n lighten,\n Typography,\n CircularProgress,\n darken,\n useTheme,\n Tooltip\n} from '@material-ui/core';\nimport TreeItem from '@material-ui/lab/TreeItem';\nimport { getIconFromName } from '../utilities/tree/TreeUtilities';\nimport clsx from 'clsx';\nimport { UnityFluentIcon } from '../utilities/UnityFluentIcon';\nimport { getUnityIconFromName } from '../utilities/iconLibrary/UnityIconLibrary';\nimport { useDrag, useDrop } from 'react-dnd';\nimport {\n NodeActionTriggerEnums,\n TreeViewModeEnums\n} from '../enums/unitySystemEnums.ts';\nimport { AggregateChip } from '../UI/utilityDisplay/AggregateChip';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n '&.Mui-selected > .MuiTreeItem-content': {\n backgroundColor:\n theme?.getThemeData()?.mode === 'dark'\n ? theme.palette.grey[700]\n : theme.palette.grey[300],\n borderRight: `4px solid ${theme.palette.primary.main}`\n },\n '&.Mui-selected > .MuiTreeItem-content .MuiTreeItem-label': {\n backgroundColor: 'transparent',\n paddingLeft: 0\n },\n '&.Mui-selected > .MuiTreeItem-content > .MuiCollapse-wrapperInner': {\n backgroundColor:\n theme?.getThemeData()?.mode !== 'dark' && theme.palette.grey[50]\n },\n '& .MuiTreeItem-content .MuiTreeItem-iconContainer': {\n display: (props) => (props.sidebarExpanded ? 'flex' : 'none')\n }\n },\n content: {\n backgroundColor: (props) =>\n theme?.getThemeData()?.mode !== 'dark' &&\n props.conditionalIconName &&\n props.conditionalIconColor\n ? lighten(props.conditionalIconColor, 0.92)\n : ''\n },\n labelRoot: {\n display: 'flex',\n alignItems: 'center',\n marginLeft: (props) => (props.sidebarExpanded ? 0 : theme.spacing(1.5)),\n width: '100%'\n },\n labelContainer: {\n display: (props) => (!props.sidebarExpanded ? 'none' : ''),\n width: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? `calc(100% - ${theme.spacing(6.25)}px)`\n : `calc(100% - ${theme.spacing(7.75)}px)`\n },\n conditionalIconContainer: {\n display: 'inline-flex'\n },\n labelText: {\n fontSize: '0.75rem',\n fontWeight: 600,\n lineHeight: '1rem',\n letterSpacing: 0.1\n },\n captionText: {\n marginLeft: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact ? theme.spacing(1) : '',\n fontSize: '0.65rem',\n fontWeight: 400,\n lineHeight: 1,\n letterSpacing: 0.4\n },\n labelOverflow: {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n },\n group: {\n width: '100%',\n '& .MuiTreeItem-group': {\n marginLeft: 0\n },\n '& .MuiTreeItem-content': {\n paddingLeft: (props) =>\n props.sidebarExpanded ? (props.depth || 1) * theme.spacing(1) : 0,\n borderRight: (props) =>\n props.showRightBorderColor\n ? `4px solid ${theme.palette.primary.main}`\n : '',\n borderBottom: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? `1px solid ${theme.palette.grey[200]}`\n : ''\n },\n '& .MuiTreeItem-content .MuiTreeItem-label': {\n paddingLeft: 0,\n width: (props) =>\n props.sidebarExpanded && `calc(100% - ${theme.spacing(2.5)}px)`\n },\n '& .MuiTreeItem-content .MuiTreeItem-iconContainer span': {\n display: (props) => (props.hideExpansion ? 'none' : '')\n },\n '& .MuiCollapse-wrapperInner': {\n backgroundColor: (props) =>\n theme?.getThemeData()?.mode !== 'dark' && props.isSelectedNode\n ? theme.palette.grey[50]\n : ''\n }\n },\n iconContainer: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 50,\n marginTop: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? theme.spacing(0.25)\n : theme.spacing(0.5),\n marginBottom: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? theme.spacing(0.25)\n : theme.spacing(0.5),\n marginRight: theme.spacing(1),\n width: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? theme.spacing(3)\n : theme.spacing(4),\n height: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? theme.spacing(3)\n : theme.spacing(4),\n border: (props) =>\n props.iconColor\n ? `1px solid ${darken(props.iconColor, 0.1)}`\n : `1px solid ${theme.palette.secondary.main}`,\n backgroundColor: '#ffffff'\n }\n}));\n\nexport const BaseTreeMenuItem = (props) => {\n const {\n parentId,\n nodeId,\n iconName,\n iconType,\n conditionalIconName,\n conditionalIconType,\n conditionalIconColor,\n label,\n iconColor,\n onNodeSelect,\n isSelectedNode,\n subLabel,\n sidebarExpanded,\n isLastNode,\n loading,\n node,\n onDropNode,\n treeViewMode,\n menuIndex,\n aggregateThresholdId,\n ...other\n } = props;\n const classes = useStyles(props);\n const theme = useTheme();\n\n const [{ isDragging }, dragRef] = useDrag({\n type: 'BaseTreeMenuItem',\n item: { ...node, sourceNodeMenuIndex: menuIndex },\n collect: (monitor) => ({\n isDragging: monitor.isDragging()\n })\n });\n\n const handleOnDrop = useCallback(\n (sourceNode, monitor) => {\n if (!monitor.didDrop()) {\n if (onDropNode) {\n const { sourceNodeMenuIndex, ...other } = sourceNode;\n onDropNode({ ...other }, node, sourceNodeMenuIndex, menuIndex);\n }\n }\n },\n [onDropNode, node, menuIndex]\n );\n\n const [{ canDrop, isOver }, dropRef] = useDrop(\n () => ({\n accept: ['BaseTreeMenuItem'],\n drop: (sourceNode, monitor) => {\n // condition to only handle first drop\n handleOnDrop(sourceNode, monitor);\n },\n canDrop: (sourceNode) => checkCanDrop(sourceNode),\n collect: (monitor) => ({\n isOver: monitor.isOver(),\n canDrop: !!monitor.canDrop()\n })\n }),\n [handleOnDrop]\n );\n\n const checkCanDrop = useCallback(\n (sourceNode) => {\n if (sourceNode) {\n const onDropActions = node?.properties?.nodeActions?.filter(\n (na) => na?.triggerType === NodeActionTriggerEnums.On_Node_Drop\n );\n if (!onDropActions) {\n return false;\n }\n const nodeDragEntities = onDropActions?.map(\n (action) => action?.dragEntityName\n );\n return nodeDragEntities.includes(\n sourceNode?.properties?.catalogReturnObject\n );\n }\n },\n [node]\n );\n\n const handleOnLabelClick = useCallback(\n (e) => {\n e.preventDefault();\n onNodeSelect(e, nodeId);\n },\n [onNodeSelect, nodeId]\n );\n\n return (\n <TreeItem\n className={classes.group}\n key={nodeId}\n nodeId={nodeId}\n label={\n <div ref={dropRef}>\n <Tooltip title={sidebarExpanded ? '' : label}>\n <div\n ref={(node?.properties?.isDraggable && dragRef) || null}\n style={{ opacity: isDragging ? 0.5 : 1 }}\n >\n {loading ? (\n <CircularProgress size={12} />\n ) : (\n <div\n id={'udpRecord-BaseTreeMenuItem-'+label.replace(/\\s+/g, '')}\n udprecordid={'udpRecord-BaseTreeMenuItem-'+label.replace(/\\s+/g, '')}\n className={classes.labelRoot}\n style={{\n fontWeight: isSelectedNode ? 'bold' : ''\n }}\n >\n {iconName && (\n <div className={classes.iconContainer}>\n <UnityFluentIcon\n size={\n treeViewMode === TreeViewModeEnums.Compact\n ? 'small'\n : 'medium'\n }\n color={iconColor}\n type={iconType}\n icon={\n iconType === 'unity'\n ? getUnityIconFromName(iconName)\n : getIconFromName(iconName)\n }\n style={{\n color: iconColor\n ? darken(iconColor, 0.1)\n : theme.palette.secondary.main\n }}\n />\n </div>\n )}\n <div className={classes.labelContainer}>\n <Typography\n variant='subtitle2'\n className={clsx(classes.labelText, classes.labelOverflow)}\n >\n {label}\n {subLabel &&\n treeViewMode === TreeViewModeEnums.Compact && (\n <Typography\n variant='caption'\n className={clsx(\n classes.captionText,\n classes.labelOverflow\n )}\n >\n {subLabel}\n </Typography>\n )}\n </Typography>\n {subLabel && treeViewMode === TreeViewModeEnums.Classic && (\n <div className={classes.labelOverflow}>\n <Typography\n variant='caption'\n className={clsx(classes.captionText)}\n >\n {subLabel}\n </Typography>\n </div>\n )}\n </div>\n <AggregateChip aggregateThresholdId={aggregateThresholdId} />\n {conditionalIconName && sidebarExpanded && (\n <div className={classes.conditionalIconContainer}>\n <UnityFluentIcon\n size={\n treeViewMode === TreeViewModeEnums.Compact\n ? 'small'\n : 'medium'\n }\n color={conditionalIconColor}\n type={conditionalIconType}\n icon={\n conditionalIconType === 'unity'\n ? getUnityIconFromName(conditionalIconName)\n : getIconFromName(conditionalIconName)\n }\n style={{\n color: conditionalIconColor\n }}\n />\n </div>\n )}\n </div>\n )}\n </div>\n </Tooltip>\n </div>\n }\n onLabelClick={handleOnLabelClick}\n classes={{ root: classes.root, content: classes.content }}\n {...other}\n />\n );\n};\n","import React, { useCallback, useState, useEffect, useRef } from 'react';\nimport {\n makeStyles,\n useTheme,\n lighten,\n CircularProgress,\n Typography\n} from '@material-ui/core';\nimport TreeView from '@material-ui/lab/TreeView';\nimport { BaseTreeMenuItem } from './BaseTreeMenuItem';\nimport {\n searchTree,\n findAllParentIds,\n getNodeIdForRightBorder\n} from '../utilities/tree/TreeUtilities';\nimport { FluentIcon } from '../utilities/FluentIcon';\nimport { CaretUpSolid8Icon, CaretDownSolid8Icon } from '@fluentui/react-icons';\nimport { cloneDeep } from 'lodash';\nimport { TreeViewModeEnums } from '../enums/unitySystemEnums.ts';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n marginBottom: theme.spacing(1.75),\n borderTop: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? `1px solid ${theme.palette.grey[200]}`\n : ''\n },\n noChildrenContainer: {\n borderBottom: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? `1px solid ${theme.palette.grey[200]}`\n : ''\n }\n}));\n\nexport const BaseTreeMenu = (props) => {\n const {\n menuItems,\n onSelectNode,\n onDropNode,\n menuIndex,\n selectedNodeId,\n selectedNodeParentId,\n sidebarExpanded,\n treeViewMode,\n childrenKey = 'children'\n } = props;\n const [expanded, setExpanded] = useState(null);\n const [isCurrentActiveTree, setIsCurrentActiveTree] = useState(false);\n const [selectedNodeIsHidden, setSelectedNodeIsHidden] = useState(false);\n const [tree, setTree] = useState(menuItems);\n const theme = useTheme();\n const classes = useStyles(props);\n const firstRender = useRef(true);\n\n const handleSelectedNode = useCallback(\n (e, value) => {\n const selectedNode = searchTree(tree, value);\n if (onSelectNode) {\n onSelectNode(selectedNode, menuIndex);\n setSelectedNodeIsHidden(false);\n }\n },\n [tree, menuIndex, onSelectNode]\n );\n\n const renderTree = useCallback(\n (node, depth = 1) => {\n let label = node.properties?.nodeLabel || node.properties?.name;\n let subLabel = node.properties?.nodeSubLabel;\n let iconName = node.properties?.defaultIcon?.name;\n let iconType = node.properties?.defaultIcon?.type;\n let conditionalIconName = node.properties?.conditionalIconName || '';\n let conditionalIconType = node.properties?.conditionalIconName\n ? node.properties.conditionalIconType\n : '';\n let conditionalIconColor = node.properties?.conditionalIconName\n ? node.properties?.conditionalIconColor\n : '';\n let nodeId = node.id;\n let iconColor = node.properties?.conditionalIconName\n ? node.properties?.conditionalIconColor\n : node.properties?.defaultIcon?.color?.hex;\n let aggregateThresholdId = node.properties?.aggregateThresholdId || '';\n\n if (node.isGroupNode) {\n label = node.properties?.label;\n subLabel = node.properties?.subLabel;\n iconName = node.properties?.icon?.name;\n iconType = node.properties?.icon?.type;\n iconColor = node.properties?.icon?.color?.hex;\n }\n\n return (\n <BaseTreeMenuItem\n key={nodeId}\n nodeId={nodeId}\n label={label}\n subLabel={subLabel}\n iconName={iconName}\n iconType={iconType}\n conditionalIconName={conditionalIconName}\n conditionalIconType={conditionalIconType}\n conditionalIconColor={conditionalIconColor}\n parentId={node.parentId}\n iconColor={iconColor}\n onNodeSelect={handleSelectedNode}\n selectedNodeId={selectedNodeId}\n isSelectedNode={selectedNodeId === node.id}\n showRightBorderColor={\n selectedNodeIsHidden &&\n isCurrentActiveTree &&\n getNodeIdForRightBorder(expanded, tree, selectedNodeParentId) ===\n node.id\n }\n isCurrentActiveTree={isCurrentActiveTree}\n sidebarExpanded={sidebarExpanded}\n depth={depth}\n hideExpansion={!!!node[childrenKey]?.length}\n node={node}\n onDropNode={onDropNode}\n treeViewMode={treeViewMode}\n menuIndex={menuIndex}\n aggregateThresholdId={aggregateThresholdId}\n >\n {node.properties?.lazyLoad &&\n !!!node[childrenKey]?.length &&\n !node.completedLoadingChildren && (\n <CircularProgress\n size={12}\n style={{ marginLeft: (depth || 1) * theme.spacing(1) }}\n />\n )}\n {node.properties?.lazyLoad &&\n !!!node[childrenKey]?.length &&\n node.completedLoadingChildren &&\n sidebarExpanded &&\n !node.errorRetrievingChildren && (\n <div className={classes.noChildrenContainer}>\n <Typography\n variant='caption'\n style={{\n marginLeft: (depth || 1) * theme.spacing(3),\n fontWeight: 400\n }}\n >\n No Children\n </Typography>\n </div>\n )}\n {node.properties?.lazyLoad &&\n node.completedLoadingChildren &&\n sidebarExpanded &&\n node.errorRetrievingChildren && (\n <div className={classes.noChildrenContainer}>\n <Typography\n variant='caption'\n style={{\n marginLeft: (depth || 1) * theme.spacing(3),\n fontWeight: 400\n }}\n >\n {`Error Retrieving ${\n !!node[childrenKey]?.length ? `Additional ` : ''\n }Children`}\n </Typography>\n </div>\n )}\n {Array.isArray(node[childrenKey])\n ? node[childrenKey].map((n, i) => renderTree(n, depth + 1))\n : null}\n </BaseTreeMenuItem>\n );\n },\n [\n handleSelectedNode,\n selectedNodeId,\n selectedNodeIsHidden,\n isCurrentActiveTree,\n sidebarExpanded,\n expanded,\n tree,\n selectedNodeParentId,\n theme,\n classes,\n onDropNode,\n treeViewMode,\n menuIndex,\n childrenKey\n ]\n );\n\n const handleNodeExpansion = useCallback(\n async (evt, nodeIds) => {\n const treeCopy = cloneDeep(tree);\n setExpanded(nodeIds);\n\n const parentNode = searchTree(treeCopy, selectedNodeParentId);\n const initialAllParentNodeIds = selectedNodeParentId\n ? [selectedNodeParentId]\n : [];\n const allParentNodeIds = findAllParentIds(\n treeCopy,\n parentNode,\n initialAllParentNodeIds\n );\n const selectedNodeShown = allParentNodeIds.every((id) =>\n nodeIds.includes(id)\n );\n if (\n isCurrentActiveTree &&\n allParentNodeIds.length &&\n !selectedNodeShown\n ) {\n setSelectedNodeIsHidden(true);\n } else {\n setSelectedNodeIsHidden(false);\n }\n },\n [isCurrentActiveTree, tree, selectedNodeParentId]\n );\n\n const getExpandedRecursively = useCallback(\n (tree) => {\n if (!tree) return [];\n return tree.reduce((expandedIds, item) => {\n if (item?.isExpanded) {\n expandedIds.push(item.id);\n }\n if (item && item[childrenKey]?.length) {\n expandedIds = expandedIds.concat(\n getExpandedRecursively(item[childrenKey])\n );\n }\n return expandedIds;\n }, []);\n },\n [childrenKey]\n );\n\n useEffect(() => {\n setTree(menuItems);\n }, [menuItems]);\n\n useEffect(() => {\n if (!tree) return;\n if (firstRender.current) {\n let expanded = [];\n if (tree?.isExpanded) {\n expanded.push(tree.id);\n }\n expanded = expanded.concat(getExpandedRecursively(tree[childrenKey]));\n setExpanded(expanded);\n firstRender.current = false;\n }\n // Do not reset expanded on subsequent updates\n }, [getExpandedRecursively, tree, childrenKey]);\n\n useEffect(() => {\n if (!!searchTree(tree, selectedNodeId)) {\n setIsCurrentActiveTree(true);\n } else {\n setIsCurrentActiveTree(false);\n }\n }, [tree, selectedNodeId]);\n\n if (!expanded) {\n return null;\n }\n\n return (\n <TreeView\n key={tree}\n className={classes.root}\n defaultCollapseIcon={\n <FluentIcon\n size='small'\n component={CaretUpSolid8Icon}\n style={{\n color: lighten(theme.palette.primary.main, 0.5),\n width: theme.spacing(1.5),\n height: theme.spacing(1.5)\n }}\n />\n }\n expanded={expanded || []}\n onNodeToggle={handleNodeExpansion}\n defaultExpandIcon={\n <FluentIcon\n size='small'\n component={CaretDownSolid8Icon}\n style={{\n color: lighten(theme.palette.primary.main, 0.5),\n width: theme.spacing(1.5),\n height: theme.spacing(1.5)\n }}\n />\n }\n selected={selectedNodeId}\n >\n {tree && renderTree(tree)}\n </TreeView>\n );\n};\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useHistory, useLocation, Prompt } from 'react-router-dom';\nimport { useAxiosGet } from '../utilities/useAxiosGet';\nimport { UtilitySideBar } from '../UI/utilityDisplay/UtilitySideBar';\nimport { makeStyles } from '@material-ui/core';\nimport { PageContainer } from '../page/PageContainer';\nimport { transformMenuPageTree } from '../utilities/tree/TreeUtilities';\nimport { BaseTreeMenu } from '../treeMenu/BaseTreeMenu';\nimport { TreeViewModeEnums } from '../enums/unitySystemEnums';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { useUser } from '../utilities/auth/useUser';\nimport { useShellStore } from '../stores/shellStore';\nimport { NodeLoader } from '../UI/feedback/NodeLoader';\nimport {\n APP_RIBBON_SPACE,\n useBuildEnvironment\n} from '../shell/ui/EnvironmentRibbon';\nimport { useSetLocationState } from '../hooks/useSetLocationState';\nimport { useTranslation } from 'react-i18next';\nimport { ConfigService } from 'udp-react-stencil-component-library';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flex: 1,\n minHeight: ({ appRibbonSpace }) => `calc(100vh - ${appRibbonSpace + 56}px)`,\n display: 'grid',\n gridTemplateAreas: ['sidebar content'].map((line) => `\"${line}\"`).join(' '),\n gridTemplateColumns: 'auto 1fr',\n gridTemplateRows: 'auto 1fr'\n },\n sidebar: {\n gridArea: 'sidebar',\n marginRight: theme.spacing(1)\n },\n content: {\n gridArea: 'content',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n zIndex: 1,\n height: ({ appRibbonSpace }) => `calc(100vh - ${appRibbonSpace + 56}px)`,\n overflowY: 'auto'\n },\n menuContent: {\n marginTop: theme.spacing(1),\n height: ({ appRibbonSpace }) => `calc(100vh - ${appRibbonSpace + 116}px)`,\n overflowX: 'hidden'\n },\n loader: {\n marginRight: theme.spacing(1),\n marginLeft: theme.spacing(1)\n },\n loadingContent: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center'\n }\n}));\n\nexport const MenuPage = (props) => {\n const buildEnv = useBuildEnvironment();\n const classes = useStyles({\n ...props,\n appRibbonSpace: buildEnv ? APP_RIBBON_SPACE : 0\n });\n const history = useHistory();\n const location = useLocation();\n const user = useUser();\n const { t } = useTranslation();\n const setLocationState = useSetLocationState();\n\n const [menuItemsList, setMenuItemsList] = useState([]); // holds a list of trees\n const [selectedNode, setSelectedNode] = useState(null);\n const [sidebarExpanded, setSidebarExpanded] = useState(true);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n // Just the menuInstanceId for an inner menu\n const innerMenuId = location.pathname.replace('/menupage/', '');\n\n const prevInnerMenuId = useRef(innerMenuId);\n\n const [{ data: innerMenu, loading: menuLoading }] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `menus/${innerMenuId}`,\n {},\n !innerMenuId,\n false\n );\n\n const { setSubHeaderActionHasChildren, setNavigationExpanded } =\n useShellStore();\n\n const [{ data: pageData, loading: pageLoading, error: pageError }] =\n useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `page/${selectedNode?.properties?.page?.id}`,\n {},\n !selectedNode?.properties?.page?.id,\n false\n );\n\n const handleSelectedNode = useCallback(\n (node, menuIndex) => {\n const searchParams = new URLSearchParams(location.search);\n searchParams.set('page', node.id);\n\n history.push({\n pathname: location.pathname,\n search: searchParams.toString()\n });\n setSelectedNode(node);\n setHasUnsavedChanges(false);\n },\n [history, location]\n );\n\n const handleDropNode = useCallback(\n (sourceNode, targetNode, sourceNodeMenuIndex, targetNodeMenuIndex) => {\n // TODO: Implement if we need to for next Phase\n },\n []\n );\n\n const handleSidebarExpandClick = useCallback(() => {\n setSidebarExpanded((expanded) => !expanded);\n }, []);\n\n const findNodeById = useCallback((node, id) => {\n if (!node) return null;\n if (node.id.toString() === id) return node;\n if (node.children) {\n for (const child of node.children) {\n const found = findNodeById(child, id);\n if (found) return found;\n }\n }\n return null;\n }, []);\n\n useEffect(() => {\n const searchParams = new URLSearchParams(location.search);\n const pageId = searchParams.get('page');\n if (pageId && menuItemsList.length > 0) {\n // Search all root menu trees for the node\n let node = null;\n for (const tree of menuItemsList) {\n node = findNodeById(tree, pageId);\n if (node) break;\n }\n if (node && node.id !== selectedNode?.id) {\n setSelectedNode(node);\n setHasUnsavedChanges(false);\n }\n }\n }, [location.search, menuItemsList, findNodeById, selectedNode]);\n\n useEffect(() => {\n const mainPageIdChanged = prevInnerMenuId.current !== innerMenuId;\n\n if (innerMenu) {\n const list = [];\n innerMenu.menuItemInstanceStructureViews.forEach((menuInstance) => {\n const updatedMenu = transformMenuPageTree(menuInstance);\n if (updatedMenu) {\n list.push(updatedMenu);\n }\n });\n setMenuItemsList(list);\n\n // Find the node matching the current page param\n const searchParams = new URLSearchParams(location.search);\n const pageId = searchParams.get('page');\n let nodeToSelect = null;\n\n if (pageId && list.length > 0) {\n // Try to find the node with this id\n for (const tree of list) {\n nodeToSelect = findNodeById(tree, pageId);\n if (nodeToSelect) break;\n }\n }\n\n // If we found a node, select it. If not, select the first node.\n if (nodeToSelect) {\n setSelectedNode(nodeToSelect);\n setHasUnsavedChanges(false);\n setNavigationExpanded(false);\n } else if (list.length > 0) {\n // No valid page param, select first node and update URL\n const firstNode = list[0];\n searchParams.set('page', firstNode.id);\n history.replace({\n pathname: location.pathname,\n search: searchParams.toString()\n });\n setSelectedNode(firstNode);\n setHasUnsavedChanges(false);\n setNavigationExpanded(false);\n }\n }\n prevInnerMenuId.current = innerMenuId;\n }, [\n innerMenu,\n setNavigationExpanded,\n history,\n location,\n innerMenuId,\n findNodeById\n ]);\n\n useEffect(() => {\n setSubHeaderActionHasChildren(false);\n }, [setSubHeaderActionHasChildren]);\n\n // Setting location state label so that if this page was saved to favorites\n // we can determine the bread crumb\n useEffect(() => {\n if (innerMenu) {\n setLocationState({ label: t(innerMenu?.name) });\n }\n }, [setLocationState, t, innerMenu]);\n\n return (\n <DndProvider backend={HTML5Backend}>\n <Prompt\n when={hasUnsavedChanges}\n message='You have unsaved changes. Are you sure you want to leave this page?'\n />\n <div className={classes.root}>\n <div className={classes.sidebar}>\n <UtilitySideBar\n title={innerMenu?.name}\n isUsingChildren={true}\n resizable={true}\n removePadding={true}\n removeTopLayoutUnit={true}\n onUtilitySidebarToggleExpandClick={handleSidebarExpandClick}\n collapsedWidth={64}\n >\n <div className={classes.menuContent} key={innerMenuId}>\n {menuItemsList?.length > 0 &&\n !menuLoading &&\n menuItemsList.map((menuItems, index) => (\n <div key={menuItems.id} className={classes.nodeContainer}>\n <BaseTreeMenu\n menuItems={menuItems}\n onSelectNode={handleSelectedNode}\n onDropNode={handleDropNode}\n menuIndex={index}\n selectedNodeId={selectedNode?.id}\n selectedNodeParentId={selectedNode?.parentId}\n sidebarExpanded={sidebarExpanded}\n treeViewMode={TreeViewModeEnums.Classic}\n />\n </div>\n ))}\n {menuLoading && (\n <div className={classes.loader}>\n <NodeLoader loading={menuLoading} />\n </div>\n )}\n </div>\n </UtilitySideBar>\n </div>\n <div className={classes.content}>\n {selectedNode?.properties?.page?.id && (\n <PageContainer\n user={user}\n key={selectedNode?.id}\n pageData={pageData}\n pageLoading={pageLoading}\n widgetParams={{\n pageId: pageData?.pageId,\n entityName: selectedNode?.properties?.page?.entity?.entityName,\n pbiReportCode: selectedNode?.properties?.page?.pbiReportCode,\n requiredFieldsMap:\n selectedNode?.properties?.page?.requiredFieldMapping,\n udpTagId: selectedNode?.properties?.page?.udpTagId,\n queryId: selectedNode?.properties?.page?.queryId,\n inquiryTreeId: selectedNode?.properties?.page?.inquiryTreeId,\n setHasUnsavedChanges: setHasUnsavedChanges\n }}\n disableMargins={true}\n fromMenu={true}\n />\n )}\n </div>\n </div>\n </DndProvider>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MenuPage-CZHpoopY.js","names":["useStyles","other","useStyles","tree","expanded"],"sources":["../src/treeMenu/BaseTreeMenuItem.jsx","../src/treeMenu/BaseTreeMenu.jsx","../src/menuPage/MenuPage.jsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport {\n makeStyles,\n lighten,\n Typography,\n CircularProgress,\n darken,\n useTheme,\n Tooltip\n} from '@material-ui/core';\nimport TreeItem from '@material-ui/lab/TreeItem';\nimport { getIconFromName } from '../utilities/tree/TreeUtilities';\nimport clsx from 'clsx';\nimport { UnityFluentIcon } from '../utilities/UnityFluentIcon';\nimport { getUnityIconFromName } from '../utilities/iconLibrary/UnityIconLibrary';\nimport { useDrag, useDrop } from 'react-dnd';\nimport {\n NodeActionTriggerEnums,\n TreeViewModeEnums\n} from '../enums/unitySystemEnums.ts';\nimport { AggregateChip } from '../UI/utilityDisplay/AggregateChip';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n '&.Mui-selected > .MuiTreeItem-content': {\n backgroundColor:\n theme?.getThemeData()?.mode === 'dark'\n ? theme.palette.grey[700]\n : theme.palette.grey[300],\n borderRight: `4px solid ${theme.palette.primary.main}`\n },\n '&.Mui-selected > .MuiTreeItem-content .MuiTreeItem-label': {\n backgroundColor: 'transparent',\n paddingLeft: 0\n },\n '&.Mui-selected > .MuiTreeItem-content > .MuiCollapse-wrapperInner': {\n backgroundColor:\n theme?.getThemeData()?.mode !== 'dark' && theme.palette.grey[50]\n },\n '& .MuiTreeItem-content .MuiTreeItem-iconContainer': {\n display: (props) => (props.sidebarExpanded ? 'flex' : 'none')\n }\n },\n content: {\n backgroundColor: (props) =>\n theme?.getThemeData()?.mode !== 'dark' &&\n props.conditionalIconName &&\n props.conditionalIconColor\n ? lighten(props.conditionalIconColor, 0.92)\n : ''\n },\n labelRoot: {\n display: 'flex',\n alignItems: 'center',\n marginLeft: (props) => (props.sidebarExpanded ? 0 : theme.spacing(1.5)),\n width: '100%'\n },\n labelContainer: {\n display: (props) => (!props.sidebarExpanded ? 'none' : ''),\n width: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? `calc(100% - ${theme.spacing(6.25)}px)`\n : `calc(100% - ${theme.spacing(7.75)}px)`\n },\n conditionalIconContainer: {\n display: 'inline-flex'\n },\n labelText: {\n fontSize: '0.75rem',\n fontWeight: 600,\n lineHeight: '1rem',\n letterSpacing: 0.1\n },\n captionText: {\n marginLeft: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact ? theme.spacing(1) : '',\n fontSize: '0.65rem',\n fontWeight: 400,\n lineHeight: 1,\n letterSpacing: 0.4\n },\n labelOverflow: {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n },\n group: {\n width: '100%',\n '& .MuiTreeItem-group': {\n marginLeft: 0\n },\n '& .MuiTreeItem-content': {\n paddingLeft: (props) =>\n props.sidebarExpanded ? (props.depth || 1) * theme.spacing(1) : 0,\n borderRight: (props) =>\n props.showRightBorderColor\n ? `4px solid ${theme.palette.primary.main}`\n : '',\n borderBottom: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? `1px solid ${theme.palette.grey[200]}`\n : ''\n },\n '& .MuiTreeItem-content .MuiTreeItem-label': {\n paddingLeft: 0,\n width: (props) =>\n props.sidebarExpanded && `calc(100% - ${theme.spacing(2.5)}px)`\n },\n '& .MuiTreeItem-content .MuiTreeItem-iconContainer span': {\n display: (props) => (props.hideExpansion ? 'none' : '')\n },\n '& .MuiCollapse-wrapperInner': {\n backgroundColor: (props) =>\n theme?.getThemeData()?.mode !== 'dark' && props.isSelectedNode\n ? theme.palette.grey[50]\n : ''\n }\n },\n iconContainer: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 50,\n marginTop: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? theme.spacing(0.25)\n : theme.spacing(0.5),\n marginBottom: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? theme.spacing(0.25)\n : theme.spacing(0.5),\n marginRight: theme.spacing(1),\n width: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? theme.spacing(3)\n : theme.spacing(4),\n height: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? theme.spacing(3)\n : theme.spacing(4),\n border: (props) =>\n props.iconColor\n ? `1px solid ${darken(props.iconColor, 0.1)}`\n : `1px solid ${theme.palette.secondary.main}`,\n backgroundColor: '#ffffff'\n }\n}));\n\nexport const BaseTreeMenuItem = (props) => {\n const {\n parentId,\n nodeId,\n iconName,\n iconType,\n conditionalIconName,\n conditionalIconType,\n conditionalIconColor,\n label,\n iconColor,\n onNodeSelect,\n isSelectedNode,\n subLabel,\n sidebarExpanded,\n isLastNode,\n loading,\n node,\n onDropNode,\n treeViewMode,\n menuIndex,\n aggregateThresholdId,\n ...other\n } = props;\n const classes = useStyles(props);\n const theme = useTheme();\n\n const [{ isDragging }, dragRef] = useDrag({\n type: 'BaseTreeMenuItem',\n item: { ...node, sourceNodeMenuIndex: menuIndex },\n collect: (monitor) => ({\n isDragging: monitor.isDragging()\n })\n });\n\n const handleOnDrop = useCallback(\n (sourceNode, monitor) => {\n if (!monitor.didDrop()) {\n if (onDropNode) {\n const { sourceNodeMenuIndex, ...other } = sourceNode;\n onDropNode({ ...other }, node, sourceNodeMenuIndex, menuIndex);\n }\n }\n },\n [onDropNode, node, menuIndex]\n );\n\n const [{ canDrop, isOver }, dropRef] = useDrop(\n () => ({\n accept: ['BaseTreeMenuItem'],\n drop: (sourceNode, monitor) => {\n // condition to only handle first drop\n handleOnDrop(sourceNode, monitor);\n },\n canDrop: (sourceNode) => checkCanDrop(sourceNode),\n collect: (monitor) => ({\n isOver: monitor.isOver(),\n canDrop: !!monitor.canDrop()\n })\n }),\n [handleOnDrop]\n );\n\n const checkCanDrop = useCallback(\n (sourceNode) => {\n if (sourceNode) {\n const onDropActions = node?.properties?.nodeActions?.filter(\n (na) => na?.triggerType === NodeActionTriggerEnums.On_Node_Drop\n );\n if (!onDropActions) {\n return false;\n }\n const nodeDragEntities = onDropActions?.map(\n (action) => action?.dragEntityName\n );\n return nodeDragEntities.includes(\n sourceNode?.properties?.catalogReturnObject\n );\n }\n },\n [node]\n );\n\n const handleOnLabelClick = useCallback(\n (e) => {\n e.preventDefault();\n onNodeSelect(e, nodeId);\n },\n [onNodeSelect, nodeId]\n );\n\n return (\n <TreeItem\n className={classes.group}\n key={nodeId}\n nodeId={nodeId}\n label={\n <div ref={dropRef}>\n <Tooltip title={sidebarExpanded ? '' : label}>\n <div\n ref={(node?.properties?.isDraggable && dragRef) || null}\n style={{ opacity: isDragging ? 0.5 : 1 }}\n >\n {loading ? (\n <CircularProgress size={12} />\n ) : (\n <div\n id={'udpRecord-BaseTreeMenuItem-'+label.replace(/\\s+/g, '')}\n udprecordid={'udpRecord-BaseTreeMenuItem-'+label.replace(/\\s+/g, '')}\n className={classes.labelRoot}\n style={{\n fontWeight: isSelectedNode ? 'bold' : ''\n }}\n >\n {iconName && (\n <div className={classes.iconContainer}>\n <UnityFluentIcon\n size={\n treeViewMode === TreeViewModeEnums.Compact\n ? 'small'\n : 'medium'\n }\n color={iconColor}\n type={iconType}\n icon={\n iconType === 'unity'\n ? getUnityIconFromName(iconName)\n : getIconFromName(iconName)\n }\n style={{\n color: iconColor\n ? darken(iconColor, 0.1)\n : theme.palette.secondary.main\n }}\n />\n </div>\n )}\n <div className={classes.labelContainer}>\n <Typography\n variant='subtitle2'\n className={clsx(classes.labelText, classes.labelOverflow)}\n >\n {label}\n {subLabel &&\n treeViewMode === TreeViewModeEnums.Compact && (\n <Typography\n variant='caption'\n className={clsx(\n classes.captionText,\n classes.labelOverflow\n )}\n >\n {subLabel}\n </Typography>\n )}\n </Typography>\n {subLabel && treeViewMode === TreeViewModeEnums.Classic && (\n <div className={classes.labelOverflow}>\n <Typography\n variant='caption'\n className={clsx(classes.captionText)}\n >\n {subLabel}\n </Typography>\n </div>\n )}\n </div>\n <AggregateChip aggregateThresholdId={aggregateThresholdId} />\n {conditionalIconName && sidebarExpanded && (\n <div className={classes.conditionalIconContainer}>\n <UnityFluentIcon\n size={\n treeViewMode === TreeViewModeEnums.Compact\n ? 'small'\n : 'medium'\n }\n color={conditionalIconColor}\n type={conditionalIconType}\n icon={\n conditionalIconType === 'unity'\n ? getUnityIconFromName(conditionalIconName)\n : getIconFromName(conditionalIconName)\n }\n style={{\n color: conditionalIconColor\n }}\n />\n </div>\n )}\n </div>\n )}\n </div>\n </Tooltip>\n </div>\n }\n onLabelClick={handleOnLabelClick}\n classes={{ root: classes.root, content: classes.content }}\n {...other}\n />\n );\n};\n","import React, { useCallback, useState, useEffect, useRef } from 'react';\nimport {\n makeStyles,\n useTheme,\n lighten,\n CircularProgress,\n Typography\n} from '@material-ui/core';\nimport TreeView from '@material-ui/lab/TreeView';\nimport { BaseTreeMenuItem } from './BaseTreeMenuItem';\nimport {\n searchTree,\n findAllParentIds,\n getNodeIdForRightBorder\n} from '../utilities/tree/TreeUtilities';\nimport { FluentIcon } from '../utilities/FluentIcon';\nimport { CaretUpSolid8Icon, CaretDownSolid8Icon } from '@fluentui/react-icons';\nimport { cloneDeep } from 'lodash';\nimport { TreeViewModeEnums } from '../enums/unitySystemEnums.ts';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n marginBottom: theme.spacing(1.75),\n borderTop: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? `1px solid ${theme.palette.grey[200]}`\n : ''\n },\n noChildrenContainer: {\n borderBottom: (props) =>\n props.treeViewMode === TreeViewModeEnums.Compact\n ? `1px solid ${theme.palette.grey[200]}`\n : ''\n }\n}));\n\nexport const BaseTreeMenu = (props) => {\n const {\n menuItems,\n onSelectNode,\n onDropNode,\n menuIndex,\n selectedNodeId,\n selectedNodeParentId,\n sidebarExpanded,\n treeViewMode,\n childrenKey = 'children'\n } = props;\n const [expanded, setExpanded] = useState(null);\n const [isCurrentActiveTree, setIsCurrentActiveTree] = useState(false);\n const [selectedNodeIsHidden, setSelectedNodeIsHidden] = useState(false);\n const [tree, setTree] = useState(menuItems);\n const theme = useTheme();\n const classes = useStyles(props);\n const firstRender = useRef(true);\n\n const handleSelectedNode = useCallback(\n (e, value) => {\n const selectedNode = searchTree(tree, value);\n if (onSelectNode) {\n onSelectNode(selectedNode, menuIndex);\n setSelectedNodeIsHidden(false);\n }\n },\n [tree, menuIndex, onSelectNode]\n );\n\n const renderTree = useCallback(\n (node, depth = 1) => {\n let label = node.properties?.nodeLabel || node.properties?.name;\n let subLabel = node.properties?.nodeSubLabel;\n let iconName = node.properties?.defaultIcon?.name;\n let iconType = node.properties?.defaultIcon?.type;\n let conditionalIconName = node.properties?.conditionalIconName || '';\n let conditionalIconType = node.properties?.conditionalIconName\n ? node.properties.conditionalIconType\n : '';\n let conditionalIconColor = node.properties?.conditionalIconName\n ? node.properties?.conditionalIconColor\n : '';\n let nodeId = node.id;\n let iconColor = node.properties?.conditionalIconName\n ? node.properties?.conditionalIconColor\n : node.properties?.defaultIcon?.color?.hex;\n let aggregateThresholdId = node.properties?.aggregateThresholdId || '';\n\n if (node.isGroupNode) {\n label = node.properties?.label;\n subLabel = node.properties?.subLabel;\n iconName = node.properties?.icon?.name;\n iconType = node.properties?.icon?.type;\n iconColor = node.properties?.icon?.color?.hex;\n }\n\n return (\n <BaseTreeMenuItem\n key={nodeId}\n nodeId={nodeId}\n label={label}\n subLabel={subLabel}\n iconName={iconName}\n iconType={iconType}\n conditionalIconName={conditionalIconName}\n conditionalIconType={conditionalIconType}\n conditionalIconColor={conditionalIconColor}\n parentId={node.parentId}\n iconColor={iconColor}\n onNodeSelect={handleSelectedNode}\n selectedNodeId={selectedNodeId}\n isSelectedNode={selectedNodeId === node.id}\n showRightBorderColor={\n selectedNodeIsHidden &&\n isCurrentActiveTree &&\n getNodeIdForRightBorder(expanded, tree, selectedNodeParentId) ===\n node.id\n }\n isCurrentActiveTree={isCurrentActiveTree}\n sidebarExpanded={sidebarExpanded}\n depth={depth}\n hideExpansion={!!!node[childrenKey]?.length}\n node={node}\n onDropNode={onDropNode}\n treeViewMode={treeViewMode}\n menuIndex={menuIndex}\n aggregateThresholdId={aggregateThresholdId}\n >\n {node.properties?.lazyLoad &&\n !!!node[childrenKey]?.length &&\n !node.completedLoadingChildren && (\n <CircularProgress\n size={12}\n style={{ marginLeft: (depth || 1) * theme.spacing(1) }}\n />\n )}\n {node.properties?.lazyLoad &&\n !!!node[childrenKey]?.length &&\n node.completedLoadingChildren &&\n sidebarExpanded &&\n !node.errorRetrievingChildren && (\n <div className={classes.noChildrenContainer}>\n <Typography\n variant='caption'\n style={{\n marginLeft: (depth || 1) * theme.spacing(3),\n fontWeight: 400\n }}\n >\n No Children\n </Typography>\n </div>\n )}\n {node.properties?.lazyLoad &&\n node.completedLoadingChildren &&\n sidebarExpanded &&\n node.errorRetrievingChildren && (\n <div className={classes.noChildrenContainer}>\n <Typography\n variant='caption'\n style={{\n marginLeft: (depth || 1) * theme.spacing(3),\n fontWeight: 400\n }}\n >\n {`Error Retrieving ${\n !!node[childrenKey]?.length ? `Additional ` : ''\n }Children`}\n </Typography>\n </div>\n )}\n {Array.isArray(node[childrenKey])\n ? node[childrenKey].map((n, i) => renderTree(n, depth + 1))\n : null}\n </BaseTreeMenuItem>\n );\n },\n [\n handleSelectedNode,\n selectedNodeId,\n selectedNodeIsHidden,\n isCurrentActiveTree,\n sidebarExpanded,\n expanded,\n tree,\n selectedNodeParentId,\n theme,\n classes,\n onDropNode,\n treeViewMode,\n menuIndex,\n childrenKey\n ]\n );\n\n const handleNodeExpansion = useCallback(\n async (evt, nodeIds) => {\n const treeCopy = cloneDeep(tree);\n setExpanded(nodeIds);\n\n const parentNode = searchTree(treeCopy, selectedNodeParentId);\n const initialAllParentNodeIds = selectedNodeParentId\n ? [selectedNodeParentId]\n : [];\n const allParentNodeIds = findAllParentIds(\n treeCopy,\n parentNode,\n initialAllParentNodeIds\n );\n const selectedNodeShown = allParentNodeIds.every((id) =>\n nodeIds.includes(id)\n );\n if (\n isCurrentActiveTree &&\n allParentNodeIds.length &&\n !selectedNodeShown\n ) {\n setSelectedNodeIsHidden(true);\n } else {\n setSelectedNodeIsHidden(false);\n }\n },\n [isCurrentActiveTree, tree, selectedNodeParentId]\n );\n\n const getExpandedRecursively = useCallback(\n (tree) => {\n if (!tree) return [];\n return tree.reduce((expandedIds, item) => {\n if (item?.isExpanded) {\n expandedIds.push(item.id);\n }\n if (item && item[childrenKey]?.length) {\n expandedIds = expandedIds.concat(\n getExpandedRecursively(item[childrenKey])\n );\n }\n return expandedIds;\n }, []);\n },\n [childrenKey]\n );\n\n useEffect(() => {\n setTree(menuItems);\n }, [menuItems]);\n\n useEffect(() => {\n if (!tree) return;\n if (firstRender.current) {\n let expanded = [];\n if (tree?.isExpanded) {\n expanded.push(tree.id);\n }\n expanded = expanded.concat(getExpandedRecursively(tree[childrenKey]));\n setExpanded(expanded);\n firstRender.current = false;\n }\n // Do not reset expanded on subsequent updates\n }, [getExpandedRecursively, tree, childrenKey]);\n\n useEffect(() => {\n if (!!searchTree(tree, selectedNodeId)) {\n setIsCurrentActiveTree(true);\n } else {\n setIsCurrentActiveTree(false);\n }\n }, [tree, selectedNodeId]);\n\n if (!expanded) {\n return null;\n }\n\n return (\n <TreeView\n key={tree}\n className={classes.root}\n defaultCollapseIcon={\n <FluentIcon\n size='small'\n component={CaretUpSolid8Icon}\n style={{\n color: lighten(theme.palette.primary.main, 0.5),\n width: theme.spacing(1.5),\n height: theme.spacing(1.5)\n }}\n />\n }\n expanded={expanded || []}\n onNodeToggle={handleNodeExpansion}\n defaultExpandIcon={\n <FluentIcon\n size='small'\n component={CaretDownSolid8Icon}\n style={{\n color: lighten(theme.palette.primary.main, 0.5),\n width: theme.spacing(1.5),\n height: theme.spacing(1.5)\n }}\n />\n }\n selected={selectedNodeId}\n >\n {tree && renderTree(tree)}\n </TreeView>\n );\n};\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useHistory, useLocation, Prompt } from 'react-router-dom';\nimport { useAxiosGet } from '../utilities/useAxiosGet';\nimport { UtilitySideBar } from '../UI/utilityDisplay/UtilitySideBar';\nimport { makeStyles } from '@material-ui/core';\nimport { PageContainer } from '../page/PageContainer';\nimport { transformMenuPageTree } from '../utilities/tree/TreeUtilities';\nimport { BaseTreeMenu } from '../treeMenu/BaseTreeMenu';\nimport { TreeViewModeEnums } from '../enums/unitySystemEnums';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { useUser } from '../utilities/auth/useUser';\nimport { useShellStore } from '../stores/shellStore';\nimport { NodeLoader } from '../UI/feedback/NodeLoader';\nimport {\n APP_RIBBON_SPACE,\n useBuildEnvironment\n} from '../shell/ui/EnvironmentRibbon';\nimport { useSetLocationState } from '../hooks/useSetLocationState';\nimport { useTranslation } from 'react-i18next';\nimport { ConfigService } from 'udp-react-stencil-component-library';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flex: 1,\n minHeight: ({ appRibbonSpace }) => `calc(100vh - ${appRibbonSpace + 56}px)`,\n display: 'grid',\n gridTemplateAreas: ['sidebar content'].map((line) => `\"${line}\"`).join(' '),\n gridTemplateColumns: 'auto 1fr',\n gridTemplateRows: 'auto 1fr'\n },\n sidebar: {\n gridArea: 'sidebar',\n marginRight: theme.spacing(1)\n },\n content: {\n gridArea: 'content',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n zIndex: 1,\n height: ({ appRibbonSpace }) => `calc(100vh - ${appRibbonSpace + 56}px)`,\n overflowY: 'auto'\n },\n menuContent: {\n marginTop: theme.spacing(1),\n height: ({ appRibbonSpace }) => `calc(100vh - ${appRibbonSpace + 116}px)`,\n overflowX: 'hidden'\n },\n loader: {\n marginRight: theme.spacing(1),\n marginLeft: theme.spacing(1)\n },\n loadingContent: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center'\n }\n}));\n\nconst MenuPage = (props) => {\n const buildEnv = useBuildEnvironment();\n const classes = useStyles({\n ...props,\n appRibbonSpace: buildEnv ? APP_RIBBON_SPACE : 0\n });\n const history = useHistory();\n const location = useLocation();\n const user = useUser();\n const { t } = useTranslation();\n const setLocationState = useSetLocationState();\n\n const [menuItemsList, setMenuItemsList] = useState([]); // holds a list of trees\n const [selectedNode, setSelectedNode] = useState(null);\n const [sidebarExpanded, setSidebarExpanded] = useState(true);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n // Just the menuInstanceId for an inner menu\n const innerMenuId = location.pathname.replace('/menupage/', '');\n\n const prevInnerMenuId = useRef(innerMenuId);\n\n const [{ data: innerMenu, loading: menuLoading }] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `menus/${innerMenuId}`,\n {},\n !innerMenuId,\n false\n );\n\n const { setSubHeaderActionHasChildren, setNavigationExpanded } =\n useShellStore();\n\n const [{ data: pageData, loading: pageLoading, error: pageError }] =\n useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `page/${selectedNode?.properties?.page?.id}`,\n {},\n !selectedNode?.properties?.page?.id,\n false\n );\n\n const handleSelectedNode = useCallback(\n (node, menuIndex) => {\n const searchParams = new URLSearchParams(location.search);\n searchParams.set('page', node.id);\n\n history.push({\n pathname: location.pathname,\n search: searchParams.toString()\n });\n setSelectedNode(node);\n setHasUnsavedChanges(false);\n },\n [history, location]\n );\n\n const handleDropNode = useCallback(\n (sourceNode, targetNode, sourceNodeMenuIndex, targetNodeMenuIndex) => {\n // TODO: Implement if we need to for next Phase\n },\n []\n );\n\n const handleSidebarExpandClick = useCallback(() => {\n setSidebarExpanded((expanded) => !expanded);\n }, []);\n\n const findNodeById = useCallback((node, id) => {\n if (!node) return null;\n if (node.id.toString() === id) return node;\n if (node.children) {\n for (const child of node.children) {\n const found = findNodeById(child, id);\n if (found) return found;\n }\n }\n return null;\n }, []);\n\n useEffect(() => {\n const searchParams = new URLSearchParams(location.search);\n const pageId = searchParams.get('page');\n if (pageId && menuItemsList.length > 0) {\n // Search all root menu trees for the node\n let node = null;\n for (const tree of menuItemsList) {\n node = findNodeById(tree, pageId);\n if (node) break;\n }\n if (node && node.id !== selectedNode?.id) {\n setSelectedNode(node);\n setHasUnsavedChanges(false);\n }\n }\n }, [location.search, menuItemsList, findNodeById, selectedNode]);\n\n useEffect(() => {\n const mainPageIdChanged = prevInnerMenuId.current !== innerMenuId;\n\n if (innerMenu) {\n const list = [];\n innerMenu.menuItemInstanceStructureViews.forEach((menuInstance) => {\n const updatedMenu = transformMenuPageTree(menuInstance);\n if (updatedMenu) {\n list.push(updatedMenu);\n }\n });\n setMenuItemsList(list);\n\n // Find the node matching the current page param\n const searchParams = new URLSearchParams(location.search);\n const pageId = searchParams.get('page');\n let nodeToSelect = null;\n\n if (pageId && list.length > 0) {\n // Try to find the node with this id\n for (const tree of list) {\n nodeToSelect = findNodeById(tree, pageId);\n if (nodeToSelect) break;\n }\n }\n\n // If we found a node, select it. If not, select the first node.\n if (nodeToSelect) {\n setSelectedNode(nodeToSelect);\n setHasUnsavedChanges(false);\n setNavigationExpanded(false);\n } else if (list.length > 0) {\n // No valid page param, select first node and update URL\n const firstNode = list[0];\n searchParams.set('page', firstNode.id);\n history.replace({\n pathname: location.pathname,\n search: searchParams.toString()\n });\n setSelectedNode(firstNode);\n setHasUnsavedChanges(false);\n setNavigationExpanded(false);\n }\n }\n prevInnerMenuId.current = innerMenuId;\n }, [\n innerMenu,\n setNavigationExpanded,\n history,\n location,\n innerMenuId,\n findNodeById\n ]);\n\n useEffect(() => {\n setSubHeaderActionHasChildren(false);\n }, [setSubHeaderActionHasChildren]);\n\n // Setting location state label so that if this page was saved to favorites\n // we can determine the bread crumb\n useEffect(() => {\n if (innerMenu) {\n setLocationState({ label: t(innerMenu?.name) });\n }\n }, [setLocationState, t, innerMenu]);\n\n return (\n <DndProvider backend={HTML5Backend}>\n <Prompt\n when={hasUnsavedChanges}\n message='You have unsaved changes. Are you sure you want to leave this page?'\n />\n <div className={classes.root}>\n <div className={classes.sidebar}>\n <UtilitySideBar\n title={innerMenu?.name}\n isUsingChildren={true}\n resizable={true}\n removePadding={true}\n removeTopLayoutUnit={true}\n onUtilitySidebarToggleExpandClick={handleSidebarExpandClick}\n collapsedWidth={64}\n >\n <div className={classes.menuContent} key={innerMenuId}>\n {menuItemsList?.length > 0 &&\n !menuLoading &&\n menuItemsList.map((menuItems, index) => (\n <div key={menuItems.id} className={classes.nodeContainer}>\n <BaseTreeMenu\n menuItems={menuItems}\n onSelectNode={handleSelectedNode}\n onDropNode={handleDropNode}\n menuIndex={index}\n selectedNodeId={selectedNode?.id}\n selectedNodeParentId={selectedNode?.parentId}\n sidebarExpanded={sidebarExpanded}\n treeViewMode={TreeViewModeEnums.Classic}\n />\n </div>\n ))}\n {menuLoading && (\n <div className={classes.loader}>\n <NodeLoader loading={menuLoading} />\n </div>\n )}\n </div>\n </UtilitySideBar>\n </div>\n <div className={classes.content}>\n {selectedNode?.properties?.page?.id && (\n <PageContainer\n user={user}\n key={selectedNode?.id}\n pageData={pageData}\n pageLoading={pageLoading}\n widgetParams={{\n pageId: pageData?.pageId,\n entityName: selectedNode?.properties?.page?.entity?.entityName,\n pbiReportCode: selectedNode?.properties?.page?.pbiReportCode,\n requiredFieldsMap:\n selectedNode?.properties?.page?.requiredFieldMapping,\n udpTagId: selectedNode?.properties?.page?.udpTagId,\n queryId: selectedNode?.properties?.page?.queryId,\n inquiryTreeId: selectedNode?.properties?.page?.inquiryTreeId,\n setHasUnsavedChanges: setHasUnsavedChanges\n }}\n disableMargins={true}\n fromMenu={true}\n />\n )}\n </div>\n </div>\n </DndProvider>\n );\n};\n\nexport default MenuPage;\n"],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { ActionsRenderer, AmbientGridTemplate, FilterOperators, FluentDialog,
|
|
2
|
-
import { FluentButton, FluentIcon, LayoutUnit, LogicalSearchOperatorEnums, SearchGroupingType, SearchSortDirection, StatusChip, executeQueryAdHoc, executeQueryWithParameters,
|
|
3
|
-
import { useHandleAxiosSnackbar } from "./apiHelpers-
|
|
4
|
-
import {
|
|
1
|
+
import { ActionsRenderer, AmbientGridTemplate, FilterOperators, FluentDialog, useAgGridApi } from "./AmbientGridTemplate-6xfwTiz-.js";
|
|
2
|
+
import { FluentButton, FluentIcon, LayoutUnit, LogicalSearchOperatorEnums, SearchGroupingType, SearchSortDirection, StatusChip, executeQueryAdHoc, executeQueryWithParameters, useBuildEnvironment } from "./EnvironmentRibbon-oEmbWjEq.js";
|
|
3
|
+
import { useHandleAxiosSnackbar } from "./apiHelpers-CmM6DWAT.js";
|
|
4
|
+
import { useAxiosGet, useUser } from "./useAxiosGet-Dh5pVURP.js";
|
|
5
|
+
import { getSanitizedName } from "./entityUtilities-Dy-jsB5c.js";
|
|
6
|
+
import { getSearchObject } from "./SearchUtilities-Btugro8y.js";
|
|
5
7
|
import React, { useCallback, useEffect, useMemo, useState } from "react";
|
|
6
8
|
import { Box, Button, Popper, TextField, Typography, makeStyles } from "@material-ui/core";
|
|
7
9
|
import { ConfigService } from "udp-react-stencil-component-library";
|
|
@@ -12,6 +14,45 @@ import PropTypes from "prop-types";
|
|
|
12
14
|
import { cloneDeep } from "lodash";
|
|
13
15
|
import { Alert, AlertTitle } from "@material-ui/lab";
|
|
14
16
|
|
|
17
|
+
//#region src/maintenanceEngine/tableBrowser/TableColumnDefs.js
|
|
18
|
+
const TableColumnDefs = (actionList) => {
|
|
19
|
+
const getterRowData = useCallback((params) => {
|
|
20
|
+
return params.data;
|
|
21
|
+
}, []);
|
|
22
|
+
return [{
|
|
23
|
+
headerName: "Name",
|
|
24
|
+
field: "entityName",
|
|
25
|
+
valueGetter: (params) => params.data?.properties?.displayName || params.data?.sanitizedName || getSanitizedName(params.data?.entityName),
|
|
26
|
+
wrapText: true,
|
|
27
|
+
autoHeight: false,
|
|
28
|
+
sortable: false
|
|
29
|
+
}, {
|
|
30
|
+
headerName: "Actions",
|
|
31
|
+
filter: false,
|
|
32
|
+
pinned: "right",
|
|
33
|
+
cellRenderer: "actionsRenderer",
|
|
34
|
+
width: 150,
|
|
35
|
+
cellRendererParams: { actionList },
|
|
36
|
+
valueGetter: getterRowData,
|
|
37
|
+
maxWidth: 180,
|
|
38
|
+
suppressMenu: true,
|
|
39
|
+
sortable: false,
|
|
40
|
+
cellStyle: {
|
|
41
|
+
display: "flex",
|
|
42
|
+
alignItems: "center"
|
|
43
|
+
}
|
|
44
|
+
}];
|
|
45
|
+
};
|
|
46
|
+
const defaultColumnActionsDef = {
|
|
47
|
+
resizable: true,
|
|
48
|
+
editable: false,
|
|
49
|
+
sortable: true,
|
|
50
|
+
filter: true,
|
|
51
|
+
floatingFilter: false,
|
|
52
|
+
enableRowGroup: true
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
//#endregion
|
|
15
56
|
//#region src/utilities/aggrid/datasources/SearchServiceDatasource.js
|
|
16
57
|
const SearchServiceDatasource = (queryData, apiMethodId, searchFilterElements, logicalSearchOperator = LogicalSearchOperatorEnums.And, executeQuery, storeRowData, lookupsMap, eagerLoad = false, getCleanData = null) => {
|
|
17
58
|
return { async getRows(params) {
|
|
@@ -49,8 +90,7 @@ const SearchServiceDatasource = (queryData, apiMethodId, searchFilterElements, l
|
|
|
49
90
|
if (!searchObject.groupProperty.includes(formattedPropertyName)) {
|
|
50
91
|
searchObject.groupProperty.push(formattedPropertyName);
|
|
51
92
|
const orderElements = searchObject.orderElements;
|
|
52
|
-
|
|
53
|
-
if (!element) orderElements.push({
|
|
93
|
+
if (!orderElements.find((element) => element.sortColumn === formattedPropertyName)) orderElements.push({
|
|
54
94
|
sortColumn: formattedPropertyName,
|
|
55
95
|
sortDirection: SearchSortDirection.Asc
|
|
56
96
|
});
|
|
@@ -114,8 +154,7 @@ const SearchServiceDatasource = (queryData, apiMethodId, searchFilterElements, l
|
|
|
114
154
|
if (!searchObject.groupProperty.includes(formattedPropertyName)) {
|
|
115
155
|
searchObject.groupProperty.push(formattedPropertyName);
|
|
116
156
|
const orderElements = searchObject.orderElements;
|
|
117
|
-
|
|
118
|
-
if (!element) orderElements.push({
|
|
157
|
+
if (!orderElements.find((element) => element.sortColumn === formattedPropertyName)) orderElements.push({
|
|
119
158
|
sortColumn: formattedPropertyName,
|
|
120
159
|
sortDirection: SearchSortDirection.Asc
|
|
121
160
|
});
|
|
@@ -136,13 +175,10 @@ const SearchServiceDatasource = (queryData, apiMethodId, searchFilterElements, l
|
|
|
136
175
|
}
|
|
137
176
|
else {
|
|
138
177
|
let response = null;
|
|
139
|
-
if (executeQuery) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
rowCount: 0
|
|
144
|
-
}));
|
|
145
|
-
}
|
|
178
|
+
if (executeQuery) response = await executeQuery({ data: searchObject }, apiMethodId, lookupsMap).catch((e) => params.success({
|
|
179
|
+
rowData: [],
|
|
180
|
+
rowCount: 0
|
|
181
|
+
}));
|
|
146
182
|
const rowData = response?.status === 200 ? response?.data : response;
|
|
147
183
|
if (rowData && response) if (rowData?.pageList?.length > 0) {
|
|
148
184
|
params.success({
|
|
@@ -168,46 +204,6 @@ const SearchServiceDatasource = (queryData, apiMethodId, searchFilterElements, l
|
|
|
168
204
|
} };
|
|
169
205
|
};
|
|
170
206
|
|
|
171
|
-
//#endregion
|
|
172
|
-
//#region src/maintenanceEngine/tableBrowser/TableColumnDefs.js
|
|
173
|
-
const TableColumnDefs = (actionList) => {
|
|
174
|
-
const getterRowData = useCallback((params) => {
|
|
175
|
-
return params.data;
|
|
176
|
-
}, []);
|
|
177
|
-
const columnDefs = [{
|
|
178
|
-
headerName: "Name",
|
|
179
|
-
field: "entityName",
|
|
180
|
-
valueGetter: (params) => params.data?.properties?.displayName || params.data?.sanitizedName || getSanitizedName(params.data?.entityName),
|
|
181
|
-
wrapText: true,
|
|
182
|
-
autoHeight: false,
|
|
183
|
-
sortable: false
|
|
184
|
-
}, {
|
|
185
|
-
headerName: "Actions",
|
|
186
|
-
filter: false,
|
|
187
|
-
pinned: "right",
|
|
188
|
-
cellRenderer: "actionsRenderer",
|
|
189
|
-
width: 150,
|
|
190
|
-
cellRendererParams: { actionList },
|
|
191
|
-
valueGetter: getterRowData,
|
|
192
|
-
maxWidth: 180,
|
|
193
|
-
suppressMenu: true,
|
|
194
|
-
sortable: false,
|
|
195
|
-
cellStyle: {
|
|
196
|
-
display: "flex",
|
|
197
|
-
alignItems: "center"
|
|
198
|
-
}
|
|
199
|
-
}];
|
|
200
|
-
return columnDefs;
|
|
201
|
-
};
|
|
202
|
-
const defaultColumnActionsDef = {
|
|
203
|
-
resizable: true,
|
|
204
|
-
editable: false,
|
|
205
|
-
sortable: true,
|
|
206
|
-
filter: true,
|
|
207
|
-
floatingFilter: false,
|
|
208
|
-
enableRowGroup: true
|
|
209
|
-
};
|
|
210
|
-
|
|
211
207
|
//#endregion
|
|
212
208
|
//#region src/maintenanceEngine/tableBrowser/TableContainer.jsx
|
|
213
209
|
const TableContainer$1 = (props) => {
|
|
@@ -436,19 +432,10 @@ const useStyles = makeStyles((theme) => ({
|
|
|
436
432
|
const AmbientAlert = ({ alertButton, alertMessage, alertTitle, showAlert, alertSeverity, closeAlert, alertAction, alertActionButton, alertHandleAction,...otherProps }) => {
|
|
437
433
|
const classes = useStyles();
|
|
438
434
|
const alertColor = () => {
|
|
439
|
-
if (alertSeverity === "success")
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
let alertLevel = classes.alertWarning;
|
|
444
|
-
return alertLevel;
|
|
445
|
-
} else if (alertSeverity === "error") {
|
|
446
|
-
let alertLevel = classes.alertError;
|
|
447
|
-
return alertLevel;
|
|
448
|
-
} else if (alertSeverity === "info") {
|
|
449
|
-
let alertLevel = classes.alertInfo;
|
|
450
|
-
return alertLevel;
|
|
451
|
-
}
|
|
435
|
+
if (alertSeverity === "success") return classes.alertSuccess;
|
|
436
|
+
else if (alertSeverity === "warning") return classes.alertWarning;
|
|
437
|
+
else if (alertSeverity === "error") return classes.alertError;
|
|
438
|
+
else if (alertSeverity === "info") return classes.alertInfo;
|
|
452
439
|
};
|
|
453
440
|
return /* @__PURE__ */ React.createElement("div", null, showAlert && /* @__PURE__ */ React.createElement(Alert, {
|
|
454
441
|
classes: { root: clsx(alertColor(), classes.square) },
|
|
@@ -675,4 +662,4 @@ const MyExportsPage = (props) => {
|
|
|
675
662
|
|
|
676
663
|
//#endregion
|
|
677
664
|
export { AmbientAlert, AmbientAutoComplete, EmptyStateDisplay, MyExportsPage, SearchServiceDatasource, StatusCellRenderer, TableColumnDefs, TableContainer$1 as TableContainer, defaultColumnActionsDef };
|
|
678
|
-
//# sourceMappingURL=MyExportsPage-
|
|
665
|
+
//# sourceMappingURL=MyExportsPage-CS2Bw2mF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MyExportsPage-CX9tzqHk.js","names":["element","TableContainer","useStyles","value","useStyles","value","TableContainer"],"sources":["../src/utilities/aggrid/datasources/SearchServiceDatasource.js","../src/maintenanceEngine/tableBrowser/TableColumnDefs.js","../src/maintenanceEngine/tableBrowser/TableContainer.jsx","../src/UI/inputs/textField/AmbientAutoComplete.jsx","../src/UI/dataDisplay/EmptyStateDisplay.jsx","../src/UI/feedback/AmbientAlert.jsx","../src/UI/templates/ui/renderers/StatusCellRenderer.jsx","../src/udp/export/MyExportsPage.jsx"],"sourcesContent":["import {\n LogicalSearchOperatorEnums,\n SearchGroupingType,\n SearchSortDirection\n} from '../../../enums/unitySystemEnums';\nimport { getSearchObject } from '../../search/SearchUtilities';\nimport { FilterOperators } from '../../../models/SearchOperator';\nimport { cloneDeep } from 'lodash';\n\nexport const SearchServiceDatasource = (\n queryData,\n apiMethodId,\n searchFilterElements,\n logicalSearchOperator = LogicalSearchOperatorEnums.And,\n executeQuery,\n storeRowData,\n lookupsMap,\n eagerLoad = false,\n getCleanData = null\n) => {\n return {\n async getRows(params) {\n const {\n startRow,\n endRow,\n rowGroupCols,\n groupKeys,\n valueCols,\n filterModel,\n sortModel\n } = params.request;\n const page = endRow / 20;\n const originalSearchObject = getSearchObject(\n searchFilterElements,\n page,\n null,\n eagerLoad,\n logicalSearchOperator\n );\n\n const searchObject = cloneDeep(originalSearchObject);\n\n // handle server-side sorting on ag-grid\n if (sortModel.length) {\n const orderElements = searchObject.orderElements;\n sortModel.forEach((sortItem) => {\n const formattedPropertyName =\n sortItem.colId.charAt(0).toUpperCase() + sortItem.colId.slice(1);\n const element = orderElements.find(\n (element) => element.sortColumn === formattedPropertyName\n );\n if (element) {\n element.sortDirection = sortItem.sort.toUpperCase();\n } else {\n orderElements.push({\n sortColumn: formattedPropertyName,\n sortDirection: sortItem.sort.toUpperCase()\n });\n }\n });\n }\n\n // handle server-side filtering on ag-grid\n if (Object.keys(filterModel).length) {\n const filterElements = searchObject.filterElements;\n Object.keys(filterModel).forEach((key) => {\n const filterItem = filterModel[key];\n const formattedPropertyName =\n key.charAt(0).toUpperCase() + key.slice(1);\n filterElements.push({\n searchField: formattedPropertyName,\n searchValue: filterItem.filter,\n searchOperator: FilterOperators[filterItem.type]\n });\n });\n }\n\n // construct search for initial grouping\n if (rowGroupCols.length && !groupKeys.length) {\n const formattedPropertyName =\n rowGroupCols[0].field.charAt(0).toUpperCase() +\n rowGroupCols[0].field.slice(1);\n searchObject.groupingType = SearchGroupingType.Distinct;\n if (!searchObject.groupProperty.includes(formattedPropertyName)) {\n searchObject.groupProperty.push(formattedPropertyName);\n\n const orderElements = searchObject.orderElements;\n const element = orderElements.find(\n (element) => element.sortColumn === formattedPropertyName\n );\n if (!element) {\n orderElements.push({\n sortColumn: formattedPropertyName,\n sortDirection: SearchSortDirection.Asc\n });\n }\n }\n }\n\n // construct the filter for grouped columns\n if (groupKeys.length) {\n // construct search for last grouped element\n if (groupKeys.length === rowGroupCols.length) {\n searchObject.groupingType = '';\n const filterElements = searchObject.filterElements;\n groupKeys.forEach((key, index) => {\n const rowGroupCol = rowGroupCols[index];\n const formattedPropertyName =\n rowGroupCol.field.charAt(0).toUpperCase() +\n rowGroupCol.field.slice(1);\n const element = filterElements.find(\n (element) => element.searchField === formattedPropertyName\n );\n\n let currentNode = null;\n params.api.forEachNode((node) => {\n const nodeKey = node.field;\n if (\n nodeKey?.toLowerCase() ===\n formattedPropertyName?.toLowerCase() &&\n node?.data?.[nodeKey] === key\n ) {\n currentNode = node;\n return;\n }\n });\n let searchValue = key;\n if (currentNode) {\n const cleanData = getCleanData\n ? getCleanData(currentNode.data, lookupsMap)\n : null;\n if (cleanData) {\n searchValue = cleanData[currentNode.field];\n }\n }\n\n if (element) {\n element.searchValue = searchValue;\n element.searchOperator = '=';\n } else {\n filterElements.push({\n searchField: formattedPropertyName,\n searchValue: searchValue,\n searchOperator: '='\n });\n }\n });\n } else {\n // construct search for the next grouped element\n groupKeys.forEach((key, index) => {\n const formattedPropertyNameForSearch =\n rowGroupCols[index].field.charAt(0).toUpperCase() +\n rowGroupCols[index].field.slice(1);\n\n let currentNode = null;\n params.api.forEachNode((node) => {\n const nodeKey = node.field;\n if (\n nodeKey?.toLowerCase() ===\n formattedPropertyNameForSearch?.toLowerCase() &&\n node?.data?.[nodeKey] === key\n ) {\n currentNode = node;\n return;\n }\n });\n let searchValue = key;\n if (currentNode) {\n const cleanData = getCleanData\n ? getCleanData(currentNode.data, lookupsMap)\n : null;\n if (cleanData) {\n searchValue = cleanData[currentNode.field];\n }\n }\n\n searchObject.filterElements.push({\n searchField: formattedPropertyNameForSearch,\n searchValue: searchValue,\n searchOperator: '='\n });\n });\n\n searchObject.groupingType = SearchGroupingType.Distinct;\n const searchIndex = groupKeys.length;\n const rowGroupCol = rowGroupCols[searchIndex];\n const formattedPropertyName =\n rowGroupCol.field.charAt(0).toUpperCase() +\n rowGroupCol.field.slice(1);\n\n if (!searchObject.groupProperty.includes(formattedPropertyName)) {\n searchObject.groupProperty.push(formattedPropertyName);\n\n const orderElements = searchObject.orderElements;\n const element = orderElements.find(\n (element) => element.sortColumn === formattedPropertyName\n );\n if (!element) {\n orderElements.push({\n sortColumn: formattedPropertyName,\n sortDirection: SearchSortDirection.Asc\n });\n }\n }\n }\n }\n\n if (\n !startRow &&\n rowGroupCols.length === 0 &&\n !sortModel.length &&\n !Object.keys(filterModel).length &&\n !groupKeys.length &&\n queryData\n ) {\n if (queryData.pageList && queryData.pageList) {\n params.success({\n rowData: queryData.pageList,\n rowCount: parseInt(queryData.total)\n });\n if (storeRowData) {\n storeRowData(queryData.pageList);\n }\n } else {\n // TODO: add an overlay to display no rows\n params.success({\n rowData: [],\n rowCount: 0\n });\n if (storeRowData) {\n storeRowData([]);\n }\n }\n } else {\n let response = null;\n if (executeQuery) {\n const data = { data: searchObject };\n response = await executeQuery(data, apiMethodId, lookupsMap).catch(\n (e) =>\n params.success({\n rowData: [],\n rowCount: 0\n })\n );\n }\n const rowData = response?.status === 200 ? response?.data : response;\n if (rowData && response) {\n if (rowData?.pageList?.length > 0) {\n params.success({\n rowData: rowData.pageList,\n rowCount: parseInt(rowData.total)\n });\n if (storeRowData) {\n storeRowData(rowData.pageList);\n }\n } else {\n params.success({\n rowData: [],\n rowCount: 0\n });\n if (storeRowData) {\n storeRowData([]);\n }\n }\n } else {\n params.success({\n rowData: [],\n rowCount: 0\n });\n if (storeRowData) {\n storeRowData([]);\n }\n }\n }\n }\n };\n};\n","import { useCallback } from 'react';\nimport { getSanitizedName } from '../../utilities/entities/entityUtilities';\n\nexport const TableColumnDefs = (actionList) => {\n const getterRowData = useCallback((params) => {\n return params.data;\n }, []);\n\n const columnDefs = [\n {\n headerName: 'Name',\n field: 'entityName',\n valueGetter: (params) =>\n params.data?.properties?.displayName ||\n params.data?.sanitizedName ||\n getSanitizedName(params.data?.entityName),\n wrapText: true,\n autoHeight: false,\n sortable: false\n },\n {\n headerName: 'Actions',\n filter: false,\n pinned: 'right',\n cellRenderer: 'actionsRenderer',\n // minWidth: 50,\n width: 150,\n cellRendererParams: {\n actionList: actionList\n },\n valueGetter: getterRowData,\n maxWidth: 180,\n suppressMenu: true,\n sortable: false,\n cellStyle: { display: 'flex', alignItems: 'center' }\n }\n ];\n return columnDefs;\n};\n\nexport const defaultColumnActionsDef = {\n resizable: true,\n editable: false,\n sortable: true,\n filter: true,\n floatingFilter: false,\n enableRowGroup: true\n};\n","import React, { useEffect, useMemo } from 'react';\nimport { TableColumnDefs } from './TableColumnDefs';\nimport { AmbientGridTemplate } from '../../UI/templates/AmbientGridTemplate';\nimport { ActionsRenderer } from '../../UI/templates/ui/renderers/ActionsRenderer';\nimport { useAgGridApi } from '../../utilities/aggrid/AgTable';\nimport { executeQueryAdHoc } from '../../udp/utilities/methodUtils';\nimport { SearchServiceDatasource } from '../../utilities/aggrid/datasources/SearchServiceDatasource';\nimport { useBuildEnvironment } from '../../shell/ui/EnvironmentRibbon';\n\nexport const TableContainer = (props) => {\n const {\n actionList,\n loading,\n rowData,\n catalog,\n isServerSide = false,\n promotedEntity,\n filterElements,\n customColumnDefs,\n eagerLoad = false,\n logicalSearchOperator = 1,\n frameworkComponents={ actionsRenderer: ActionsRenderer },\n additionalGridOptions,\n headerBackgroundColor,\n api,\n columnApi,\n gridReady,\n dynamicSizing,\n ...other\n } = props;\n const { gridApi, gridColumnApi, onGridReady } = useAgGridApi();\n const gApi = api || gridApi;\n const cApi = columnApi || gridColumnApi;\n const gReady = gridReady || onGridReady\n const buildEnv = useBuildEnvironment()\n const columnDefs = customColumnDefs || TableColumnDefs(actionList);\n\n const groupData = useMemo(() => {\n return columnDefs?.map((item) => {\n return {\n groupItem: item.field,\n label: item.headerName,\n value: item.field\n };\n });\n }, [columnDefs]);\n\n useEffect(() => {\n if (!gApi) return;\n if (promotedEntity && isServerSide) {\n let datasource = SearchServiceDatasource(\n null,\n promotedEntity?.unityBaseSearchMethod?.apiMethodId,\n filterElements,\n logicalSearchOperator,\n executeQueryAdHoc,\n null,\n null,\n eagerLoad\n );\n // eslint-disable-next-line no-unused-expressions\n gApi?.setServerSideDatasource(datasource);\n }\n }, [gApi, promotedEntity, isServerSide, filterElements, eagerLoad, logicalSearchOperator]);\n\n return (\n <AmbientGridTemplate\n useNewHeader\n api={gApi}\n onGridReady={gReady}\n columnApi={cApi}\n title={catalog?.name}\n data={!isServerSide && rowData}\n columnDefs={columnDefs}\n groupingData={groupData}\n height={`calc(100vh - ${buildEnv ? '139px' : '114px'})`}\n frameworkComponents={frameworkComponents}\n hideSearchBar={isServerSide}\n loading={loading}\n suppressScrollOnNewData\n dynamicSizing={dynamicSizing ?? false}\n disableRowSelection={true}\n rowModelType={isServerSide ? 'serverSide' : null}\n serverSideStoreType={isServerSide ? 'partial' : null}\n cacheOverflowSize={isServerSide ? 2 : null}\n cacheBlockSize={isServerSide ? 20 : null}\n maxConcurrentDatasourceRequests={isServerSide ? 1 : null}\n additionalGridOptions={additionalGridOptions}\n headerBackgroundColor={headerBackgroundColor}\n {...other}\n />\n );\n};\n","/* eslint-disable no-use-before-define */\nimport React, { useCallback } from 'react';\nimport { TextField, makeStyles, Popper } from '@material-ui/core';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\n\nconst useStyles = makeStyles((theme) => ({\n input: {\n borderRadius: 2,\n minHeight: 32,\n padding: 0,\n paddingTop: '0 !important',\n paddingBottom: (props) => (props.isMultiple ? '0 !important' : 10),\n marginTop: 3,\n '& .MuiFilledInput-inputMarginDense': {\n paddingTop: 8\n },\n '& .MuiFilledInput-root': {\n paddingTop: 0\n },\n '& .MuiInputAdornment-filled.MuiInputAdornment-positionStart:not(.MuiInputAdornment-hiddenLabel)':\n {\n marginTop: theme.spacing(0.5),\n marginLeft: theme.spacing(1)\n }\n },\n formTextInput: {\n fontSize: 14,\n marginTop: '2px !important',\n paddingBottom: '2px !important'\n },\n labelRoot: {\n fontSize: 14\n },\n root: {\n marginTop: 25,\n '& .MuiFormLabel-root': {\n marginTop: -30,\n marginLeft: -11\n },\n '& .MuiInputAdornment-root': {\n paddingLeft: theme.spacing(1)\n }\n },\n noLabel: {\n marginTop: theme.spacing(1)\n },\n formControl: {\n width: '100%'\n }\n}));\n\nconst AutoCompletePopper = (props) => {\n return <Popper {...props} placement='bottom-start' />;\n};\n\nexport const AmbientAutoComplete = (props) => {\n const {\n getOptionLabelFunction,\n getOptionSelected,\n label,\n placeholder,\n options,\n textFieldProps,\n disabled,\n onChange: onChangeProp,\n value,\n additionalOnChangeAction,\n classes: classProps,\n variant = 'filled',\n inputProps,\n inputPropClasses,\n customPopper,\n disableClearable = false,\n defaultValue,\n additionalOptionKey,\n isMultiple = false,\n limitTags,\n renderTags,\n size = 'medium',\n groupBy = null,\n loading,\n disableCloseOnSelect = false,\n ...other\n } = props;\n\n const classes = useStyles(props);\n const { autocompleteRoot } = classProps || {};\n\n const onChange = useCallback(\n (e, value) => {\n if (additionalOnChangeAction) {\n additionalOnChangeAction(value);\n }\n return onChangeProp?.(value);\n },\n [onChangeProp, additionalOnChangeAction]\n );\n\n return (\n <Autocomplete\n id='autocomplete'\n multiple={isMultiple}\n limitTags={limitTags}\n disabled={disabled}\n options={options || []}\n loading={loading}\n getOptionLabel={getOptionLabelFunction}\n getOptionSelected={getOptionSelected}\n groupBy={groupBy}\n onChange={onChange}\n value={value || (isMultiple ? [] : null)}\n className={autocompleteRoot}\n classes={{\n root: classes.formControl\n }}\n PopperComponent={customPopper || AutoCompletePopper}\n disableClearable={disableClearable}\n defaultValue={defaultValue}\n size={size}\n disableCloseOnSelect={disableCloseOnSelect}\n renderInput={(params) => (\n <div className={label ? classes.root : classes.noLabel}>\n <TextField\n {...textFieldProps}\n {...params}\n {...other}\n label={label}\n margin='dense'\n variant={variant}\n size='small'\n InputProps={{\n ...params.InputProps,\n classes: {\n root: classes.input,\n input: classes.formTextInput,\n ...props.InputProps?.classes\n }\n }}\n InputLabelProps={{\n shrink: false,\n classes: {\n root: classes.labelRoot,\n focused: classes.labelFocused\n }\n }}\n />\n </div>\n )}\n renderTags={renderTags}\n />\n );\n};\n","import { ErrorIcon } from '@fluentui/react-icons';\nimport { Typography, makeStyles, Box } from '@material-ui/core';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { FluentButton } from '../inputs/buttons/FluentButton';\nimport { FluentIcon } from '../../utilities/FluentIcon';\nimport { LayoutUnit } from '../../layout/LayoutUnit';\n\nconst useStyles = makeStyles(theme => ({\n container: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n width: '100%',\n },\n secondaryText: {\n color: theme.palette.text.secondary,\n },\n image: {\n width: props => props?.imageWidth,\n },\n}));\n\nexport const EmptyStateDisplay = props => {\n const {\n icon,\n iconSize = 48,\n customIconSize = true,\n imageSrc,\n imageWidth = '100px',\n primaryText,\n secondaryText,\n actionLabel,\n action,\n } = props;\n const classes = useStyles({ imageWidth });\n\n return (\n <div className={classes.container}>\n {imageSrc ? (\n <img src={imageSrc} alt='logo' className={classes.image} />\n ) : (\n <FluentIcon\n component={icon ?? ErrorIcon}\n size={iconSize}\n customSize={customIconSize}\n />\n )}\n <LayoutUnit unit=\"xxs\" />\n {primaryText && (\n <div>\n <Typography variant='subtitle2' align='center'>\n {primaryText}\n </Typography>\n </div>\n )}\n {secondaryText && (\n <div>\n <Typography className={classes.secondaryText} align='center'>\n {secondaryText}\n </Typography>\n </div>\n )}\n {(primaryText || secondaryText) && <LayoutUnit unit=\"xxs\" />}\n {action && (\n <div\n className={primaryText || secondaryText ? classes.buttonWrapper : ''}\n >\n <FluentButton\n onClick={action}\n variant='outlined'\n color='secondary'\n id={\n 'udpRecord-EmptyStateDisplay-' +\n primaryText.replace(/\\s+/g, '') +\n '-' +\n actionLabel.replace(/\\s+/g, '')\n }\n udprecordid={\n 'udpRecord-EmptyStateDisplay-' +\n primaryText.replace(/\\s+/g, '') +\n '-' +\n actionLabel.replace(/\\s+/g, '')\n }\n >\n {actionLabel}\n </FluentButton>\n </div>\n )}\n </div>\n );\n};\n\nEmptyStateDisplay.propTypes = {\n icon: PropTypes.elementType,\n iconSize: PropTypes.number,\n customIconSize: PropTypes.bool,\n imageSrc: PropTypes.string,\n imageWidth: PropTypes.string,\n primaryText: PropTypes.string,\n secondaryText: PropTypes.string,\n actionLabel: PropTypes.string,\n action: PropTypes.func\n};\n\nEmptyStateDisplay.defaultProps = {\n iconSize: 48,\n customIconSize: true,\n imageWidth: '100px'\n};","import React from 'react';\nimport { makeStyles, Button } from '@material-ui/core';\nimport { Alert, AlertTitle } from '@material-ui/lab';\nimport clsx from 'clsx';\n\nconst useStyles = makeStyles(theme => ({\n root: {},\n '@global': {\n '.MuiPaper-rounded': {\n borderRadius: 0,\n },\n },\n alertSuccess: {\n borderLeft: `4px solid ${theme.palette.success.main}`,\n },\n alertWarning: {\n borderLeft: `4px solid ${theme.palette.warning.main}`,\n },\n alertError: {\n borderLeft: `4px solid ${theme.palette.error.main}`,\n color: theme.palette.error.main,\n },\n alertInfo: {\n borderLeft: `4px solid ${theme.palette.info.main}`,\n },\n square: {\n borderRadius: 0,\n },\n}));\n\nexport const AmbientAlert = ({\n alertButton,\n alertMessage,\n alertTitle,\n showAlert,\n alertSeverity,\n closeAlert,\n alertAction,\n alertActionButton,\n alertHandleAction,\n ...otherProps\n}) => {\n const classes = useStyles();\n\n const alertColor = () => {\n if (alertSeverity === 'success') {\n let alertLevel = classes.alertSuccess;\n return alertLevel;\n } else if (alertSeverity === 'warning') {\n let alertLevel = classes.alertWarning;\n return alertLevel;\n } else if (alertSeverity === 'error') {\n let alertLevel = classes.alertError;\n return alertLevel;\n } else if (alertSeverity === 'info') {\n let alertLevel = classes.alertInfo;\n return alertLevel;\n }\n };\n\n return (\n <div>\n {showAlert && (\n <Alert\n classes={{ root: clsx(alertColor(), classes.square) }}\n {...otherProps}\n severity={alertSeverity}\n onClose={closeAlert}\n action={\n alertAction ? (\n <Button\n onClick={alertHandleAction}\n id='udpRecord-AmbientAlert-alertActionButton'\n udprecordid='udpRecord-AmbientAlert-alertActionButton'\n >\n {alertActionButton}\n </Button>\n ) : null\n }\n >\n {alertTitle && <AlertTitle>{alertTitle}</AlertTitle>}\n {alertMessage}\n </Alert>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { StatusChip } from '../../../dataDisplay/StatusChip';\n\nexport const StatusCellRenderer = props => {\n const { value, getStatus, getLabel } = props;\n const formattedLabel = value => {\n return value\n ?.replace(/([a-z])([A-Z])/g, '$1 $2')\n ?.replace(/\\b\\w/g, char => char.toUpperCase());\n };\n return (\n <StatusChip\n status={getStatus(value)}\n label={getLabel ? formattedLabel(getLabel(value)) : formattedLabel(value)}\n />\n );\n};\n","import React, { useMemo, useState, useCallback, useEffect } from 'react';\nimport {\n StatusCircleCheckmarkIcon,\n ErrorIcon,\n DownloadIcon\n} from '@fluentui/react-icons';\nimport { getSanitizedName } from '../../utilities/entities/entityUtilities';\nimport { FluentDialog } from '../../UI/feedback/FluentDialog';\nimport { EmptyStateDisplay } from '../../UI/dataDisplay/EmptyStateDisplay';\nimport { useAxiosGet } from '../../utilities/useAxiosGet';\nimport { ActionsRenderer } from '../../UI/templates/ui/renderers/ActionsRenderer';\nimport { AmbientAlert } from '../../UI/feedback/AmbientAlert';\nimport { TableContainer } from '../../maintenanceEngine/tableBrowser/TableContainer';\nimport { StatusCellRenderer } from '../../UI/templates/ui/renderers/StatusCellRenderer';\nimport { useUser } from '../../utilities/auth/useUser';\nimport { AmbientAutoComplete } from '../../UI/inputs/textField/AmbientAutoComplete';\nimport { executeQueryWithParameters } from '../utilities/methodUtils';\nimport { useHandleAxiosSnackbar } from '../../utilities/apiHelpers';\nimport { ConfigService } from 'udp-react-stencil-component-library';\n\nexport const MyExportsPage = (props) => {\n const { productId } = props;\n const user = useUser();\n const [product, setProduct] = useState();\n const [downloadLinkLoading, setDownloadLinkLoading] = useState(false);\n const [fileResultData, setFileResultData] = useState();\n const [downloadOpen, setDownloadOpen] = useState(false);\n const [noDownloadMethod, setNoDownloadMethod] = useState(false);\n\n const { handleErrorSnackbar, handleSuccessSnackbar } =\n useHandleAxiosSnackbar();\n\n const [{ data: products, loading: productsLoading }] = useAxiosGet(\n ConfigService.tenantV2ApiUrl,\n `tenant/products?tenantId=${user?.currentTenantId}&isSubscribable=${!user\n ?.can?.CAN_MANAGE_CATALOGS_FOR_UNSUBSCRIBABLE_PRODUCTS}`,\n {},\n !user\n );\n\n const [{ data: apiCatalog, loading: catalogLoading, error: catalogError }] =\n useAxiosGet(\n ConfigService.integrationV1ApiUrl,\n `tenantProductApiCatalogBase/tenant/${user?.currentTenantId}/product/${\n productId ? productId : product?.productId\n }`,\n {},\n !(product || productId),\n false\n );\n\n const [{ data: udpJobEntity, loading: jobEntityLoading }] = useAxiosGet(\n ConfigService.integrationV1ApiUrl,\n `apicatalog/${apiCatalog?.apiCatalogId}/promotedMethodEntities/udpJob/product/${apiCatalog?.productId}?compareSanitizedName=true`,\n {},\n !apiCatalog?.productId || !apiCatalog?.apiCatalogId,\n false\n );\n\n const refetchfileResultData = useCallback(\n async (selectedRecord) => {\n if (udpJobEntity?.unityBaseGetFileResultMethod?.apiMethodId) {\n setDownloadLinkLoading(true);\n await executeQueryWithParameters(\n {\n data: { JobId: selectedRecord?.id }\n },\n udpJobEntity?.unityBaseGetFileResultMethod?.apiMethodId\n )\n .then((res) => {\n setFileResultData(res.data);\n })\n .catch((err) => {});\n setDownloadLinkLoading(false);\n } else {\n setNoDownloadMethod(true);\n }\n },\n [udpJobEntity?.unityBaseGetFileResultMethod?.apiMethodId]\n );\n\n const handleSelectRecord = useCallback(\n (data) => {\n refetchfileResultData(data);\n setDownloadOpen(true);\n },\n [refetchfileResultData]\n );\n\n const getOptionLabel = (val) => {\n return val?.name;\n };\n\n const handleProductChange = useCallback((val) => {\n setProduct(val);\n }, []);\n\n const handleFileDownload = useCallback(() => {\n if (fileResultData?.link) {\n const link = document.createElement('a');\n link.href = fileResultData?.link;\n link.download = '';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n setDownloadOpen(false);\n handleSuccessSnackbar('File successfully downloaded');\n }\n }, [fileResultData?.link, handleSuccessSnackbar]);\n\n const getJobStatus = (value) => {\n if (value === 1) {\n return null;\n } else if (value === 2) {\n return 'info';\n } else if (value === 3) {\n return 'success';\n } else if (value === 4) {\n return 'error';\n }\n };\n\n const getJobLabel = (value) => {\n if (value === 1) {\n return 'Pending';\n } else if (value === 2) {\n return 'Running';\n } else if (value === 3) {\n return 'Completed';\n } else if (value === 4) {\n return 'Failed';\n }\n };\n\n useEffect(() => {\n if (catalogError) {\n handleErrorSnackbar(\n '',\n 'Error fetching catalog for the selected product'\n );\n }\n }, [catalogError, handleErrorSnackbar]);\n\n const filterElements = useMemo(() => {\n return [\n {\n searchField: 'jobTypeId',\n searchOperator: '=',\n searchValue: 2\n }\n ];\n }, []);\n\n const actionList = useMemo(() => {\n return [\n {\n id: 1,\n title: 'Download',\n icon: DownloadIcon,\n onClick: handleSelectRecord,\n disabled: false,\n checkDisabled: (value) => value?.statusId !== 3\n }\n ];\n }, [handleSelectRecord]);\n\n const columnDefs = useMemo(\n () => [\n {\n headerName: 'Id',\n sortable: true,\n field: 'id',\n suppressMenu: true\n },\n {\n headerName: 'Name',\n sortable: false,\n field: 'name',\n minWidth: 140,\n suppressMenu: true,\n valueFormatter: (data) => getSanitizedName(data.data.name)\n },\n {\n headerName: 'Date',\n sortable: false,\n valueFormatter: (data) =>\n new Date(data.data.startTime).toLocaleString(),\n minWidth: 130,\n suppressMenu: true\n //sort: 'desc',\n },\n {\n headerName: 'Status',\n field: 'statusId',\n wrapText: true,\n autoHeight: true,\n sortable: false,\n cellRenderer: 'statusCellRenderer',\n cellRendererParams: { getStatus: getJobStatus, getLabel: getJobLabel },\n minWidth: 130,\n maxWidth: 130,\n suppressMenu: true\n },\n\n {\n headerName: 'Actions',\n filter: false,\n pinned: 'right',\n cellRenderer: 'actionsRenderer',\n width: 120,\n maxWidth: 120,\n cellRendererParams: {\n actionList: actionList,\n value: (data) => data\n },\n suppressMenu: true,\n sortable: false,\n cellStyle: { display: 'flex', alignItems: 'center' }\n }\n ],\n [actionList]\n );\n\n return (\n <div>\n {udpJobEntity && !udpJobEntity?.unityBaseSearchMethod?.apiMethodId && (\n <AmbientAlert\n alertMessage={\"UdpJob's search method must be promoted\"}\n showAlert={true}\n alertSeverity={'error'}\n />\n )}\n\n {!productId && (\n <div style={{ margin: '0px 5px 5px 5px' }}>\n <AmbientAutoComplete\n isMultiple={false}\n id={'product'}\n name={'product'}\n label='Product'\n onChange={handleProductChange}\n options={products}\n size='small'\n getOptionLabelFunction={getOptionLabel}\n value={product}\n required\n />\n </div>\n )}\n <TableContainer\n loading={productsLoading || catalogLoading || jobEntityLoading}\n title={`Exports`}\n isServerSide={true}\n eagerLoad={false}\n logicalSearchOperator={2}\n promotedEntity={udpJobEntity}\n filterElements={filterElements}\n actionList={actionList}\n customColumnDefs={columnDefs}\n frameworkComponents={{\n statusCellRenderer: StatusCellRenderer,\n actionsRenderer: ActionsRenderer\n }}\n hideSearchBar\n hiddenActionButtons={[\n 'saveView',\n 'views',\n 'insights',\n 'importExport',\n 'group',\n 'filter',\n 'columns',\n 'clearFilters',\n 'fitGrid',\n 'expandGrid'\n ]}\n height={'calc(100vh - 167px)'}\n dynamicSizing\n />\n <FluentDialog\n actionOne={handleFileDownload}\n actionTwo={() => setDownloadOpen(false)}\n labelOne='Download'\n labelTwo='Cancel'\n open={downloadOpen}\n handleClose={() => setDownloadOpen(false)}\n disableOne={noDownloadMethod || downloadLinkLoading}\n progress={downloadLinkLoading}\n fullWidth\n >\n {noDownloadMethod ? (\n <AmbientAlert\n alertMessage={\"UdpJob's get file result method must be promoted\"}\n showAlert={true}\n alertSeverity={'error'}\n />\n ) : downloadLinkLoading ? (\n <EmptyStateDisplay primaryText={'Fetching download link...'} />\n ) : (\n <EmptyStateDisplay\n icon={noDownloadMethod ? ErrorIcon : StatusCircleCheckmarkIcon}\n primaryText={!noDownloadMethod && 'File is ready to download!'}\n />\n )}\n </FluentDialog>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MyExportsPage-CS2Bw2mF.js","names":["element","TableContainer","useStyles","value","useStyles","value","TableContainer"],"sources":["../src/maintenanceEngine/tableBrowser/TableColumnDefs.js","../src/utilities/aggrid/datasources/SearchServiceDatasource.js","../src/maintenanceEngine/tableBrowser/TableContainer.jsx","../src/UI/inputs/textField/AmbientAutoComplete.jsx","../src/UI/dataDisplay/EmptyStateDisplay.jsx","../src/UI/feedback/AmbientAlert.jsx","../src/UI/templates/ui/renderers/StatusCellRenderer.jsx","../src/udp/export/MyExportsPage.jsx"],"sourcesContent":["import { useCallback } from 'react';\nimport { getSanitizedName } from '../../utilities/entities/entityUtilities';\n\nexport const TableColumnDefs = (actionList) => {\n const getterRowData = useCallback((params) => {\n return params.data;\n }, []);\n\n const columnDefs = [\n {\n headerName: 'Name',\n field: 'entityName',\n valueGetter: (params) =>\n params.data?.properties?.displayName ||\n params.data?.sanitizedName ||\n getSanitizedName(params.data?.entityName),\n wrapText: true,\n autoHeight: false,\n sortable: false\n },\n {\n headerName: 'Actions',\n filter: false,\n pinned: 'right',\n cellRenderer: 'actionsRenderer',\n // minWidth: 50,\n width: 150,\n cellRendererParams: {\n actionList: actionList\n },\n valueGetter: getterRowData,\n maxWidth: 180,\n suppressMenu: true,\n sortable: false,\n cellStyle: { display: 'flex', alignItems: 'center' }\n }\n ];\n return columnDefs;\n};\n\nexport const defaultColumnActionsDef = {\n resizable: true,\n editable: false,\n sortable: true,\n filter: true,\n floatingFilter: false,\n enableRowGroup: true\n};\n","import {\n LogicalSearchOperatorEnums,\n SearchGroupingType,\n SearchSortDirection\n} from '../../../enums/unitySystemEnums';\nimport { getSearchObject } from '../../search/SearchUtilities';\nimport { FilterOperators } from '../../../models/SearchOperator';\nimport { cloneDeep } from 'lodash';\n\nexport const SearchServiceDatasource = (\n queryData,\n apiMethodId,\n searchFilterElements,\n logicalSearchOperator = LogicalSearchOperatorEnums.And,\n executeQuery,\n storeRowData,\n lookupsMap,\n eagerLoad = false,\n getCleanData = null\n) => {\n return {\n async getRows(params) {\n const {\n startRow,\n endRow,\n rowGroupCols,\n groupKeys,\n valueCols,\n filterModel,\n sortModel\n } = params.request;\n const page = endRow / 20;\n const originalSearchObject = getSearchObject(\n searchFilterElements,\n page,\n null,\n eagerLoad,\n logicalSearchOperator\n );\n\n const searchObject = cloneDeep(originalSearchObject);\n\n // handle server-side sorting on ag-grid\n if (sortModel.length) {\n const orderElements = searchObject.orderElements;\n sortModel.forEach((sortItem) => {\n const formattedPropertyName =\n sortItem.colId.charAt(0).toUpperCase() + sortItem.colId.slice(1);\n const element = orderElements.find(\n (element) => element.sortColumn === formattedPropertyName\n );\n if (element) {\n element.sortDirection = sortItem.sort.toUpperCase();\n } else {\n orderElements.push({\n sortColumn: formattedPropertyName,\n sortDirection: sortItem.sort.toUpperCase()\n });\n }\n });\n }\n\n // handle server-side filtering on ag-grid\n if (Object.keys(filterModel).length) {\n const filterElements = searchObject.filterElements;\n Object.keys(filterModel).forEach((key) => {\n const filterItem = filterModel[key];\n const formattedPropertyName =\n key.charAt(0).toUpperCase() + key.slice(1);\n filterElements.push({\n searchField: formattedPropertyName,\n searchValue: filterItem.filter,\n searchOperator: FilterOperators[filterItem.type]\n });\n });\n }\n\n // construct search for initial grouping\n if (rowGroupCols.length && !groupKeys.length) {\n const formattedPropertyName =\n rowGroupCols[0].field.charAt(0).toUpperCase() +\n rowGroupCols[0].field.slice(1);\n searchObject.groupingType = SearchGroupingType.Distinct;\n if (!searchObject.groupProperty.includes(formattedPropertyName)) {\n searchObject.groupProperty.push(formattedPropertyName);\n\n const orderElements = searchObject.orderElements;\n const element = orderElements.find(\n (element) => element.sortColumn === formattedPropertyName\n );\n if (!element) {\n orderElements.push({\n sortColumn: formattedPropertyName,\n sortDirection: SearchSortDirection.Asc\n });\n }\n }\n }\n\n // construct the filter for grouped columns\n if (groupKeys.length) {\n // construct search for last grouped element\n if (groupKeys.length === rowGroupCols.length) {\n searchObject.groupingType = '';\n const filterElements = searchObject.filterElements;\n groupKeys.forEach((key, index) => {\n const rowGroupCol = rowGroupCols[index];\n const formattedPropertyName =\n rowGroupCol.field.charAt(0).toUpperCase() +\n rowGroupCol.field.slice(1);\n const element = filterElements.find(\n (element) => element.searchField === formattedPropertyName\n );\n\n let currentNode = null;\n params.api.forEachNode((node) => {\n const nodeKey = node.field;\n if (\n nodeKey?.toLowerCase() ===\n formattedPropertyName?.toLowerCase() &&\n node?.data?.[nodeKey] === key\n ) {\n currentNode = node;\n return;\n }\n });\n let searchValue = key;\n if (currentNode) {\n const cleanData = getCleanData\n ? getCleanData(currentNode.data, lookupsMap)\n : null;\n if (cleanData) {\n searchValue = cleanData[currentNode.field];\n }\n }\n\n if (element) {\n element.searchValue = searchValue;\n element.searchOperator = '=';\n } else {\n filterElements.push({\n searchField: formattedPropertyName,\n searchValue: searchValue,\n searchOperator: '='\n });\n }\n });\n } else {\n // construct search for the next grouped element\n groupKeys.forEach((key, index) => {\n const formattedPropertyNameForSearch =\n rowGroupCols[index].field.charAt(0).toUpperCase() +\n rowGroupCols[index].field.slice(1);\n\n let currentNode = null;\n params.api.forEachNode((node) => {\n const nodeKey = node.field;\n if (\n nodeKey?.toLowerCase() ===\n formattedPropertyNameForSearch?.toLowerCase() &&\n node?.data?.[nodeKey] === key\n ) {\n currentNode = node;\n return;\n }\n });\n let searchValue = key;\n if (currentNode) {\n const cleanData = getCleanData\n ? getCleanData(currentNode.data, lookupsMap)\n : null;\n if (cleanData) {\n searchValue = cleanData[currentNode.field];\n }\n }\n\n searchObject.filterElements.push({\n searchField: formattedPropertyNameForSearch,\n searchValue: searchValue,\n searchOperator: '='\n });\n });\n\n searchObject.groupingType = SearchGroupingType.Distinct;\n const searchIndex = groupKeys.length;\n const rowGroupCol = rowGroupCols[searchIndex];\n const formattedPropertyName =\n rowGroupCol.field.charAt(0).toUpperCase() +\n rowGroupCol.field.slice(1);\n\n if (!searchObject.groupProperty.includes(formattedPropertyName)) {\n searchObject.groupProperty.push(formattedPropertyName);\n\n const orderElements = searchObject.orderElements;\n const element = orderElements.find(\n (element) => element.sortColumn === formattedPropertyName\n );\n if (!element) {\n orderElements.push({\n sortColumn: formattedPropertyName,\n sortDirection: SearchSortDirection.Asc\n });\n }\n }\n }\n }\n\n if (\n !startRow &&\n rowGroupCols.length === 0 &&\n !sortModel.length &&\n !Object.keys(filterModel).length &&\n !groupKeys.length &&\n queryData\n ) {\n if (queryData.pageList && queryData.pageList) {\n params.success({\n rowData: queryData.pageList,\n rowCount: parseInt(queryData.total)\n });\n if (storeRowData) {\n storeRowData(queryData.pageList);\n }\n } else {\n // TODO: add an overlay to display no rows\n params.success({\n rowData: [],\n rowCount: 0\n });\n if (storeRowData) {\n storeRowData([]);\n }\n }\n } else {\n let response = null;\n if (executeQuery) {\n const data = { data: searchObject };\n response = await executeQuery(data, apiMethodId, lookupsMap).catch(\n (e) =>\n params.success({\n rowData: [],\n rowCount: 0\n })\n );\n }\n const rowData = response?.status === 200 ? response?.data : response;\n if (rowData && response) {\n if (rowData?.pageList?.length > 0) {\n params.success({\n rowData: rowData.pageList,\n rowCount: parseInt(rowData.total)\n });\n if (storeRowData) {\n storeRowData(rowData.pageList);\n }\n } else {\n params.success({\n rowData: [],\n rowCount: 0\n });\n if (storeRowData) {\n storeRowData([]);\n }\n }\n } else {\n params.success({\n rowData: [],\n rowCount: 0\n });\n if (storeRowData) {\n storeRowData([]);\n }\n }\n }\n }\n };\n};\n","import React, { useEffect, useMemo } from 'react';\nimport { TableColumnDefs } from './TableColumnDefs';\nimport { AmbientGridTemplate } from '../../UI/templates/AmbientGridTemplate';\nimport { ActionsRenderer } from '../../UI/templates/ui/renderers/ActionsRenderer';\nimport { useAgGridApi } from '../../utilities/aggrid/AgTable';\nimport { executeQueryAdHoc } from '../../udp/utilities/methodUtils';\nimport { SearchServiceDatasource } from '../../utilities/aggrid/datasources/SearchServiceDatasource';\nimport { useBuildEnvironment } from '../../shell/ui/EnvironmentRibbon';\n\nexport const TableContainer = (props) => {\n const {\n actionList,\n loading,\n rowData,\n catalog,\n isServerSide = false,\n promotedEntity,\n filterElements,\n customColumnDefs,\n eagerLoad = false,\n logicalSearchOperator = 1,\n frameworkComponents={ actionsRenderer: ActionsRenderer },\n additionalGridOptions,\n headerBackgroundColor,\n api,\n columnApi,\n gridReady,\n dynamicSizing,\n ...other\n } = props;\n const { gridApi, gridColumnApi, onGridReady } = useAgGridApi();\n const gApi = api || gridApi;\n const cApi = columnApi || gridColumnApi;\n const gReady = gridReady || onGridReady\n const buildEnv = useBuildEnvironment()\n const columnDefs = customColumnDefs || TableColumnDefs(actionList);\n\n const groupData = useMemo(() => {\n return columnDefs?.map((item) => {\n return {\n groupItem: item.field,\n label: item.headerName,\n value: item.field\n };\n });\n }, [columnDefs]);\n\n useEffect(() => {\n if (!gApi) return;\n if (promotedEntity && isServerSide) {\n let datasource = SearchServiceDatasource(\n null,\n promotedEntity?.unityBaseSearchMethod?.apiMethodId,\n filterElements,\n logicalSearchOperator,\n executeQueryAdHoc,\n null,\n null,\n eagerLoad\n );\n // eslint-disable-next-line no-unused-expressions\n gApi?.setServerSideDatasource(datasource);\n }\n }, [gApi, promotedEntity, isServerSide, filterElements, eagerLoad, logicalSearchOperator]);\n\n return (\n <AmbientGridTemplate\n useNewHeader\n api={gApi}\n onGridReady={gReady}\n columnApi={cApi}\n title={catalog?.name}\n data={!isServerSide && rowData}\n columnDefs={columnDefs}\n groupingData={groupData}\n height={`calc(100vh - ${buildEnv ? '139px' : '114px'})`}\n frameworkComponents={frameworkComponents}\n hideSearchBar={isServerSide}\n loading={loading}\n suppressScrollOnNewData\n dynamicSizing={dynamicSizing ?? false}\n disableRowSelection={true}\n rowModelType={isServerSide ? 'serverSide' : null}\n serverSideStoreType={isServerSide ? 'partial' : null}\n cacheOverflowSize={isServerSide ? 2 : null}\n cacheBlockSize={isServerSide ? 20 : null}\n maxConcurrentDatasourceRequests={isServerSide ? 1 : null}\n additionalGridOptions={additionalGridOptions}\n headerBackgroundColor={headerBackgroundColor}\n {...other}\n />\n );\n};\n","/* eslint-disable no-use-before-define */\nimport React, { useCallback } from 'react';\nimport { TextField, makeStyles, Popper } from '@material-ui/core';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\n\nconst useStyles = makeStyles((theme) => ({\n input: {\n borderRadius: 2,\n minHeight: 32,\n padding: 0,\n paddingTop: '0 !important',\n paddingBottom: (props) => (props.isMultiple ? '0 !important' : 10),\n marginTop: 3,\n '& .MuiFilledInput-inputMarginDense': {\n paddingTop: 8\n },\n '& .MuiFilledInput-root': {\n paddingTop: 0\n },\n '& .MuiInputAdornment-filled.MuiInputAdornment-positionStart:not(.MuiInputAdornment-hiddenLabel)':\n {\n marginTop: theme.spacing(0.5),\n marginLeft: theme.spacing(1)\n }\n },\n formTextInput: {\n fontSize: 14,\n marginTop: '2px !important',\n paddingBottom: '2px !important'\n },\n labelRoot: {\n fontSize: 14\n },\n root: {\n marginTop: 25,\n '& .MuiFormLabel-root': {\n marginTop: -30,\n marginLeft: -11\n },\n '& .MuiInputAdornment-root': {\n paddingLeft: theme.spacing(1)\n }\n },\n noLabel: {\n marginTop: theme.spacing(1)\n },\n formControl: {\n width: '100%'\n }\n}));\n\nconst AutoCompletePopper = (props) => {\n return <Popper {...props} placement='bottom-start' />;\n};\n\nexport const AmbientAutoComplete = (props) => {\n const {\n getOptionLabelFunction,\n getOptionSelected,\n label,\n placeholder,\n options,\n textFieldProps,\n disabled,\n onChange: onChangeProp,\n value,\n additionalOnChangeAction,\n classes: classProps,\n variant = 'filled',\n inputProps,\n inputPropClasses,\n customPopper,\n disableClearable = false,\n defaultValue,\n additionalOptionKey,\n isMultiple = false,\n limitTags,\n renderTags,\n size = 'medium',\n groupBy = null,\n loading,\n disableCloseOnSelect = false,\n ...other\n } = props;\n\n const classes = useStyles(props);\n const { autocompleteRoot } = classProps || {};\n\n const onChange = useCallback(\n (e, value) => {\n if (additionalOnChangeAction) {\n additionalOnChangeAction(value);\n }\n return onChangeProp?.(value);\n },\n [onChangeProp, additionalOnChangeAction]\n );\n\n return (\n <Autocomplete\n id='autocomplete'\n multiple={isMultiple}\n limitTags={limitTags}\n disabled={disabled}\n options={options || []}\n loading={loading}\n getOptionLabel={getOptionLabelFunction}\n getOptionSelected={getOptionSelected}\n groupBy={groupBy}\n onChange={onChange}\n value={value || (isMultiple ? [] : null)}\n className={autocompleteRoot}\n classes={{\n root: classes.formControl\n }}\n PopperComponent={customPopper || AutoCompletePopper}\n disableClearable={disableClearable}\n defaultValue={defaultValue}\n size={size}\n disableCloseOnSelect={disableCloseOnSelect}\n renderInput={(params) => (\n <div className={label ? classes.root : classes.noLabel}>\n <TextField\n {...textFieldProps}\n {...params}\n {...other}\n label={label}\n margin='dense'\n variant={variant}\n size='small'\n InputProps={{\n ...params.InputProps,\n classes: {\n root: classes.input,\n input: classes.formTextInput,\n ...props.InputProps?.classes\n }\n }}\n InputLabelProps={{\n shrink: false,\n classes: {\n root: classes.labelRoot,\n focused: classes.labelFocused\n }\n }}\n />\n </div>\n )}\n renderTags={renderTags}\n />\n );\n};\n","import { ErrorIcon } from '@fluentui/react-icons';\nimport { Typography, makeStyles, Box } from '@material-ui/core';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { FluentButton } from '../inputs/buttons/FluentButton';\nimport { FluentIcon } from '../../utilities/FluentIcon';\nimport { LayoutUnit } from '../../layout/LayoutUnit';\n\nconst useStyles = makeStyles(theme => ({\n container: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n width: '100%',\n },\n secondaryText: {\n color: theme.palette.text.secondary,\n },\n image: {\n width: props => props?.imageWidth,\n },\n}));\n\nexport const EmptyStateDisplay = props => {\n const {\n icon,\n iconSize = 48,\n customIconSize = true,\n imageSrc,\n imageWidth = '100px',\n primaryText,\n secondaryText,\n actionLabel,\n action,\n } = props;\n const classes = useStyles({ imageWidth });\n\n return (\n <div className={classes.container}>\n {imageSrc ? (\n <img src={imageSrc} alt='logo' className={classes.image} />\n ) : (\n <FluentIcon\n component={icon ?? ErrorIcon}\n size={iconSize}\n customSize={customIconSize}\n />\n )}\n <LayoutUnit unit=\"xxs\" />\n {primaryText && (\n <div>\n <Typography variant='subtitle2' align='center'>\n {primaryText}\n </Typography>\n </div>\n )}\n {secondaryText && (\n <div>\n <Typography className={classes.secondaryText} align='center'>\n {secondaryText}\n </Typography>\n </div>\n )}\n {(primaryText || secondaryText) && <LayoutUnit unit=\"xxs\" />}\n {action && (\n <div\n className={primaryText || secondaryText ? classes.buttonWrapper : ''}\n >\n <FluentButton\n onClick={action}\n variant='outlined'\n color='secondary'\n id={\n 'udpRecord-EmptyStateDisplay-' +\n primaryText.replace(/\\s+/g, '') +\n '-' +\n actionLabel.replace(/\\s+/g, '')\n }\n udprecordid={\n 'udpRecord-EmptyStateDisplay-' +\n primaryText.replace(/\\s+/g, '') +\n '-' +\n actionLabel.replace(/\\s+/g, '')\n }\n >\n {actionLabel}\n </FluentButton>\n </div>\n )}\n </div>\n );\n};\n\nEmptyStateDisplay.propTypes = {\n icon: PropTypes.elementType,\n iconSize: PropTypes.number,\n customIconSize: PropTypes.bool,\n imageSrc: PropTypes.string,\n imageWidth: PropTypes.string,\n primaryText: PropTypes.string,\n secondaryText: PropTypes.string,\n actionLabel: PropTypes.string,\n action: PropTypes.func\n};\n\nEmptyStateDisplay.defaultProps = {\n iconSize: 48,\n customIconSize: true,\n imageWidth: '100px'\n};","import React from 'react';\nimport { makeStyles, Button } from '@material-ui/core';\nimport { Alert, AlertTitle } from '@material-ui/lab';\nimport clsx from 'clsx';\n\nconst useStyles = makeStyles(theme => ({\n root: {},\n '@global': {\n '.MuiPaper-rounded': {\n borderRadius: 0,\n },\n },\n alertSuccess: {\n borderLeft: `4px solid ${theme.palette.success.main}`,\n },\n alertWarning: {\n borderLeft: `4px solid ${theme.palette.warning.main}`,\n },\n alertError: {\n borderLeft: `4px solid ${theme.palette.error.main}`,\n color: theme.palette.error.main,\n },\n alertInfo: {\n borderLeft: `4px solid ${theme.palette.info.main}`,\n },\n square: {\n borderRadius: 0,\n },\n}));\n\nexport const AmbientAlert = ({\n alertButton,\n alertMessage,\n alertTitle,\n showAlert,\n alertSeverity,\n closeAlert,\n alertAction,\n alertActionButton,\n alertHandleAction,\n ...otherProps\n}) => {\n const classes = useStyles();\n\n const alertColor = () => {\n if (alertSeverity === 'success') {\n let alertLevel = classes.alertSuccess;\n return alertLevel;\n } else if (alertSeverity === 'warning') {\n let alertLevel = classes.alertWarning;\n return alertLevel;\n } else if (alertSeverity === 'error') {\n let alertLevel = classes.alertError;\n return alertLevel;\n } else if (alertSeverity === 'info') {\n let alertLevel = classes.alertInfo;\n return alertLevel;\n }\n };\n\n return (\n <div>\n {showAlert && (\n <Alert\n classes={{ root: clsx(alertColor(), classes.square) }}\n {...otherProps}\n severity={alertSeverity}\n onClose={closeAlert}\n action={\n alertAction ? (\n <Button\n onClick={alertHandleAction}\n id='udpRecord-AmbientAlert-alertActionButton'\n udprecordid='udpRecord-AmbientAlert-alertActionButton'\n >\n {alertActionButton}\n </Button>\n ) : null\n }\n >\n {alertTitle && <AlertTitle>{alertTitle}</AlertTitle>}\n {alertMessage}\n </Alert>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { StatusChip } from '../../../dataDisplay/StatusChip';\n\nexport const StatusCellRenderer = props => {\n const { value, getStatus, getLabel } = props;\n const formattedLabel = value => {\n return value\n ?.replace(/([a-z])([A-Z])/g, '$1 $2')\n ?.replace(/\\b\\w/g, char => char.toUpperCase());\n };\n return (\n <StatusChip\n status={getStatus(value)}\n label={getLabel ? formattedLabel(getLabel(value)) : formattedLabel(value)}\n />\n );\n};\n","import React, { useMemo, useState, useCallback, useEffect } from 'react';\nimport {\n StatusCircleCheckmarkIcon,\n ErrorIcon,\n DownloadIcon\n} from '@fluentui/react-icons';\nimport { getSanitizedName } from '../../utilities/entities/entityUtilities';\nimport { FluentDialog } from '../../UI/feedback/FluentDialog';\nimport { EmptyStateDisplay } from '../../UI/dataDisplay/EmptyStateDisplay';\nimport { useAxiosGet } from '../../utilities/useAxiosGet';\nimport { ActionsRenderer } from '../../UI/templates/ui/renderers/ActionsRenderer';\nimport { AmbientAlert } from '../../UI/feedback/AmbientAlert';\nimport { TableContainer } from '../../maintenanceEngine/tableBrowser/TableContainer';\nimport { StatusCellRenderer } from '../../UI/templates/ui/renderers/StatusCellRenderer';\nimport { useUser } from '../../utilities/auth/useUser';\nimport { AmbientAutoComplete } from '../../UI/inputs/textField/AmbientAutoComplete';\nimport { executeQueryWithParameters } from '../utilities/methodUtils';\nimport { useHandleAxiosSnackbar } from '../../utilities/apiHelpers';\nimport { ConfigService } from 'udp-react-stencil-component-library';\n\nexport const MyExportsPage = (props) => {\n const { productId } = props;\n const user = useUser();\n const [product, setProduct] = useState();\n const [downloadLinkLoading, setDownloadLinkLoading] = useState(false);\n const [fileResultData, setFileResultData] = useState();\n const [downloadOpen, setDownloadOpen] = useState(false);\n const [noDownloadMethod, setNoDownloadMethod] = useState(false);\n\n const { handleErrorSnackbar, handleSuccessSnackbar } =\n useHandleAxiosSnackbar();\n\n const [{ data: products, loading: productsLoading }] = useAxiosGet(\n ConfigService.tenantV2ApiUrl,\n `tenant/products?tenantId=${user?.currentTenantId}&isSubscribable=${!user\n ?.can?.CAN_MANAGE_CATALOGS_FOR_UNSUBSCRIBABLE_PRODUCTS}`,\n {},\n !user\n );\n\n const [{ data: apiCatalog, loading: catalogLoading, error: catalogError }] =\n useAxiosGet(\n ConfigService.integrationV1ApiUrl,\n `tenantProductApiCatalogBase/tenant/${user?.currentTenantId}/product/${\n productId ? productId : product?.productId\n }`,\n {},\n !(product || productId),\n false\n );\n\n const [{ data: udpJobEntity, loading: jobEntityLoading }] = useAxiosGet(\n ConfigService.integrationV1ApiUrl,\n `apicatalog/${apiCatalog?.apiCatalogId}/promotedMethodEntities/udpJob/product/${apiCatalog?.productId}?compareSanitizedName=true`,\n {},\n !apiCatalog?.productId || !apiCatalog?.apiCatalogId,\n false\n );\n\n const refetchfileResultData = useCallback(\n async (selectedRecord) => {\n if (udpJobEntity?.unityBaseGetFileResultMethod?.apiMethodId) {\n setDownloadLinkLoading(true);\n await executeQueryWithParameters(\n {\n data: { JobId: selectedRecord?.id }\n },\n udpJobEntity?.unityBaseGetFileResultMethod?.apiMethodId\n )\n .then((res) => {\n setFileResultData(res.data);\n })\n .catch((err) => {});\n setDownloadLinkLoading(false);\n } else {\n setNoDownloadMethod(true);\n }\n },\n [udpJobEntity?.unityBaseGetFileResultMethod?.apiMethodId]\n );\n\n const handleSelectRecord = useCallback(\n (data) => {\n refetchfileResultData(data);\n setDownloadOpen(true);\n },\n [refetchfileResultData]\n );\n\n const getOptionLabel = (val) => {\n return val?.name;\n };\n\n const handleProductChange = useCallback((val) => {\n setProduct(val);\n }, []);\n\n const handleFileDownload = useCallback(() => {\n if (fileResultData?.link) {\n const link = document.createElement('a');\n link.href = fileResultData?.link;\n link.download = '';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n setDownloadOpen(false);\n handleSuccessSnackbar('File successfully downloaded');\n }\n }, [fileResultData?.link, handleSuccessSnackbar]);\n\n const getJobStatus = (value) => {\n if (value === 1) {\n return null;\n } else if (value === 2) {\n return 'info';\n } else if (value === 3) {\n return 'success';\n } else if (value === 4) {\n return 'error';\n }\n };\n\n const getJobLabel = (value) => {\n if (value === 1) {\n return 'Pending';\n } else if (value === 2) {\n return 'Running';\n } else if (value === 3) {\n return 'Completed';\n } else if (value === 4) {\n return 'Failed';\n }\n };\n\n useEffect(() => {\n if (catalogError) {\n handleErrorSnackbar(\n '',\n 'Error fetching catalog for the selected product'\n );\n }\n }, [catalogError, handleErrorSnackbar]);\n\n const filterElements = useMemo(() => {\n return [\n {\n searchField: 'jobTypeId',\n searchOperator: '=',\n searchValue: 2\n }\n ];\n }, []);\n\n const actionList = useMemo(() => {\n return [\n {\n id: 1,\n title: 'Download',\n icon: DownloadIcon,\n onClick: handleSelectRecord,\n disabled: false,\n checkDisabled: (value) => value?.statusId !== 3\n }\n ];\n }, [handleSelectRecord]);\n\n const columnDefs = useMemo(\n () => [\n {\n headerName: 'Id',\n sortable: true,\n field: 'id',\n suppressMenu: true\n },\n {\n headerName: 'Name',\n sortable: false,\n field: 'name',\n minWidth: 140,\n suppressMenu: true,\n valueFormatter: (data) => getSanitizedName(data.data.name)\n },\n {\n headerName: 'Date',\n sortable: false,\n valueFormatter: (data) =>\n new Date(data.data.startTime).toLocaleString(),\n minWidth: 130,\n suppressMenu: true\n //sort: 'desc',\n },\n {\n headerName: 'Status',\n field: 'statusId',\n wrapText: true,\n autoHeight: true,\n sortable: false,\n cellRenderer: 'statusCellRenderer',\n cellRendererParams: { getStatus: getJobStatus, getLabel: getJobLabel },\n minWidth: 130,\n maxWidth: 130,\n suppressMenu: true\n },\n\n {\n headerName: 'Actions',\n filter: false,\n pinned: 'right',\n cellRenderer: 'actionsRenderer',\n width: 120,\n maxWidth: 120,\n cellRendererParams: {\n actionList: actionList,\n value: (data) => data\n },\n suppressMenu: true,\n sortable: false,\n cellStyle: { display: 'flex', alignItems: 'center' }\n }\n ],\n [actionList]\n );\n\n return (\n <div>\n {udpJobEntity && !udpJobEntity?.unityBaseSearchMethod?.apiMethodId && (\n <AmbientAlert\n alertMessage={\"UdpJob's search method must be promoted\"}\n showAlert={true}\n alertSeverity={'error'}\n />\n )}\n\n {!productId && (\n <div style={{ margin: '0px 5px 5px 5px' }}>\n <AmbientAutoComplete\n isMultiple={false}\n id={'product'}\n name={'product'}\n label='Product'\n onChange={handleProductChange}\n options={products}\n size='small'\n getOptionLabelFunction={getOptionLabel}\n value={product}\n required\n />\n </div>\n )}\n <TableContainer\n loading={productsLoading || catalogLoading || jobEntityLoading}\n title={`Exports`}\n isServerSide={true}\n eagerLoad={false}\n logicalSearchOperator={2}\n promotedEntity={udpJobEntity}\n filterElements={filterElements}\n actionList={actionList}\n customColumnDefs={columnDefs}\n frameworkComponents={{\n statusCellRenderer: StatusCellRenderer,\n actionsRenderer: ActionsRenderer\n }}\n hideSearchBar\n hiddenActionButtons={[\n 'saveView',\n 'views',\n 'insights',\n 'importExport',\n 'group',\n 'filter',\n 'columns',\n 'clearFilters',\n 'fitGrid',\n 'expandGrid'\n ]}\n height={'calc(100vh - 167px)'}\n dynamicSizing\n />\n <FluentDialog\n actionOne={handleFileDownload}\n actionTwo={() => setDownloadOpen(false)}\n labelOne='Download'\n labelTwo='Cancel'\n open={downloadOpen}\n handleClose={() => setDownloadOpen(false)}\n disableOne={noDownloadMethod || downloadLinkLoading}\n progress={downloadLinkLoading}\n fullWidth\n >\n {noDownloadMethod ? (\n <AmbientAlert\n alertMessage={\"UdpJob's get file result method must be promoted\"}\n showAlert={true}\n alertSeverity={'error'}\n />\n ) : downloadLinkLoading ? (\n <EmptyStateDisplay primaryText={'Fetching download link...'} />\n ) : (\n <EmptyStateDisplay\n icon={noDownloadMethod ? ErrorIcon : StatusCircleCheckmarkIcon}\n primaryText={!noDownloadMethod && 'File is ready to download!'}\n />\n )}\n </FluentDialog>\n </div>\n );\n};\n"],"mappings":"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"}
|