udp-react-enterprise-component-library 25.14.1-beta.13 → 25.14.1-beta.15

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.
@@ -202,10 +202,7 @@ const handleExcelFileUpload = (fileObject, fileProperties) => {
202
202
  const workbook = XLSX.read(data, { type: "array" });
203
203
  const sheetName = workbook.SheetNames[fileProperties?.worksheetNumber?.value - 1];
204
204
  const worksheet = workbook.Sheets[sheetName];
205
- const json = XLSX.utils.sheet_to_json(worksheet, {
206
- header: 1,
207
- range: "A1:Z10"
208
- });
205
+ const json = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
209
206
  if (json.length > 1) {
210
207
  const headers = json[0];
211
208
  const firstDataLine = json[1];
@@ -742,4 +739,4 @@ const ImportDataFromFileMapping = (props) => {
742
739
 
743
740
  //#endregion
744
741
  export { AmbientStepper, FileImportConfigCard, ImportDataFromFileMapping, handleExcelFileUpload, handleJsonFileUpload, handleTextFileUpload };
745
- //# sourceMappingURL=ImportDataFromFileMapping-Cr-Yof-6.js.map
742
+ //# sourceMappingURL=ImportDataFromFileMapping-b_i26ucy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImportDataFromFileMapping-b_i26ucy.js","names":["StepLabel","React","withStyles","StepConnector","makeStyles","Stepper","Step","StepLabel","apiMutate","Divider","apiMutate","FileImportMappingWizard"],"sources":["../src/UI/inputs/menus/AmbientStepper/StepLabel.jsx","../src/UI/inputs/menus/AmbientStepper/AmbientStepper.jsx","../src/udp/fileImportMapping/fileUtils.js","../src/udp/fileImportMapping/FileImportConfigCard.jsx","../src/udp/fileImportMapping/FileImportMappingWizard.jsx","../src/udp/fileImportMapping/ImportDataFromFileMapping.jsx"],"sourcesContent":["import * as React from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { withStyles, Typography } from '@material-ui/core'\n\nexport const styles = (theme) => ({\n /* Styles applied to the root element. */\n root: {\n display: 'flex',\n alignItems: 'center',\n '&$alternativeLabel': {\n flexDirection: 'column'\n },\n '&$disabled': {\n cursor: 'default'\n }\n },\n /* Styles applied to the root element if `orientation=\"horizontal\"`. */\n horizontal: {},\n /* Styles applied to the root element if `orientation=\"vertical\"`. */\n vertical: {},\n /* Styles applied to the `Typography` component which wraps `children`. */\n label: {\n color: theme.palette.text.secondary,\n '&$active': {\n color: theme.palette.text.primary,\n fontWeight: 500\n },\n '&$completed': {\n color: theme.palette.text.primary,\n fontWeight: 500\n },\n '&$alternativeLabel': {\n textAlign: 'center'\n // marginTop: 16,\n },\n '&$error': {\n color: theme.palette.error.main\n }\n },\n /* Pseudo-class applied to the `Typography` component if `active={true}`. */\n active: {},\n /* Pseudo-class applied to the `Typography` component if `completed={true}`. */\n completed: {},\n /* Pseudo-class applied to the root element and `Typography` component if `error={true}`. */\n error: {},\n /* Pseudo-class applied to the root element and `Typography` component if `disabled={true}`. */\n disabled: {},\n /* Styles applied to the `icon` container element. */\n iconContainer: {\n flexShrink: 0, // Fix IE 11 issue\n display: 'flex',\n paddingRight: 8,\n '&$alternativeLabel': {\n paddingRight: 0\n }\n },\n /* Pseudo-class applied to the root and icon container and `Typography` if `alternativeLabel={true}`. */\n alternativeLabel: {},\n /* Styles applied to the container element which wraps `Typography` and `optional`. */\n labelContainer: {\n width: '100%'\n }\n})\n\nconst StepLabel = React.forwardRef(function StepLabel(props, ref) {\n const {\n // eslint-disable-next-line react/prop-types\n active = false,\n // eslint-disable-next-line react/prop-types\n alternativeLabel = false,\n children,\n classes,\n className,\n // eslint-disable-next-line react/prop-types\n completed = false,\n disabled = false,\n error = false,\n // eslint-disable-next-line react/prop-types\n expanded,\n icon,\n // eslint-disable-next-line react/prop-types\n last,\n optional,\n // eslint-disable-next-line react/prop-types\n orientation = 'horizontal',\n StepIconComponent: StepIconComponentProp,\n StepIconProps,\n ...other\n } = props\n\n let StepIconComponent = StepIconComponentProp\n\n return (\n <span\n className={clsx(\n classes.root,\n classes[orientation],\n {\n [classes.disabled]: disabled,\n [classes.alternativeLabel]: alternativeLabel,\n [classes.error]: error\n },\n className\n )}\n ref={ref}\n {...other}\n >\n {icon || StepIconComponent ? (\n <span\n className={clsx(classes.iconContainer, {\n [classes.alternativeLabel]: alternativeLabel\n })}\n >\n <StepIconComponent\n completed={completed}\n active={active}\n error={error}\n icon={icon}\n {...StepIconProps}\n />\n </span>\n ) : null}\n <span className={classes.labelContainer}>\n {children ? (\n <Typography\n variant='body2'\n component='span'\n display='block'\n className={clsx(classes.label, {\n [classes.alternativeLabel]: alternativeLabel,\n [classes.completed]: completed,\n [classes.active]: active,\n [classes.error]: error\n })}\n >\n {children}\n </Typography>\n ) : null}\n {optional}\n </span>\n </span>\n )\n})\n\nStepLabel.propTypes = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n /**\n * In most cases will simply be a string containing a title for the label.\n */\n children: PropTypes.node,\n /**\n * Override or extend the styles applied to the component.\n * See [CSS API](#css) below for more details.\n */\n classes: PropTypes.object,\n /**\n * @ignore\n */\n className: PropTypes.string,\n /**\n * Mark the step as disabled, will also disable the button if\n * `StepLabelButton` is a child of `StepLabel`. Is passed to child components.\n */\n disabled: PropTypes.bool,\n /**\n * Mark the step as failed.\n */\n error: PropTypes.bool,\n /**\n * Override the default label of the step icon.\n */\n icon: PropTypes.node,\n /**\n * The optional node to display.\n */\n optional: PropTypes.node,\n /**\n * The component to render in place of the [`StepIcon`](/api/step-icon/).\n */\n StepIconComponent: PropTypes.elementType,\n /**\n * Props applied to the [`StepIcon`](/api/step-icon/) element.\n */\n StepIconProps: PropTypes.object\n}\n\nStepLabel.muiName = 'StepLabel'\n\n/**\n * Explicit any export to avoid non-portable inferred React types in declaration output.\n * @type {any}\n */\nconst StepLabelExport = withStyles(styles, { name: 'MuiStepLabel' })(StepLabel)\n\nexport default StepLabelExport\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { makeStyles, withStyles } from '@material-ui/core/styles'\nimport clsx from 'clsx'\nimport Stepper from '@material-ui/core/Stepper'\nimport Step from '@material-ui/core/Step'\n// import StepLabel from '@material-ui/core/StepLabel';\nimport Check from '@material-ui/icons/esm/Check'\nimport StepConnector from '@material-ui/core/StepConnector'\nimport StepLabel from './StepLabel'\n\nconst QontoConnector = withStyles({\n alternativeLabel: {\n top: 10,\n left: 'calc(-50% + 16px)',\n right: 'calc(50% + 16px)'\n },\n active: {\n '& $line': {\n borderColor: '#09A58C'\n }\n },\n completed: {\n '& $line': {\n borderColor: '#09A58C'\n }\n },\n line: {\n borderColor: '#eaeaf0',\n borderTopWidth: 3,\n borderRadius: 1\n }\n})(StepConnector)\n\nconst useQontoStepIconStyles = makeStyles({\n root: {\n color: '#09A58C',\n display: 'flex',\n height: 22,\n alignItems: 'center'\n },\n active: {\n color: '#09A58C'\n },\n circle: {\n width: 16,\n height: 16,\n borderRadius: '50%',\n border: '2px solid currentColor'\n },\n completed: {\n color: '#09A58C',\n zIndex: 1,\n fontSize: 18\n },\n stepLabel: {\n display: 'none'\n },\n rootStepper: {\n background: 'blue'\n }\n})\n\nconst QontoStepIcon = (props) => {\n const classes = useQontoStepIconStyles()\n const { active, completed } = props\n\n return (\n <div\n className={clsx(classes.root, {\n [classes.active]: active\n })}\n >\n {completed ? (\n <Check className={classes.completed} />\n ) : (\n <div className={classes.circle} />\n )}\n </div>\n )\n}\n\nQontoStepIcon.propTypes = {\n /**\n * Whether this step is active.\n */\n active: PropTypes.bool,\n /**\n * Mark the step as completed. Is passed to child components.\n */\n completed: PropTypes.bool\n}\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n width: '100%'\n },\n button: {\n marginRight: theme.spacing(1)\n },\n instructions: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1)\n },\n rootStep: {\n marginTop: 0\n }\n}))\n\n// function getSteps() {\n// return [\n// 'Select campaign settings',\n// 'Create an ad group',\n// 'Create an ad',\n// 'another',\n// ];\n// }\n\nexport const AmbientStepper = ({ activeStep, steps, orientation }) => {\n const classes = useStyles()\n\n return (\n <div className={classes.root}>\n <Stepper\n style={{ background: 'transparent', padding: 0 }}\n classes={{ root: classes.rootStepper }}\n alternativeLabel\n activeStep={activeStep}\n connector={<QontoConnector />}\n orietation={orientation}\n >\n {steps.map((label) => (\n <Step classes={{ root: classes.rootStep }} key={label}>\n <StepLabel\n className={classes.stepLabel}\n StepIconComponent={QontoStepIcon}\n >\n <span style={{ fontSize: 14 }}>{label}</span>\n </StepLabel>\n </Step>\n ))}\n </Stepper>\n </div>\n )\n}\n","import * as XLSX from 'xlsx';\n\nexport const handleExcelFileUpload = (fileObject, fileProperties) => {\n return new Promise((resolve, reject) => {\n if (fileObject) {\n const reader = new FileReader();\n\n reader.onload = function (e) {\n const data = new Uint8Array(e.target.result);\n const workbook = XLSX.read(data, { type: 'array' });\n\n const sheetName = workbook.SheetNames[fileProperties?.worksheetNumber?.value - 1];\n const worksheet = workbook.Sheets[sheetName];\n\n // Get the headers (first row) and first data line\n const json = XLSX.utils.sheet_to_json(worksheet, {\n header: 1,\n });\n if (json.length > 1) {\n const headers = json[0]; // First row as headers\n const firstDataLine = json[1]; // Second row as the first data line\n resolve({ headers: headers, sampleData: firstDataLine });\n }\n else{\n reject(\"Could not get file headers\")\n }\n };\n reader.onerror = function () {\n reject('Error reading the file.');\n };\n\n reader.readAsArrayBuffer(fileObject); // Read the file as an ArrayBuffer\n } else {\n reject('No file provided');\n }\n });\n};\n\nexport const handleTextFileUpload = (fileObject, fileProperties) => {\n return new Promise((resolve, reject) => {\n if (fileObject) {\n const chunkSize = 1024; // Read 1024 bytes at a time\n let offset = 0; // Start reading at the beginning of the file\n let accumulatedData = '';\n\n const reader = new FileReader();\n\n reader.onload = function (e) {\n accumulatedData += e.target.result;\n\n const lines = accumulatedData.split('\\n');\n if (lines.length > 2) {\n const headers = lines[0].replace(/\\r/g, '').split(fileProperties?.delimiter?.value);\n const firstDataLine = lines[1].replace(/\\r/g, '').split(fileProperties?.delimiter?.value);\n resolve({ headers: headers, sampleData: firstDataLine });\n } else {\n // If the header is not found and there's more data to read\n if (offset < fileObject.size) {\n readNextChunk();\n }\n }\n };\n reader.onerror = function () {\n reject('Error reading the file.');\n };\n\n function readNextChunk() {\n // Read the next 1024 bytes\n const blob = fileObject.slice(offset, offset + chunkSize);\n reader.readAsText(blob);\n offset += chunkSize;\n }\n readNextChunk();\n } else {\n reject('No file provided');\n }\n });\n};\n\nexport const handleJsonFileUpload = (fileObject, fileProperties) => {\n return new Promise((resolve, reject) => {\n if (fileObject) {\n const reader = new FileReader();\n\n reader.onload = function (e) {\n try {\n const jsonData = JSON.parse(e.target.result);\n const dataAtPath = fileProperties?.jsonPath ? getValueByPath(jsonData, fileProperties?.jsonPath) : jsonData;\n\n if (Array.isArray(dataAtPath) && dataAtPath.length > 0) {\n const keys = Object.keys(dataAtPath[0]);\n resolve({ headers: keys, sampleData: dataAtPath[0] });\n } else {\n reject('The JSON file does not contain an array or is empty.');\n }\n } catch (err) {\n reject('Error parsing JSON file:', err);\n }\n };\n reader.onerror = function () {\n reject('Error reading the file.');\n };\n\n reader.readAsText(fileObject);\n } else {\n reject('No file provided');\n }\n });\n};\n\nconst getValueByPath = (obj, path) => {\n return path.split('.').reduce((acc, key) => acc && acc[key], obj);\n }\n","import React, { useState, useMemo } from 'react';\nimport { AmbientCard } from '../../UI/surfaces/cards/AmbientCard';\nimport { CompactDataListItem } from '../../UI/dataDisplay/CompactDataListItem';\nimport { Typography, Divider } from '@material-ui/core';\nimport { FluentIcon } from '../../utilities/iconLibrary/FluentIcon';\nimport { ChromeBackMirroredIcon } from '@fluentui/react-icons';\n\nexport const FileImportConfigCard = (props) => {\n const { fileMappingRecord, domain } = props;\n const [showIndexNumbers, setShowIndexNumbers] = useState(false);\n\n const parsedProperties = useMemo(() => {\n if (fileMappingRecord) {\n let parsedObject = fileMappingRecord?.properties;\n if (typeof fileMappingRecord?.properties === 'string') {\n parsedObject = JSON.parse(fileMappingRecord?.properties);\n }\n if (\n 'includesHeader' in parsedObject &&\n parsedObject?.includesHeader === false\n ) {\n setShowIndexNumbers(true);\n } else {\n setShowIndexNumbers(false);\n }\n return Object.entries(parsedObject).map(([key, value]) => ({\n key,\n value\n }));\n }\n }, [fileMappingRecord]);\n\n const parsedFieldMappings = useMemo(() => {\n let parsedObject = fileMappingRecord?.mapping;\n if (typeof fileMappingRecord?.mapping === 'string') {\n parsedObject = JSON.parse(fileMappingRecord?.mapping);\n }\n if (fileMappingRecord) {\n return Object.entries(parsedObject);\n }\n }, [fileMappingRecord]);\n\n return (\n parsedFieldMappings && (\n <AmbientCard fullWidth title='Mapping Configuration' subtitle={domain}>\n {parsedProperties?.map((property) => (\n <CompactDataListItem\n label={property?.key\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/^./, function (char) {\n return char.toUpperCase();\n })}\n value={\n property?.value === false\n ? 'False'\n : property?.value === true\n ? 'True'\n : property?.value\n }\n />\n ))}\n\n <>\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n paddingTop: 20\n }}\n >\n <Typography variant='caption'>\n {showIndexNumbers ? \"Column index's\" : 'File Headers'}\n </Typography>\n <Typography variant='caption'>Fields</Typography>\n </div>\n <Divider style={{ marginTop: 5, marginBottom: -14 }} />\n {parsedFieldMappings?.map((field) => (\n <div style={{ height: 42 }}>\n <div style={{ display: 'flex', flexDirection: 'row', gap: 10 }}>\n <Typography style={{ marginTop: 25, width: '50%' }}>\n {showIndexNumbers\n ? 'index ' + field[1]?.headerIndex\n : field[1]?.importFileField}\n </Typography>\n <FluentIcon\n style={{ marginTop: 28, width: '10%' }}\n component={ChromeBackMirroredIcon}\n />\n <Typography\n style={{ marginTop: 25, width: '50%', textAlign: 'right' }}\n >\n {field[1]?.udpField.replace(/([A-Z])/g, ' $1').trim()}\n </Typography>\n </div>\n <Divider style={{ margin: '5px 0px' }} />\n </div>\n ))}\n </>\n </AmbientCard>\n )\n );\n};\n","import React, { useMemo, useState, useCallback, useEffect } from 'react';\nimport { useUser } from '../../utilities/auth/useUser';\nimport { useAxiosGet } from '../../utilities/useAxiosGet';\nimport { AmbientCard } from '../../UI/surfaces/cards/AmbientCard';\nimport { AmbientAutoComplete } from '../../UI/inputs/textField/AmbientAutoComplete';\nimport { usePromotedMethodEntity } from '../../hooks/usePromotedMethodEntity';\nimport { executeQueryAdHoc } from '../utilities/methodUtils';\nimport { Form } from '../../utilities/form';\nimport { Field } from '../../utilities/form';\nimport { FormButtons } from '../../utilities/form';\nimport { SubmitButton } from '../../utilities/form';\nimport { FluentIcon } from '../../utilities/iconLibrary/FluentIcon';\nimport { AmbientStepper } from '../../UI/inputs/menus/AmbientStepper/AmbientStepper';\nimport { apiMutate } from '../../utilities/useAxiosMutate';\nimport { useHandleAxiosSnackbar } from '../../utilities/apiHelpers';\nimport { DragDropFileUpload } from '../../uploader/DragDropFileUpload';\nimport { Typography } from '@material-ui/core';\nimport { ChromeBackMirroredIcon } from '@fluentui/react-icons';\nimport { FluentButton } from '../../UI/inputs/buttons/FluentButton';\nimport { AmbientTextField } from '../../UI/inputs/textField/AmbientTextField';\nimport { Divider } from '../../UI/utilityDisplay/Divider';\nimport {\n handleExcelFileUpload,\n handleJsonFileUpload,\n handleTextFileUpload\n} from './fileUtils';\nimport { FileImportConfigCard } from './FileImportConfigCard';\nimport { getSanitizedName } from '../../utilities/entities/entityUtilities';\nimport { ConfigService } from 'udp-react-stencil-component-library';\n\nconst FileImportMappingWizard = (props) => {\n const { refetchMappings, setNewFileMappingSidesheetOpen, verifyRequiredFields } = props;\n const user = useUser();\n const [importHeaderData, setImportHeaderData] = useState();\n const [udpObjectList, setUdpObjectList] = useState();\n const [selectedDomain, setSelectedDomain] = useState();\n const [selectedFileType, setSelectedFileType] = useState();\n const [fileObject, setFileObject] = useState();\n const [fileImportMappingObject, setFileImportMappingObject] = useState({});\n const [activeStep, setActiveStep] = useState(0);\n const [showIndexNumbers, setShowIndexNumbers] = useState(false);\n const [errorText, setErrorText] = useState('');\n const { handleErrorSnackbar, handleSuccessSnackbar } =\n useHandleAxiosSnackbar();\n\n const executeCreateFileMapping = useCallback(\n async (data) =>\n apiMutate(\n ConfigService.productV1ApiUrl,\n `UdpFileImportMapping`,\n {\n method: 'post'\n },\n { data }\n ),\n []\n );\n const { data: udpObjectEntity } = usePromotedMethodEntity(\n 'UdpObjectInfo',\n true\n );\n\n const [{ data: allowedFileTypesData }, refetchAllowedFileTypes] = useAxiosGet(\n ConfigService.productV1ApiUrl,\n `UdpFileImportType`,\n {},\n false\n );\n\n const searchUdpObjectData = useCallback(async () => {\n if (udpObjectEntity?.unityBaseSearchMethod?.apiMethodId && user?.id) {\n const sapUserRes = await executeQueryAdHoc(\n {\n data: {\n eagerLoad: true,\n pageSize: 200,\n filterElements: []\n }\n },\n udpObjectEntity?.unityBaseSearchMethod?.apiMethodId\n );\n if (sapUserRes?.data?.pageList.length > 0) {\n setUdpObjectList(sapUserRes?.data?.pageList);\n }\n }\n }, [udpObjectEntity, user]);\n\n const filterCatalogObjectList = useMemo(() => {\n return udpObjectList;\n }, [udpObjectList]);\n\n const getNameFormattedOptionLabel = (option) => {\n return option?.name.replace(/([A-Z])/g, ' $1').trim();\n };\n\n const getNameOptionLabel = (option) => {\n return option?.name;\n };\n\n const handleFileUpload = async (properties) => {\n let result;\n if (\n selectedFileType.extension === '.csv' ||\n selectedFileType.extension === '.txt'\n ) {\n result = await handleTextFileUpload(fileObject, properties);\n } else if (selectedFileType.extension === '.xlsx') {\n result = await handleExcelFileUpload(fileObject, properties);\n } else if (selectedFileType.extension === '.json') {\n result = await handleJsonFileUpload(fileObject, properties);\n }\n setImportHeaderData(result?.headers);\n };\n\n useEffect(() => {\n searchUdpObjectData();\n }, [searchUdpObjectData]);\n\n const handleCreateNewFieldMapping = useCallback(\n async (values) => {\n const response = await executeCreateFileMapping({\n name: values.name,\n objectInfoSanitizedName: getSanitizedName(selectedDomain.name),\n fileImportType: selectedFileType.id,\n mapping: JSON.stringify(fileImportMappingObject?.mapping),\n properties: JSON.stringify(fileImportMappingObject?.properties)\n }).catch((res) => {\n handleErrorSnackbar(res);\n });\n if (response?.status === 201) {\n handleSuccessSnackbar('Created Mapping');\n refetchMappings();\n setNewFileMappingSidesheetOpen(false);\n }\n },\n [\n executeCreateFileMapping,\n selectedDomain?.name,\n selectedFileType?.id,\n fileImportMappingObject?.mapping,\n fileImportMappingObject?.properties,\n handleErrorSnackbar,\n handleSuccessSnackbar,\n refetchMappings,\n setNewFileMappingSidesheetOpen\n ]\n );\n\n const handleUpdateFieldMapping = (values) => {\n let valid = true;\n selectedDomain?.objectFieldInfo?.forEach((option) => {\n if (\n !option.dataType.endsWith('?') &&\n !option.isPrimaryKey &&\n !option.udpType\n ) {\n if (\n !Object.entries(values).some(\n (obj) => obj[1].businessObjectKey === option.businessObjectKey\n )\n ) {\n if(verifyRequiredFields){\n valid = false;\n }\n }\n }\n });\n if (!valid) {\n setErrorText('All required Udp fields must have a mapping');\n return;\n }\n const filteredMappings = Object.entries(values)\n .filter(([key, value]) => value !== null)\n .reduce((acc, [key, value]) => {\n acc[key] = value;\n return acc;\n }, {});\n const mappedFieldIndexes = Object.keys(filteredMappings).map((key) =>\n parseInt(key.split('udpFieldMapping')[1], 10)\n );\n const fieldMappings = Object.values(filteredMappings).map(\n (selectedUdpField, index) => {\n return {\n udpField: selectedUdpField.name,\n importFileField: !showIndexNumbers\n ? importHeaderData[mappedFieldIndexes[index]]\n : null,\n headerIndex: !showIndexNumbers ? -1 : mappedFieldIndexes[index]\n };\n }\n );\n setFileImportMappingObject((prev) => {\n return { ...prev, mapping: fieldMappings };\n });\n setActiveStep((prev) => prev + 1);\n };\n\n const handleUpdateFileProperties = (values) => {\n setFileImportMappingObject((prev) => {\n let properties = {};\n Object.keys(values).forEach(\n (propKey) =>\n (properties[propKey] =\n 'value' in values[propKey]\n ? values[propKey]?.value\n : values[propKey])\n );\n return { ...prev, properties: properties };\n });\n if ('includesHeader' in values && values?.includesHeader.value === false) {\n setShowIndexNumbers(true);\n }\n handleFileUpload(values);\n setActiveStep((prev) => prev + 1);\n };\n\n const getUdpFieldOptionLabel = (option) => {\n if (\n !option.dataType.endsWith('?') &&\n !option.isPrimaryKey &&\n !option.udpType\n ) {\n return `${option.name.replace(/([A-Z])/g, ' $1').trim()}*`; //required field\n }\n return `${option.name} - ${option.dataType}`;\n };\n\n const handleAddFileToUpload = (fileObj) => {\n setFileObject(fileObj[0]);\n };\n\n const formattedFileTypeProperties = useMemo(() => {\n if (selectedFileType) {\n return JSON.parse(selectedFileType?.properties);\n }\n }, [selectedFileType]);\n\n return (\n <>\n <AmbientCard fullWidth>\n <div style={{ marginBottom: 20 }}>\n <AmbientStepper\n activeStep={activeStep}\n steps={['File', 'Domain', 'Field Mappings', 'Review']}\n orientation='vertical'\n />\n </div>\n {activeStep === 0 && (\n <>\n <AmbientAutoComplete\n isMultiple={false}\n id={'fileImportType'}\n name={'fileImportType'}\n label='File Type'\n onChange={(val) => setSelectedFileType(val)}\n options={allowedFileTypesData}\n size='small'\n getOptionLabelFunction={getNameOptionLabel}\n value={selectedFileType}\n required\n />\n {selectedFileType && (\n <div style={{ marginTop: 5 }}>\n <DragDropFileUpload\n handleUploadFile={handleAddFileToUpload}\n accept={{\n 'text/csv': ['.csv'],\n 'text/plain': ['.txt'],\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':\n ['.xlsx'],\n 'application/json': ['.json']\n }}\n />\n </div>\n )}\n <Form onSubmit={handleUpdateFileProperties}>\n {formattedFileTypeProperties?.map((property) =>\n property?.options ? (\n <Field\n component={AmbientAutoComplete}\n isMultiple={false}\n id={property.propertyName}\n name={property.propertyName}\n label={property.label}\n options={property.options}\n size='small'\n getOptionLabelFunction={getNameOptionLabel}\n required={property?.required}\n />\n ) : (\n <Field\n component={AmbientTextField}\n isMultiple={false}\n id={property.propertyName}\n name={property.propertyName}\n label={property.label}\n size='small'\n getOptionLabelFunction={getNameOptionLabel}\n required={property?.required}\n />\n )\n )}\n <FormButtons\n style={{\n display: 'flex',\n float: 'right',\n marginRight: -16\n }}\n >\n <SubmitButton\n variant='contained'\n color='secondary'\n disablePristine={false}\n disabled={!fileObject}\n >\n Next\n </SubmitButton>\n </FormButtons>\n </Form>\n </>\n )}\n {activeStep === 1 && (\n <>\n <AmbientAutoComplete\n isMultiple={false}\n id={'domain'}\n name={'domain'}\n label='Domain'\n onChange={(val) => setSelectedDomain(val)}\n options={filterCatalogObjectList}\n size='small'\n getOptionLabelFunction={getNameFormattedOptionLabel}\n value={selectedDomain}\n required\n />\n <div\n style={{ float: 'right', display: 'flex', gap: 8, marginTop: 8 }}\n >\n <FluentButton\n variant='contained'\n onClick={() => setActiveStep((prev) => prev - 1)}\n disabled={activeStep === 0}\n >\n Prev\n </FluentButton>\n <FluentButton\n variant='contained'\n onClick={() => setActiveStep((prev) => prev + 1)}\n color='secondary'\n disabled={!selectedDomain}\n >\n Next\n </FluentButton>\n </div>\n </>\n )}\n {activeStep === 2 && (\n <>\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n paddingTop: 20\n }}\n >\n <Typography variant='caption'>\n {showIndexNumbers ? \"Column index's\" : 'File Headers'}\n </Typography>\n <Typography variant='caption'>UDP Fields</Typography>\n </div>\n <Divider style={{ margin: '5px 0px' }} />\n <Form\n onSubmit={handleUpdateFieldMapping}\n style={{ marginTop: -20 }}\n >\n {importHeaderData?.map((field, index) => (\n <div style={{ height: 42 }}>\n <div\n style={{ display: 'flex', flexDirection: 'row', gap: 10 }}\n >\n <Typography style={{ marginTop: 25, width: '50%' }}>\n {showIndexNumbers ? 'index ' + index : field}\n </Typography>\n <FluentIcon\n style={{ marginTop: 28, width: '10%' }}\n component={ChromeBackMirroredIcon}\n />\n <Field\n style={{ height: 30 }}\n component={AmbientAutoComplete}\n isMultiple={false}\n id={`udpFieldMapping${index}`}\n name={`udpFieldMapping${index}`}\n options={selectedDomain?.objectFieldInfo}\n size='small'\n getOptionLabelFunction={getUdpFieldOptionLabel}\n />\n </div>\n <Divider style={{ margin: '5px 0px' }} />\n </div>\n ))}\n <div style={{ paddingTop: 20, textAlign: 'right', color: 'red' }}>\n {errorText}\n </div>\n <FormButtons\n style={{\n display: 'flex',\n float: 'right',\n paddingTop: 16,\n marginRight: -16\n }}\n >\n <FluentButton\n variant='contained'\n onClick={() => setActiveStep((prev) => prev - 1)}\n disabled={activeStep === 0}\n >\n Prev\n </FluentButton>\n <SubmitButton\n variant='contained'\n color='secondary'\n disablePristine={false}\n >\n Next\n </SubmitButton>\n </FormButtons>\n </Form>\n </>\n )}\n {activeStep === 3 && (\n <Form onSubmit={handleCreateNewFieldMapping}>\n <Field\n component={AmbientTextField}\n id={`name`}\n name={`name`}\n label='Mapping Name'\n size='small'\n />\n <FormButtons\n style={{\n display: 'flex',\n float: 'right',\n marginRight: -16\n }}\n >\n <FluentButton\n variant='contained'\n onClick={() => setActiveStep((prev) => prev - 1)}\n disabled={activeStep === 0}\n >\n Prev\n </FluentButton>\n <SubmitButton\n variant='contained'\n color='secondary'\n disablePristine={false}\n >\n {'Create Mapping'}\n </SubmitButton>\n </FormButtons>\n </Form>\n )}\n </AmbientCard>\n {fileImportMappingObject?.mapping &&<div style={{ marginTop: 10 }}>\n <FileImportConfigCard\n fileMappingRecord={{\n mapping: fileImportMappingObject?.mapping,\n properties: fileImportMappingObject?.properties\n }}\n domain={selectedDomain?.name.replace(/([A-Z])/g, ' $1').trim()}\n />\n </div>}\n </>\n );\n};\n\nexport default FileImportMappingWizard;\n","import React, { useState, useCallback, useEffect } from 'react';\nimport { AmbientCard } from '../../UI/surfaces/cards/AmbientCard';\nimport { AmbientAutoComplete } from '../../UI/inputs/textField/AmbientAutoComplete';\nimport { FluentButton } from '../../UI/inputs/buttons/FluentButton';\nimport { apiMutate } from '../../utilities/useAxiosMutate';\nimport { useHandleAxiosSnackbar } from '../../utilities/apiHelpers';\nimport { SideSheet } from '../../UI/surfaces/SideSheet';\nimport { DragDropFileUpload } from '../../uploader/DragDropFileUpload';\nimport FileImportMappingWizard from './FileImportMappingWizard';\nimport { usePromotedMethodEntity } from '../../hooks/usePromotedMethodEntity';\nimport { executeQueryAdHoc } from '../utilities/methodUtils';\nimport { useUser } from '../../utilities/auth/useUser';\nimport { FileImportConfigCard } from './FileImportConfigCard';\nimport { ConfigService } from 'udp-react-stencil-component-library';\n\nexport const ImportDataFromFileMapping = (props) => {\n const {onImportSuccess, onImportFail, verifyRequiredFields = true} = props\n const user = useUser();\n const [selectedFileMapping, setSelectedFileMapping] = useState();\n const [udpImportMappingData, setUdpImportMappingData] = useState();\n const [newFileMappingSidesheetOpen, setNewFileMappingSidesheetOpen] =\n useState(false);\n const [fileObject, setFileObject] = useState();\n const [isLoading, setIsLoading] = useState(false)\n const { handleErrorSnackbar, handleSuccessSnackbar } =\n useHandleAxiosSnackbar();\n\n const { data: udpFileImportMappingEntity } = usePromotedMethodEntity(\n 'UdpFileImportMapping',\n true\n );\n\n const executeImportDataFromFile = useCallback(\n async (data) =>\n apiMutate(\n ConfigService.productV1ApiUrl,\n `${selectedFileMapping?.objectInfoSanitizedName}/fileImportMapping`,\n {\n method: 'post'\n },\n { data }\n ),\n [selectedFileMapping]\n );\n\n const searchFileImportMappingData = useCallback(async () => {\n if (udpFileImportMappingEntity?.unityBaseSearchMethod?.apiMethodId) {\n const res = await executeQueryAdHoc(\n {\n data: {\n eagerLoad: true,\n pageSize: 200,\n filterElements: []\n }\n },\n udpFileImportMappingEntity?.unityBaseSearchMethod?.apiMethodId\n );\n if (res?.data?.pageList.length > 0) {\n setUdpImportMappingData(res?.data?.pageList);\n }\n }\n }, [udpFileImportMappingEntity?.unityBaseSearchMethod?.apiMethodId]);\n\n useEffect(() => {\n searchFileImportMappingData();\n }, [searchFileImportMappingData]);\n\n const handleImportDataFromFile = useCallback(async () => {\n setIsLoading(true)\n const file = fileObject;\n const blob = new Blob([file], { type: file.type });\n const formData = new FormData();\n formData.append('file', blob, file.name);\n formData.append('tenantId', user?.currentTenantId);\n formData.append('name', selectedFileMapping.name);\n formData.append('objectInfoSanitizedName', selectedFileMapping.objectInfoSanitizedName);\n formData.append('fileImportType', selectedFileMapping.fileImportType);\n formData.append('mapping', selectedFileMapping.mapping);\n formData.append('properties', selectedFileMapping.properties);\n formData.append('id', selectedFileMapping.id);\n const response = await executeImportDataFromFile(formData).catch((res) => {\n setIsLoading(false)\n handleErrorSnackbar(res);\n onImportFail()\n });\n if (response?.status === 201) {\n handleSuccessSnackbar('Imported Data');\n setIsLoading(false)\n onImportSuccess && onImportSuccess()\n }\n\n }, [\n fileObject,\n selectedFileMapping,\n executeImportDataFromFile,\n handleErrorSnackbar,\n handleSuccessSnackbar,\n user,\n onImportSuccess,\n onImportFail\n ]);\n\n const getFileMappingOptionlabel = (option) => {\n return `${option.name} (${option?.udpFileImportMappingUdpFileImportType?.extension})`;\n };\n\n const handleAddFileToUpload = (fileObj) => {\n setFileObject(fileObj[0]);\n };\n\n return (\n <>\n <AmbientCard fullWidth>\n <div style={{ display: 'flex' }}>\n <AmbientAutoComplete\n isMultiple={false}\n id={'fileMapping'}\n name={'fileMapping'}\n label='File Mapping'\n onChange={(val) => setSelectedFileMapping(val)}\n options={udpImportMappingData}\n size='small'\n getOptionLabelFunction={getFileMappingOptionlabel}\n value={selectedFileMapping}\n required\n groupBy={(option) =>\n option?.udpFileImportMappingUdpObjectInfo?.sanitizedName\n }\n />\n </div>\n {selectedFileMapping && (\n <DragDropFileUpload\n handleUploadFile={handleAddFileToUpload}\n accept={{\n 'text/csv': ['.csv'],\n 'text/plain': ['.txt'],\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':\n ['.xlsx'],\n 'application/json': ['.json']\n }}\n />\n )}\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n gap: 5,\n float: 'right',\n marginTop: 10\n }}\n >\n <FluentButton\n onClick={() => setNewFileMappingSidesheetOpen(true)}\n variant='outlined'\n >\n Create New Mapping\n </FluentButton>\n <FluentButton\n variant='contained'\n color='secondary'\n onClick={handleImportDataFromFile}\n progress={isLoading}\n disabled={!fileObject}\n >\n Import Data\n </FluentButton>\n </div>\n <SideSheet\n title='Create New File Mapping'\n open={newFileMappingSidesheetOpen}\n onClose={() => setNewFileMappingSidesheetOpen(false)}\n width={'60%'}\n >\n <FileImportMappingWizard\n refetchMappings={searchFileImportMappingData}\n setNewFileMappingSidesheetOpen={setNewFileMappingSidesheetOpen}\n verifyRequiredFields={verifyRequiredFields}\n />\n </SideSheet>\n </AmbientCard>\n <div style={{ marginTop: 10 }}>\n <FileImportConfigCard fileMappingRecord={selectedFileMapping} domain={selectedFileMapping?.udpFileImportMappingUdpObjectInfo?.sanitizedName.replace(/([A-Z])/g, ' $1').trim()}/>\n </div>\n </>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAa,UAAU,WAAW;CAEhC,MAAM;EACJ,SAAS;EACT,YAAY;EACZ,sBAAsB,EACpB,eAAe,UAChB;EACD,cAAc,EACZ,QAAQ,WACT;EACF;CAED,YAAY,EAAE;CAEd,UAAU,EAAE;CAEZ,OAAO;EACL,OAAO,MAAM,QAAQ,KAAK;EAC1B,YAAY;GACV,OAAO,MAAM,QAAQ,KAAK;GAC1B,YAAY;GACb;EACD,eAAe;GACb,OAAO,MAAM,QAAQ,KAAK;GAC1B,YAAY;GACb;EACD,sBAAsB,EACpB,WAAW,UAEZ;EACD,WAAW,EACT,OAAO,MAAM,QAAQ,MAAM,MAC5B;EACF;CAED,QAAQ,EAAE;CAEV,WAAW,EAAE;CAEb,OAAO,EAAE;CAET,UAAU,EAAE;CAEZ,eAAe;EACb,YAAY;EACZ,SAAS;EACT,cAAc;EACd,sBAAsB,EACpB,cAAc,GACf;EACF;CAED,kBAAkB,EAAE;CAEpB,gBAAgB,EACd,OAAO,QACR;CACF;AAED,MAAMA,cAAYC,QAAM,WAAW,SAASD,YAAU,OAAO,KAAK;CAChE,MAAM,EAEJ,SAAS,OAET,mBAAmB,OACnB,UACA,SACA,WAEA,YAAY,OACZ,WAAW,OACX,QAAQ,OAER,UACA,MAEA,MACA,UAEA,cAAc,cACd,mBAAmB,uBACnB,cACA,GAAG,UACD;CAEJ,IAAI,oBAAoB;AAExB,QACE,sCAAC;EACC,WAAW,KACT,QAAQ,MACR,QAAQ,cACR;IACG,QAAQ,WAAW;IACnB,QAAQ,mBAAmB;IAC3B,QAAQ,QAAQ;GAClB,EACD,UACD;EACI;EACL,GAAI;IAEH,QAAQ,oBACP,sCAAC,UACC,WAAW,KAAK,QAAQ,eAAe,GACpC,QAAQ,mBAAmB,kBAC7B,CAAC,IAEF,sCAAC;EACY;EACH;EACD;EACD;EACN,GAAI;GACJ,CACG,GACL,MACJ,sCAAC,UAAK,WAAW,QAAQ,kBACtB,WACC,sCAAC;EACC,SAAQ;EACR,WAAU;EACV,SAAQ;EACR,WAAW,KAAK,QAAQ,OAAO;IAC5B,QAAQ,mBAAmB;IAC3B,QAAQ,YAAY;IACpB,QAAQ,SAAS;IACjB,QAAQ,QAAQ;GAClB,CAAC;IAED,SACU,GACX,MACH,SACI,CACF;EAET;AAEF,YAAU,YAAY;CAQpB,UAAU,UAAU;CAKpB,SAAS,UAAU;CAInB,WAAW,UAAU;CAKrB,UAAU,UAAU;CAIpB,OAAO,UAAU;CAIjB,MAAM,UAAU;CAIhB,UAAU,UAAU;CAIpB,mBAAmB,UAAU;CAI7B,eAAe,UAAU;CAC1B;AAED,YAAU,UAAU;;;;;AAMpB,MAAM,kBAAkB,WAAW,QAAQ,EAAE,MAAM,gBAAgB,CAAC,CAACA,YAAU;AAE/E,wBAAe;;;;AC3Lf,MAAM,iBAAiBE,aAAW;CAChC,kBAAkB;EAChB,KAAK;EACL,MAAM;EACN,OAAO;EACR;CACD,QAAQ,EACN,WAAW,EACT,aAAa,WACd,EACF;CACD,WAAW,EACT,WAAW,EACT,aAAa,WACd,EACF;CACD,MAAM;EACJ,aAAa;EACb,gBAAgB;EAChB,cAAc;EACf;CACF,CAAC,CAACC,gBAAc;AAEjB,MAAM,yBAAyBC,aAAW;CACxC,MAAM;EACJ,OAAO;EACP,SAAS;EACT,QAAQ;EACR,YAAY;EACb;CACD,QAAQ,EACN,OAAO,WACR;CACD,QAAQ;EACN,OAAO;EACP,QAAQ;EACR,cAAc;EACd,QAAQ;EACT;CACD,WAAW;EACT,OAAO;EACP,QAAQ;EACR,UAAU;EACX;CACD,WAAW,EACT,SAAS,QACV;CACD,aAAa,EACX,YAAY,QACb;CACF,CAAC;AAEF,MAAM,iBAAiB,UAAU;CAC/B,MAAM,UAAU,wBAAwB;CACxC,MAAM,EAAE,QAAQ,cAAc;AAE9B,QACE,oCAAC,SACC,WAAW,KAAK,QAAQ,MAAM,GAC3B,QAAQ,SAAS,QACnB,CAAC,IAED,YACC,oCAAC,SAAM,WAAW,QAAQ,YAAa,GAEvC,oCAAC,SAAI,WAAW,QAAQ,SAAU,CAEhC;;AAIV,cAAc,YAAY;CAIxB,QAAQ,UAAU;CAIlB,WAAW,UAAU;CACtB;AAED,MAAM,YAAYA,cAAY,WAAW;CACvC,MAAM,EACJ,OAAO,QACR;CACD,QAAQ,EACN,aAAa,MAAM,QAAQ,EAAE,EAC9B;CACD,cAAc;EACZ,WAAW,MAAM,QAAQ,EAAE;EAC3B,cAAc,MAAM,QAAQ,EAAE;EAC/B;CACD,UAAU,EACR,WAAW,GACZ;CACF,EAAE;AAWH,MAAa,kBAAkB,EAAE,YAAY,OAAO,kBAAkB;CACpE,MAAM,UAAU,WAAW;AAE3B,QACE,oCAAC,SAAI,WAAW,QAAQ,QACtB,oCAACC;EACC,OAAO;GAAE,YAAY;GAAe,SAAS;GAAG;EAChD,SAAS,EAAE,MAAM,QAAQ,aAAa;EACtC;EACY;EACZ,WAAW,oCAAC,qBAAiB;EAC7B,YAAY;IAEX,MAAM,KAAK,UACV,oCAACC;EAAK,SAAS,EAAE,MAAM,QAAQ,UAAU;EAAE,KAAK;IAC9C,oCAACC;EACC,WAAW,QAAQ;EACnB,mBAAmB;IAEnB,oCAAC,UAAK,OAAO,EAAE,UAAU,IAAI,IAAG,MAAa,CACnC,CACP,CACP,CACM,CACN;;;;;AC5IV,MAAa,yBAAyB,YAAY,mBAAmB;AACnE,QAAO,IAAI,SAAS,SAAS,WAAW;AACtC,MAAI,YAAY;GACd,MAAM,SAAS,IAAI,YAAY;AAE/B,UAAO,SAAS,SAAU,GAAG;IAC3B,MAAM,OAAO,IAAI,WAAW,EAAE,OAAO,OAAO;IAC5C,MAAM,WAAW,KAAK,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;IAEnD,MAAM,YAAY,SAAS,WAAW,gBAAgB,iBAAiB,QAAQ;IAC/E,MAAM,YAAY,SAAS,OAAO;IAGlC,MAAM,OAAO,KAAK,MAAM,cAAc,WAAW,EAC/C,QAAQ,GACT,CAAC;AACF,QAAI,KAAK,SAAS,GAAG;KACnB,MAAM,UAAU,KAAK;KACrB,MAAM,gBAAgB,KAAK;AAC3B,aAAQ;MAAW;MAAS,YAAY;MAAe,CAAC;UAGtD,QAAO,6BAA6B;;AAG1C,UAAO,UAAU,WAAY;AAC3B,WAAO,0BAA0B;;AAGnC,UAAO,kBAAkB,WAAW;QAEpC,QAAO,mBAAmB;GAE5B;;AAGJ,MAAa,wBAAwB,YAAY,mBAAmB;AAClE,QAAO,IAAI,SAAS,SAAS,WAAW;AACtC,MAAI,YAAY;GACd,MAAM,YAAY;GAClB,IAAI,SAAS;GACb,IAAI,kBAAkB;GAEtB,MAAM,SAAS,IAAI,YAAY;AAE/B,UAAO,SAAS,SAAU,GAAG;AAC3B,uBAAmB,EAAE,OAAO;IAE5B,MAAM,QAAQ,gBAAgB,MAAM,KAAK;AACzC,QAAI,MAAM,SAAS,GAAG;KACpB,MAAM,UAAU,MAAM,GAAG,QAAQ,OAAO,GAAG,CAAC,MAAM,gBAAgB,WAAW,MAAM;KACnF,MAAM,gBAAgB,MAAM,GAAG,QAAQ,OAAO,GAAG,CAAC,MAAM,gBAAgB,WAAW,MAAM;AACzF,aAAQ;MAAW;MAAS,YAAY;MAAe,CAAC;eAGpD,SAAS,WAAW,KACtB,gBAAe;;AAIrB,UAAO,UAAU,WAAY;AAC3B,WAAO,0BAA0B;;GAGnC,SAAS,gBAAgB;IAEvB,MAAM,OAAO,WAAW,MAAM,QAAQ,SAAS,UAAU;AACzD,WAAO,WAAW,KAAK;AACvB,cAAU;;AAEZ,kBAAe;QAEf,QAAO,mBAAmB;GAE5B;;AAGJ,MAAa,wBAAwB,YAAY,mBAAmB;AAClE,QAAO,IAAI,SAAS,SAAS,WAAW;AACtC,MAAI,YAAY;GACd,MAAM,SAAS,IAAI,YAAY;AAE/B,UAAO,SAAS,SAAU,GAAG;AAC3B,QAAI;KACF,MAAM,WAAW,KAAK,MAAM,EAAE,OAAO,OAAO;KAC5C,MAAM,aAAa,gBAAgB,WAAW,eAAe,UAAU,gBAAgB,SAAS,GAAG;AAEnG,SAAI,MAAM,QAAQ,WAAW,IAAI,WAAW,SAAS,GAAG;MACtD,MAAM,OAAO,OAAO,KAAK,WAAW,GAAG;AACvC,cAAQ;OAAE,SAAS;OAAM,YAAY,WAAW;OAAI,CAAC;WAErD,QAAO,uDAAuD;aAEzD,KAAK;AACZ,YAAO,4BAA4B,IAAI;;;AAG3C,UAAO,UAAU,WAAY;AAC3B,WAAO,0BAA0B;;AAGnC,UAAO,WAAW,WAAW;QAE7B,QAAO,mBAAmB;GAE5B;;AAGJ,MAAM,kBAAkB,KAAK,SAAS;AAClC,QAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,KAAK,QAAQ,OAAO,IAAI,MAAM,IAAI;;;;;ACxGrE,MAAa,wBAAwB,UAAU;CAC7C,MAAM,EAAE,mBAAmB,WAAW;CACtC,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,MAAM;CAE/D,MAAM,mBAAmB,cAAc;AACrC,MAAI,mBAAmB;GACrB,IAAI,eAAe,mBAAmB;AACtC,OAAI,OAAO,mBAAmB,eAAe,SAC3C,gBAAe,KAAK,MAAM,mBAAmB,WAAW;AAE1D,OACE,oBAAoB,gBACpB,cAAc,mBAAmB,MAEjC,qBAAoB,KAAK;OAEzB,qBAAoB,MAAM;AAE5B,UAAO,OAAO,QAAQ,aAAa,CAAC,KAAK,CAAC,KAAK,YAAY;IACzD;IACA;IACD,EAAE;;IAEJ,CAAC,kBAAkB,CAAC;CAEvB,MAAM,sBAAsB,cAAc;EACxC,IAAI,eAAe,mBAAmB;AACtC,MAAI,OAAO,mBAAmB,YAAY,SACxC,gBAAe,KAAK,MAAM,mBAAmB,QAAQ;AAEvD,MAAI,kBACF,QAAO,OAAO,QAAQ,aAAa;IAEpC,CAAC,kBAAkB,CAAC;AAEvB,QACE,uBACE,oCAAC;EAAY;EAAU,OAAM;EAAwB,UAAU;IAC5D,kBAAkB,KAAK,aACtB,oCAAC;EACC,OAAO,UAAU,IACd,QAAQ,mBAAmB,QAAQ,CACnC,QAAQ,MAAM,SAAU,MAAM;AAC7B,UAAO,KAAK,aAAa;IACzB;EACJ,OACE,UAAU,UAAU,QAChB,UACA,UAAU,UAAU,OACpB,SACA,UAAU;GAEhB,CACF,EAEF,0DACE,oCAAC,SACC,OAAO;EACL,SAAS;EACT,eAAe;EACf,gBAAgB;EAChB,YAAY;EACb,IAED,oCAAC,cAAW,SAAQ,aACjB,mBAAmB,mBAAmB,eAC5B,EACb,oCAAC,cAAW,SAAQ,aAAU,SAAmB,CAC7C,EACN,oCAAC,WAAQ,OAAO;EAAE,WAAW;EAAG,cAAc;EAAK,GAAI,EACtD,qBAAqB,KAAK,UACzB,oCAAC,SAAI,OAAO,EAAE,QAAQ,IAAI,IACxB,oCAAC,SAAI,OAAO;EAAE,SAAS;EAAQ,eAAe;EAAO,KAAK;EAAI,IAC5D,oCAAC,cAAW,OAAO;EAAE,WAAW;EAAI,OAAO;EAAO,IAC/C,mBACG,WAAW,MAAM,IAAI,cACrB,MAAM,IAAI,gBACH,EACb,oCAAC;EACC,OAAO;GAAE,WAAW;GAAI,OAAO;GAAO;EACtC,WAAW;GACX,EACF,oCAAC,cACC,OAAO;EAAE,WAAW;EAAI,OAAO;EAAO,WAAW;EAAS,IAEzD,MAAM,IAAI,SAAS,QAAQ,YAAY,MAAM,CAAC,MAAM,CAC1C,CACT,EACN,oCAAC,WAAQ,OAAO,EAAE,QAAQ,WAAW,GAAI,CACrC,CACN,CACD,CACS;;;;;ACrEpB,MAAM,2BAA2B,UAAU;CACzC,MAAM,EAAE,iBAAiB,gCAAgC,yBAAyB;CAClF,MAAM,OAAO,SAAS;CACtB,MAAM,CAAC,kBAAkB,uBAAuB,UAAU;CAC1D,MAAM,CAAC,eAAe,oBAAoB,UAAU;CACpD,MAAM,CAAC,gBAAgB,qBAAqB,UAAU;CACtD,MAAM,CAAC,kBAAkB,uBAAuB,UAAU;CAC1D,MAAM,CAAC,YAAY,iBAAiB,UAAU;CAC9C,MAAM,CAAC,yBAAyB,8BAA8B,SAAS,EAAE,CAAC;CAC1E,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAC/C,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,MAAM;CAC/D,MAAM,CAAC,WAAW,gBAAgB,SAAS,GAAG;CAC9C,MAAM,EAAE,qBAAqB,0BAC3B,wBAAwB;CAE1B,MAAM,2BAA2B,YAC/B,OAAO,SACLC,YACE,cAAc,iBACd,wBACA,EACE,QAAQ,QACT,EACD,EAAE,MAAM,CACT,EACH,EAAE,CACH;CACD,MAAM,EAAE,MAAM,oBAAoB,wBAChC,iBACA,KACD;CAED,MAAM,CAAC,EAAE,MAAM,wBAAwB,2BAA2B,YAChE,cAAc,iBACd,qBACA,EAAE,EACF,MACD;CAED,MAAM,sBAAsB,YAAY,YAAY;AAClD,MAAI,iBAAiB,uBAAuB,eAAe,MAAM,IAAI;GACnE,MAAM,aAAa,MAAM,kBACvB,EACE,MAAM;IACJ,WAAW;IACX,UAAU;IACV,gBAAgB,EAAE;IACnB,EACF,EACD,iBAAiB,uBAAuB,YACzC;AACD,OAAI,YAAY,MAAM,SAAS,SAAS,EACtC,kBAAiB,YAAY,MAAM,SAAS;;IAG/C,CAAC,iBAAiB,KAAK,CAAC;CAE3B,MAAM,0BAA0B,cAAc;AAC5C,SAAO;IACN,CAAC,cAAc,CAAC;CAEnB,MAAM,+BAA+B,WAAW;AAC9C,SAAO,QAAQ,KAAK,QAAQ,YAAY,MAAM,CAAC,MAAM;;CAGvD,MAAM,sBAAsB,WAAW;AACrC,SAAO,QAAQ;;CAGjB,MAAM,mBAAmB,OAAO,eAAe;EAC7C,IAAI;AACJ,MACE,iBAAiB,cAAc,UAC/B,iBAAiB,cAAc,OAE/B,UAAS,MAAM,qBAAqB,YAAY,WAAW;WAClD,iBAAiB,cAAc,QACxC,UAAS,MAAM,sBAAsB,YAAY,WAAW;WACnD,iBAAiB,cAAc,QACxC,UAAS,MAAM,qBAAqB,YAAY,WAAW;AAE7D,sBAAoB,QAAQ,QAAQ;;AAGtC,iBAAgB;AACd,uBAAqB;IACpB,CAAC,oBAAoB,CAAC;CAEzB,MAAM,8BAA8B,YAClC,OAAO,WAAW;AAUhB,OATiB,MAAM,yBAAyB;GAC9C,MAAM,OAAO;GACb,yBAAyB,iBAAiB,eAAe,KAAK;GAC9D,gBAAgB,iBAAiB;GACjC,SAAS,KAAK,UAAU,yBAAyB,QAAQ;GACzD,YAAY,KAAK,UAAU,yBAAyB,WAAW;GAChE,CAAC,CAAC,OAAO,QAAQ;AAChB,uBAAoB,IAAI;IACxB,GACY,WAAW,KAAK;AAC5B,yBAAsB,kBAAkB;AACxC,oBAAiB;AACjB,kCAA+B,MAAM;;IAGzC;EACE;EACA,gBAAgB;EAChB,kBAAkB;EAClB,yBAAyB;EACzB,yBAAyB;EACzB;EACA;EACA;EACA;EACD,CACF;CAED,MAAM,4BAA4B,WAAW;EAC3C,IAAI,QAAQ;AACZ,kBAAgB,iBAAiB,SAAS,WAAW;AACnD,OACE,CAAC,OAAO,SAAS,SAAS,IAAI,IAC9B,CAAC,OAAO,gBACR,CAAC,OAAO,SAER;QACE,CAAC,OAAO,QAAQ,OAAO,CAAC,MACrB,QAAQ,IAAI,GAAG,sBAAsB,OAAO,kBAC9C,EAED;SAAG,qBACD,SAAQ;;;IAId;AACF,MAAI,CAAC,OAAO;AACV,gBAAa,8CAA8C;AAC3D;;EAEF,MAAM,mBAAmB,OAAO,QAAQ,OAAO,CAC5C,QAAQ,CAAC,KAAK,WAAW,UAAU,KAAK,CACxC,QAAQ,KAAK,CAAC,KAAK,WAAW;AAC7B,OAAI,OAAO;AACX,UAAO;KACN,EAAE,CAAC;EACR,MAAM,qBAAqB,OAAO,KAAK,iBAAiB,CAAC,KAAK,QAC5D,SAAS,IAAI,MAAM,kBAAkB,CAAC,IAAI,GAAG,CAC9C;EACD,MAAM,gBAAgB,OAAO,OAAO,iBAAiB,CAAC,KACnD,kBAAkB,UAAU;AAC3B,UAAO;IACL,UAAU,iBAAiB;IAC3B,iBAAiB,CAAC,mBACd,iBAAiB,mBAAmB,UACpC;IACJ,aAAa,CAAC,mBAAmB,KAAK,mBAAmB;IAC1D;IAEJ;AACD,8BAA4B,SAAS;AACnC,UAAO;IAAE,GAAG;IAAM,SAAS;IAAe;IAC1C;AACF,iBAAe,SAAS,OAAO,EAAE;;CAGnC,MAAM,8BAA8B,WAAW;AAC7C,8BAA4B,SAAS;GACnC,IAAI,aAAa,EAAE;AACnB,UAAO,KAAK,OAAO,CAAC,SACjB,YACE,WAAW,WACV,WAAW,OAAO,WACd,OAAO,UAAU,QACjB,OAAO,SAChB;AACD,UAAO;IAAE,GAAG;IAAkB;IAAY;IAC1C;AACF,MAAI,oBAAoB,UAAU,QAAQ,eAAe,UAAU,MACjE,qBAAoB,KAAK;AAE3B,mBAAiB,OAAO;AACxB,iBAAe,SAAS,OAAO,EAAE;;CAGnC,MAAM,0BAA0B,WAAW;AACzC,MACE,CAAC,OAAO,SAAS,SAAS,IAAI,IAC9B,CAAC,OAAO,gBACR,CAAC,OAAO,QAER,QAAO,GAAG,OAAO,KAAK,QAAQ,YAAY,MAAM,CAAC,MAAM,CAAC;AAE1D,SAAO,GAAG,OAAO,KAAK,KAAK,OAAO;;CAGpC,MAAM,yBAAyB,YAAY;AACzC,gBAAc,QAAQ,GAAG;;CAG3B,MAAM,8BAA8B,cAAc;AAChD,MAAI,iBACF,QAAO,KAAK,MAAM,kBAAkB,WAAW;IAEhD,CAAC,iBAAiB,CAAC;AAEtB,QACE,0DACE,oCAAC,eAAY,mBACX,oCAAC,SAAI,OAAO,EAAE,cAAc,IAAI,IAC9B,oCAAC;EACa;EACZ,OAAO;GAAC;GAAQ;GAAU;GAAkB;GAAS;EACrD,aAAY;GACZ,CACE,EACL,eAAe,KACd,0DACE,oCAAC;EACC,YAAY;EACZ,IAAI;EACJ,MAAM;EACN,OAAM;EACN,WAAW,QAAQ,oBAAoB,IAAI;EAC3C,SAAS;EACT,MAAK;EACL,wBAAwB;EACxB,OAAO;EACP;GACA,EACD,oBACC,oCAAC,SAAI,OAAO,EAAE,WAAW,GAAG,IAC1B,oCAAC;EACC,kBAAkB;EAClB,QAAQ;GACN,YAAY,CAAC,OAAO;GACpB,cAAc,CAAC,OAAO;GACtB,qEACE,CAAC,QAAQ;GACX,oBAAoB,CAAC,QAAQ;GAC9B;GACD,CACE,EAER,oCAAC,QAAK,UAAU,8BACb,6BAA6B,KAAK,aACjC,UAAU,UACR,oCAAC;EACC,WAAW;EACX,YAAY;EACZ,IAAI,SAAS;EACb,MAAM,SAAS;EACf,OAAO,SAAS;EAChB,SAAS,SAAS;EAClB,MAAK;EACL,wBAAwB;EACxB,UAAU,UAAU;GACpB,GAEF,oCAAC;EACC,WAAW;EACX,YAAY;EACZ,IAAI,SAAS;EACb,MAAM,SAAS;EACf,OAAO,SAAS;EAChB,MAAK;EACL,wBAAwB;EACxB,UAAU,UAAU;GACpB,CAEL,EACD,oCAAC,eACC,OAAO;EACL,SAAS;EACT,OAAO;EACP,aAAa;EACd,IAED,oCAAC;EACC,SAAQ;EACR,OAAM;EACN,iBAAiB;EACjB,UAAU,CAAC;IACZ,OAEc,CACH,CACT,CACN,EAEJ,eAAe,KACd,0DACE,oCAAC;EACC,YAAY;EACZ,IAAI;EACJ,MAAM;EACN,OAAM;EACN,WAAW,QAAQ,kBAAkB,IAAI;EACzC,SAAS;EACT,MAAK;EACL,wBAAwB;EACxB,OAAO;EACP;GACA,EACF,oCAAC,SACC,OAAO;EAAE,OAAO;EAAS,SAAS;EAAQ,KAAK;EAAG,WAAW;EAAG,IAEhE,oCAAC;EACC,SAAQ;EACR,eAAe,eAAe,SAAS,OAAO,EAAE;EAChD,UAAU,eAAe;IAC1B,OAEc,EACf,oCAAC;EACC,SAAQ;EACR,eAAe,eAAe,SAAS,OAAO,EAAE;EAChD,OAAM;EACN,UAAU,CAAC;IACZ,OAEc,CACX,CACL,EAEJ,eAAe,KACd,0DACE,oCAAC,SACC,OAAO;EACL,SAAS;EACT,eAAe;EACf,gBAAgB;EAChB,YAAY;EACb,IAED,oCAAC,cAAW,SAAQ,aACjB,mBAAmB,mBAAmB,eAC5B,EACb,oCAAC,cAAW,SAAQ,aAAU,aAAuB,CACjD,EACN,oCAACC,aAAQ,OAAO,EAAE,QAAQ,WAAW,GAAI,EACzC,oCAAC;EACC,UAAU;EACV,OAAO,EAAE,WAAW,KAAK;IAExB,kBAAkB,KAAK,OAAO,UAC7B,oCAAC,SAAI,OAAO,EAAE,QAAQ,IAAI,IACxB,oCAAC,SACC,OAAO;EAAE,SAAS;EAAQ,eAAe;EAAO,KAAK;EAAI,IAEzD,oCAAC,cAAW,OAAO;EAAE,WAAW;EAAI,OAAO;EAAO,IAC/C,mBAAmB,WAAW,QAAQ,MAC5B,EACb,oCAAC;EACC,OAAO;GAAE,WAAW;GAAI,OAAO;GAAO;EACtC,WAAW;GACX,EACF,oCAAC;EACC,OAAO,EAAE,QAAQ,IAAI;EACrB,WAAW;EACX,YAAY;EACZ,IAAI,kBAAkB;EACtB,MAAM,kBAAkB;EACxB,SAAS,gBAAgB;EACzB,MAAK;EACL,wBAAwB;GACxB,CACE,EACN,oCAACA,aAAQ,OAAO,EAAE,QAAQ,WAAW,GAAI,CACrC,CACN,EACF,oCAAC,SAAI,OAAO;EAAE,YAAY;EAAI,WAAW;EAAS,OAAO;EAAO,IAC7D,UACG,EACN,oCAAC,eACC,OAAO;EACL,SAAS;EACT,OAAO;EACP,YAAY;EACZ,aAAa;EACd,IAED,oCAAC;EACC,SAAQ;EACR,eAAe,eAAe,SAAS,OAAO,EAAE;EAChD,UAAU,eAAe;IAC1B,OAEc,EACf,oCAAC;EACC,SAAQ;EACR,OAAM;EACN,iBAAiB;IAClB,OAEc,CACH,CACT,CACN,EAEJ,eAAe,KACd,oCAAC,QAAK,UAAU,+BACd,oCAAC;EACC,WAAW;EACX,IAAI;EACJ,MAAM;EACN,OAAM;EACN,MAAK;GACL,EACF,oCAAC,eACC,OAAO;EACL,SAAS;EACT,OAAO;EACP,aAAa;EACd,IAED,oCAAC;EACC,SAAQ;EACR,eAAe,eAAe,SAAS,OAAO,EAAE;EAChD,UAAU,eAAe;IAC1B,OAEc,EACf,oCAAC;EACC,SAAQ;EACR,OAAM;EACN,iBAAiB;IAEhB,iBACY,CACH,CACT,CAEG,EACb,yBAAyB,WAAU,oCAAC,SAAI,OAAO,EAAE,WAAW,IAAI,IAC/D,oCAAC;EACC,mBAAmB;GACjB,SAAS,yBAAyB;GAClC,YAAY,yBAAyB;GACtC;EACD,QAAQ,gBAAgB,KAAK,QAAQ,YAAY,MAAM,CAAC,MAAM;GAC9D,CACE,CACL;;AAIP,sCAAe;;;;AC/cf,MAAa,6BAA6B,UAAU;CAClD,MAAM,EAAC,iBAAiB,cAAc,uBAAuB,SAAQ;CACrE,MAAM,OAAO,SAAS;CACtB,MAAM,CAAC,qBAAqB,0BAA0B,UAAU;CAChE,MAAM,CAAC,sBAAsB,2BAA2B,UAAU;CAClE,MAAM,CAAC,6BAA6B,kCAClC,SAAS,MAAM;CACjB,MAAM,CAAC,YAAY,iBAAiB,UAAU;CAC9C,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;CACjD,MAAM,EAAE,qBAAqB,0BAC3B,wBAAwB;CAE1B,MAAM,EAAE,MAAM,+BAA+B,wBAC3C,wBACA,KACD;CAED,MAAM,4BAA4B,YAChC,OAAO,SACLC,YACE,cAAc,iBACd,GAAG,qBAAqB,wBAAwB,qBAChD,EACE,QAAQ,QACT,EACD,EAAE,MAAM,CACT,EACH,CAAC,oBAAoB,CACtB;CAED,MAAM,8BAA8B,YAAY,YAAY;AAC1D,MAAI,4BAA4B,uBAAuB,aAAa;GAClE,MAAM,MAAM,MAAM,kBAChB,EACE,MAAM;IACJ,WAAW;IACX,UAAU;IACV,gBAAgB,EAAE;IACnB,EACF,EACD,4BAA4B,uBAAuB,YACpD;AACD,OAAI,KAAK,MAAM,SAAS,SAAS,EAC/B,yBAAwB,KAAK,MAAM,SAAS;;IAG/C,CAAC,4BAA4B,uBAAuB,YAAY,CAAC;AAEpE,iBAAgB;AACd,+BAA6B;IAC5B,CAAC,4BAA4B,CAAC;CAEjC,MAAM,2BAA2B,YAAY,YAAY;AACvD,eAAa,KAAK;EAClB,MAAM,OAAO;EACb,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;EAClD,MAAM,WAAW,IAAI,UAAU;AAC/B,WAAS,OAAO,QAAQ,MAAM,KAAK,KAAK;AACxC,WAAS,OAAO,YAAY,MAAM,gBAAgB;AAClD,WAAS,OAAO,QAAQ,oBAAoB,KAAK;AACjD,WAAS,OAAO,2BAA2B,oBAAoB,wBAAwB;AACvF,WAAS,OAAO,kBAAkB,oBAAoB,eAAe;AACrE,WAAS,OAAO,WAAW,oBAAoB,QAAQ;AACvD,WAAS,OAAO,cAAc,oBAAoB,WAAW;AAC7D,WAAS,OAAO,MAAM,oBAAoB,GAAG;AAM7C,OALiB,MAAM,0BAA0B,SAAS,CAAC,OAAO,QAAQ;AACxE,gBAAa,MAAM;AACnB,uBAAoB,IAAI;AACxB,iBAAc;IACd,GACY,WAAW,KAAK;AAC5B,yBAAsB,gBAAgB;AACtC,gBAAa,MAAM;AACnB,sBAAmB,iBAAiB;;IAGrC;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,6BAA6B,WAAW;AAC5C,SAAO,GAAG,OAAO,KAAK,IAAI,QAAQ,uCAAuC,UAAU;;CAGrF,MAAM,yBAAyB,YAAY;AACzC,gBAAc,QAAQ,GAAG;;AAG3B,QACE,0DACE,oCAAC,eAAY,mBACX,oCAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,IAC7B,oCAAC;EACC,YAAY;EACZ,IAAI;EACJ,MAAM;EACN,OAAM;EACN,WAAW,QAAQ,uBAAuB,IAAI;EAC9C,SAAS;EACT,MAAK;EACL,wBAAwB;EACxB,OAAO;EACP;EACA,UAAU,WACR,QAAQ,mCAAmC;GAE7C,CACE,EACL,uBACC,oCAAC;EACC,kBAAkB;EAClB,QAAQ;GACN,YAAY,CAAC,OAAO;GACpB,cAAc,CAAC,OAAO;GACtB,qEACE,CAAC,QAAQ;GACX,oBAAoB,CAAC,QAAQ;GAC9B;GACD,EAEJ,oCAAC,SACC,OAAO;EACL,SAAS;EACT,eAAe;EACf,KAAK;EACL,OAAO;EACP,WAAW;EACZ,IAED,oCAAC;EACC,eAAe,+BAA+B,KAAK;EACnD,SAAQ;IACT,qBAEc,EACf,oCAAC;EACC,SAAQ;EACR,OAAM;EACN,SAAS;EACT,UAAU;EACV,UAAU,CAAC;IACZ,cAEc,CACX,EACN,oCAAC;EACC,OAAM;EACN,MAAM;EACN,eAAe,+BAA+B,MAAM;EACpD,OAAO;IAEP,oCAACC;EACC,iBAAiB;EACe;EACV;GACtB,CACQ,CACA,EACd,oCAAC,SAAI,OAAO,EAAE,WAAW,IAAI,IAC3B,oCAAC;EAAqB,mBAAmB;EAAqB,QAAQ,qBAAqB,mCAAmC,cAAc,QAAQ,YAAY,MAAM,CAAC,MAAM;GAAG,CAC5K,CACL"}
@@ -51,6 +51,6 @@ import "./AggregateChip-EN9-abal.js";
51
51
  import "./UtilityBarInport-BZbPE650.js";
52
52
  import "./UtilitySideBar-otYqGPhu.js";
53
53
  import "./BaseTreeMenu-DHEMztjA.js";
54
- import { MenuPage_default } from "./MenuPage-DJGGAhH5.js";
54
+ import { MenuPage_default } from "./MenuPage-ubGSLrRu.js";
55
55
 
56
56
  export { MenuPage_default as default };
@@ -68,7 +68,7 @@ const MenuPage = (props) => {
68
68
  const user = useUser();
69
69
  const { t } = useTranslation();
70
70
  const setLocationState = useSetLocationState();
71
- const { innerMenuOverride, mainContent } = props;
71
+ const { innerMenuOverride, mainContent, menuTitle } = props;
72
72
  const [menuItemsList, setMenuItemsList] = useState([]);
73
73
  const [selectedNode, setSelectedNode] = useState(null);
74
74
  const [sidebarExpanded, setSidebarExpanded] = useState(true);
@@ -176,7 +176,7 @@ const MenuPage = (props) => {
176
176
  when: hasUnsavedChanges,
177
177
  message: "You have unsaved changes. Are you sure you want to leave this page?"
178
178
  }), /* @__PURE__ */ React.createElement("div", { className: classes.root }, /* @__PURE__ */ React.createElement("div", { className: classes.sidebar }, /* @__PURE__ */ React.createElement(UtilitySideBar, {
179
- title: innerMenu?.name,
179
+ title: innerMenu?.name || menuTitle,
180
180
  isUsingChildren: true,
181
181
  resizable: true,
182
182
  removePadding: true,
@@ -224,4 +224,4 @@ var MenuPage_default = MenuPage;
224
224
 
225
225
  //#endregion
226
226
  export { MenuPage_default };
227
- //# sourceMappingURL=MenuPage-DJGGAhH5.js.map
227
+ //# sourceMappingURL=MenuPage-ubGSLrRu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MenuPage-ubGSLrRu.js","names":[],"sources":["../src/menuPage/MenuPage.jsx"],"sourcesContent":["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 // Allow callers to provide an innerMenu directly (CustomMenuPage wrapper)\n const { innerMenuOverride, mainContent, menuTitle } = props;\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: fetchedInnerMenu, loading: menuLoading }] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `menus/${innerMenuId}`,\n {},\n !innerMenuId,\n false\n );\n\n const innerMenu = innerMenuOverride ?? fetchedInnerMenu;\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 || menuTitle}\n isUsingChildren={true}\n resizable={true}\n removePadding={true}\n removeTopLayoutUnit={true}\n onUtilitySidebarToggleExpandClick={handleSidebarExpandClick}\n collapsedWidth={64}\n >\n <div className={classes.menuContent} key={innerMenuId}>\n {menuItemsList?.length > 0 &&\n !menuLoading &&\n menuItemsList.map((menuItems, index) => (\n <div key={menuItems.id} className={classes.nodeContainer}>\n <BaseTreeMenu\n menuItems={menuItems}\n onSelectNode={handleSelectedNode}\n onDropNode={handleDropNode}\n menuIndex={index}\n selectedNodeId={selectedNode?.id}\n selectedNodeParentId={selectedNode?.parentId}\n sidebarExpanded={sidebarExpanded}\n treeViewMode={TreeViewModeEnums.Classic}\n />\n </div>\n ))}\n {menuLoading && (\n <div className={classes.loader}>\n <NodeLoader loading={menuLoading} />\n </div>\n )}\n </div>\n </UtilitySideBar>\n </div>\n <div className={classes.content}>\n {mainContent ? (\n typeof mainContent === 'function'\n ? mainContent({ selectedNode, menuItemsList })\n : mainContent\n ) : (\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 )}\n </div>\n </div>\n </DndProvider>\n );\n};\n\nexport default MenuPage;\n"],"mappings":"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"}
@@ -49,7 +49,7 @@ const PrivateRoute = ({ ...otherProps }) => {
49
49
  //#endregion
50
50
  //#region src/routes/UdpRoutes.jsx
51
51
  const VirtualBrowser = lazy(() => import("./VirtualBrowser-B66Iyn4h.js"));
52
- const MenuPage = lazy(() => import("./MenuPage-D4tvTXC3.js"));
52
+ const MenuPage = lazy(() => import("./MenuPage-DVVjB9dx.js"));
53
53
  const UdpPublicForm = lazy(() => import("./UdpPublicForm-DnPkG5dr.js"));
54
54
  const WorkflowContainer = lazy(() => import("./WorkflowContainer-D0Od__D5.js"));
55
55
  const PasswordResetRedirect = lazy(() => import("./PasswordResetRedirect-BMDMHdhE.js"));
@@ -107,4 +107,4 @@ const UdpRoutes = (props) => {
107
107
 
108
108
  //#endregion
109
109
  export { PrivateRoute, UdpRoutes };
110
- //# sourceMappingURL=UdpRoutes-Bjfl5no0.js.map
110
+ //# sourceMappingURL=UdpRoutes-KQam73g2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UdpRoutes-Bjfl5no0.js","names":["Switch","props"],"sources":["../src/routes/components/PageForbiddenRoute.jsx","../src/routes/PrivateRoute.jsx","../src/routes/UdpRoutes.jsx"],"sourcesContent":["import React from 'react';\nimport { makeStyles } from '@material-ui/core';\nimport { PageStatus } from './PageStatus';\nimport { useTranslation } from 'react-i18next';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n marginTop: theme.spacing(4)\n }\n}));\n\nexport const PageForbiddenRoute = (props) => {\n const { title, statusCode, subheader, message, showButton } = props;\n const classes = useStyles();\n const { t } = useTranslation();\n\n return (\n <div className={classes.root}>\n <PageStatus\n title={title ?? t('Page Forbidden')}\n statusCode={statusCode ?? '403'}\n subheader={\n subheader ?? t('Sorry, you do not have permission to view this page.')\n }\n message={message ?? t('Please contact an administrator to get access.')}\n to='/'\n buttonLabel={t('Back to Home Page')}\n showButton={showButton}\n />\n </div>\n );\n};\n","import React, { useMemo } from 'react';\nimport { Route, Redirect } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\nimport { useIsUnityAuthenticated } from '../utilities/auth/useIsUnityAuthenticated';\nimport { useUser } from '../utilities/auth/useUser';\nimport { PageForbiddenRoute } from './components/PageForbiddenRoute';\n\nexport const PrivateRoute = ({ ...otherProps }) => {\n const isAuthenticated = useIsUnityAuthenticated();\n const user = useUser();\n const { t } = useTranslation();\n \n const userHasAccessToTenant = useMemo(() => {\n if (user?.tenantIds?.includes(user.currentTenantId)) {\n return true;\n }\n return false;\n }, [user]);\n\n if (!userHasAccessToTenant && isAuthenticated && user?.statusCode === 200) {\n return (\n <Route\n path='*'\n render={(props) => (\n <PageForbiddenRoute\n message={t('You do not have access to this tenant. Please select a different Tenant.')}\n showButton={false}\n />\n )}\n />\n );\n }\n\n if (isAuthenticated && user?.statusCode === 200) {\n return <Route {...otherProps} />;\n }\n\n return null;\n};\n","import React, { Suspense, lazy } from 'react';\nimport { Route, Switch } from 'react-router-dom';\nimport { PrivateRoute } from './PrivateRoute';\nimport { UdpPageEnums } from '../enums/pageEnums';\nimport { ConfigService } from 'udp-react-stencil-component-library';\nimport { PageLoading } from '../UI/feedback/PageLoading';\n\n// Lazy load route components\nconst VirtualBrowser = lazy(() =>\n import('../maintenanceEngine/virtualBrowser/VirtualBrowser')\n);\nconst MenuPage = lazy(() => import('../menuPage/MenuPage'));\nconst UdpPublicForm = lazy(() => import('../udp/pages/UdpPublicForm'));\nconst WorkflowContainer = lazy(() => import('../workflow/WorkflowContainer'));\nconst PasswordResetRedirect = lazy(() =>\n import('./components/PasswordResetRedirect')\n);\nconst MyExportsPage = lazy(() => import('../udp/export/MyExportsPage'));\nconst PageNotFoundRoute = lazy(() => import('./components/PageNotFoundRoute'));\nconst UdpMaintenanceConfigPage = lazy(() =>\n import('../udp/pages/UdpMaintenanceConfigPage')\n);\nconst UdpMaintenanceEnginePage = lazy(() =>\n import('../udp/pages/UdpMaintenanceEnginePage')\n);\n\nexport const UdpRoutes = (props) => {\n const { ...other } = props;\n return (\n <Suspense fallback={<PageLoading />}>\n <Switch>\n <PrivateRoute\n path='/virtual/:id'\n render={(props) => <VirtualBrowser {...props} {...other} />}\n />\n <PrivateRoute\n path='/menupage/:id'\n render={(props) => <MenuPage {...props} {...other} />}\n />\n\n <Route\n path={`/page/${UdpPageEnums.Udp_Public_Forms_Page}`}\n render={(props) => <UdpPublicForm {...props} {...other} />}\n />\n <Route\n path={`/passwordresetsuccess`}\n render={(props) => <PasswordResetRedirect props={props} />}\n />\n <PrivateRoute\n path='/workflowtask/:id'\n render={(props) => <WorkflowContainer {...props} {...other} />}\n />\n <PrivateRoute\n path='/myexports'\n render={(props) => (\n <MyExportsPage\n productId={ConfigService.config.UNITY_PRODUCT_ID}\n {...props}\n {...other}\n />\n )}\n />\n <PrivateRoute\n path='/crudbrowser'\n render={(props) => <UdpMaintenanceEnginePage {...props} />}\n />\n <PrivateRoute\n path='/tablebrowser'\n render={(props) => <UdpMaintenanceConfigPage {...props} />}\n />\n <PrivateRoute path='*' component={PageNotFoundRoute} />\n </Switch>\n </Suspense>\n );\n};\n"],"mappings":";;;;;;;;;;;;AAKA,MAAM,YAAY,YAAY,WAAW,EACvC,MAAM,EACJ,WAAW,MAAM,QAAQ,EAAE,EAC5B,EACF,EAAE;AAEH,MAAa,sBAAsB,UAAU;CAC3C,MAAM,EAAE,OAAO,YAAY,WAAW,SAAS,eAAe;CAC9D,MAAM,UAAU,WAAW;CAC3B,MAAM,EAAE,MAAM,gBAAgB;AAE9B,QACE,oCAAC,SAAI,WAAW,QAAQ,QACtB,oCAAC;EACC,OAAO,SAAS,EAAE,iBAAiB;EACnC,YAAY,cAAc;EAC1B,WACE,aAAa,EAAE,uDAAuD;EAExE,SAAS,WAAW,EAAE,iDAAiD;EACvE,IAAG;EACH,aAAa,EAAE,oBAAoB;EACvB;GACZ,CACE;;;;;ACtBV,MAAa,gBAAgB,EAAE,GAAG,iBAAiB;CACjD,MAAM,kBAAkB,yBAAyB;CACjD,MAAM,OAAO,SAAS;CACtB,MAAM,EAAE,MAAM,gBAAgB;AAS9B,KAAI,CAP0B,cAAc;AAC1C,MAAI,MAAM,WAAW,SAAS,KAAK,gBAAgB,CACjD,QAAO;AAET,SAAO;IACN,CAAC,KAAK,CAAC,IAEoB,mBAAmB,MAAM,eAAe,IACpE,QACE,oCAAC;EACC,MAAK;EACL,SAAS,UACP,oCAAC;GACC,SAAS,EAAE,2EAA2E;GACtF,YAAY;IACZ;GAEJ;AAIN,KAAI,mBAAmB,MAAM,eAAe,IAC1C,QAAO,oCAAC,OAAU,WAAc;AAGlC,QAAO;;;;;AC7BT,MAAM,iBAAiB,WACrB,OAAO,gCACR;AACD,MAAM,WAAW,WAAW,OAAO,0BAAwB;AAC3D,MAAM,gBAAgB,WAAW,OAAO,+BAA8B;AACtE,MAAM,oBAAoB,WAAW,OAAO,mCAAiC;AAC7E,MAAM,wBAAwB,WAC5B,OAAO,uCACR;AACD,MAAM,gBAAgB,WAAW,OAAO,+BAA+B;AACvE,MAAM,oBAAoB,WAAW,OAAO,mCAAkC;AAC9E,MAAM,2BAA2B,WAC/B,OAAO,0CACR;AACD,MAAM,2BAA2B,WAC/B,OAAO,0CACR;AAED,MAAa,aAAa,UAAU;CAClC,MAAM,EAAE,GAAG,UAAU;AACrB,QACE,oCAAC,YAAS,UAAU,oCAAC,kBAAc,IACjC,oCAACA,gBACC,oCAAC;EACC,MAAK;EACL,SAAS,YAAU,oCAAC;GAAe,GAAIC;GAAO,GAAI;IAAS;GAC3D,EACF,oCAAC;EACC,MAAK;EACL,SAAS,YAAU,oCAAC;GAAS,GAAIA;GAAO,GAAI;IAAS;GACrD,EAEF,oCAAC;EACC,MAAM,SAAS,aAAa;EAC5B,SAAS,YAAU,oCAAC;GAAc,GAAIA;GAAO,GAAI;IAAS;GAC1D,EACF,oCAAC;EACC,MAAM;EACN,SAAS,YAAU,oCAAC,yBAAsB,OAAOA,UAAS;GAC1D,EACF,oCAAC;EACC,MAAK;EACL,SAAS,YAAU,oCAAC;GAAkB,GAAIA;GAAO,GAAI;IAAS;GAC9D,EACF,oCAAC;EACC,MAAK;EACL,SAAS,YACP,oCAAC;GACC,WAAW,cAAc,OAAO;GAChC,GAAIA;GACJ,GAAI;IACJ;GAEJ,EACF,oCAAC;EACC,MAAK;EACL,SAAS,YAAU,oCAAC,0BAA6BA,QAAS;GAC1D,EACF,oCAAC;EACC,MAAK;EACL,SAAS,YAAU,oCAAC,0BAA6BA,QAAS;GAC1D,EACF,oCAAC;EAAa,MAAK;EAAI,WAAW;GAAqB,CAChD,CACA"}
1
+ {"version":3,"file":"UdpRoutes-KQam73g2.js","names":["Switch","props"],"sources":["../src/routes/components/PageForbiddenRoute.jsx","../src/routes/PrivateRoute.jsx","../src/routes/UdpRoutes.jsx"],"sourcesContent":["import React from 'react';\nimport { makeStyles } from '@material-ui/core';\nimport { PageStatus } from './PageStatus';\nimport { useTranslation } from 'react-i18next';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n marginTop: theme.spacing(4)\n }\n}));\n\nexport const PageForbiddenRoute = (props) => {\n const { title, statusCode, subheader, message, showButton } = props;\n const classes = useStyles();\n const { t } = useTranslation();\n\n return (\n <div className={classes.root}>\n <PageStatus\n title={title ?? t('Page Forbidden')}\n statusCode={statusCode ?? '403'}\n subheader={\n subheader ?? t('Sorry, you do not have permission to view this page.')\n }\n message={message ?? t('Please contact an administrator to get access.')}\n to='/'\n buttonLabel={t('Back to Home Page')}\n showButton={showButton}\n />\n </div>\n );\n};\n","import React, { useMemo } from 'react';\nimport { Route, Redirect } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\nimport { useIsUnityAuthenticated } from '../utilities/auth/useIsUnityAuthenticated';\nimport { useUser } from '../utilities/auth/useUser';\nimport { PageForbiddenRoute } from './components/PageForbiddenRoute';\n\nexport const PrivateRoute = ({ ...otherProps }) => {\n const isAuthenticated = useIsUnityAuthenticated();\n const user = useUser();\n const { t } = useTranslation();\n \n const userHasAccessToTenant = useMemo(() => {\n if (user?.tenantIds?.includes(user.currentTenantId)) {\n return true;\n }\n return false;\n }, [user]);\n\n if (!userHasAccessToTenant && isAuthenticated && user?.statusCode === 200) {\n return (\n <Route\n path='*'\n render={(props) => (\n <PageForbiddenRoute\n message={t('You do not have access to this tenant. Please select a different Tenant.')}\n showButton={false}\n />\n )}\n />\n );\n }\n\n if (isAuthenticated && user?.statusCode === 200) {\n return <Route {...otherProps} />;\n }\n\n return null;\n};\n","import React, { Suspense, lazy } from 'react';\nimport { Route, Switch } from 'react-router-dom';\nimport { PrivateRoute } from './PrivateRoute';\nimport { UdpPageEnums } from '../enums/pageEnums';\nimport { ConfigService } from 'udp-react-stencil-component-library';\nimport { PageLoading } from '../UI/feedback/PageLoading';\n\n// Lazy load route components\nconst VirtualBrowser = lazy(() =>\n import('../maintenanceEngine/virtualBrowser/VirtualBrowser')\n);\nconst MenuPage = lazy(() => import('../menuPage/MenuPage'));\nconst UdpPublicForm = lazy(() => import('../udp/pages/UdpPublicForm'));\nconst WorkflowContainer = lazy(() => import('../workflow/WorkflowContainer'));\nconst PasswordResetRedirect = lazy(() =>\n import('./components/PasswordResetRedirect')\n);\nconst MyExportsPage = lazy(() => import('../udp/export/MyExportsPage'));\nconst PageNotFoundRoute = lazy(() => import('./components/PageNotFoundRoute'));\nconst UdpMaintenanceConfigPage = lazy(() =>\n import('../udp/pages/UdpMaintenanceConfigPage')\n);\nconst UdpMaintenanceEnginePage = lazy(() =>\n import('../udp/pages/UdpMaintenanceEnginePage')\n);\n\nexport const UdpRoutes = (props) => {\n const { ...other } = props;\n return (\n <Suspense fallback={<PageLoading />}>\n <Switch>\n <PrivateRoute\n path='/virtual/:id'\n render={(props) => <VirtualBrowser {...props} {...other} />}\n />\n <PrivateRoute\n path='/menupage/:id'\n render={(props) => <MenuPage {...props} {...other} />}\n />\n\n <Route\n path={`/page/${UdpPageEnums.Udp_Public_Forms_Page}`}\n render={(props) => <UdpPublicForm {...props} {...other} />}\n />\n <Route\n path={`/passwordresetsuccess`}\n render={(props) => <PasswordResetRedirect props={props} />}\n />\n <PrivateRoute\n path='/workflowtask/:id'\n render={(props) => <WorkflowContainer {...props} {...other} />}\n />\n <PrivateRoute\n path='/myexports'\n render={(props) => (\n <MyExportsPage\n productId={ConfigService.config.UNITY_PRODUCT_ID}\n {...props}\n {...other}\n />\n )}\n />\n <PrivateRoute\n path='/crudbrowser'\n render={(props) => <UdpMaintenanceEnginePage {...props} />}\n />\n <PrivateRoute\n path='/tablebrowser'\n render={(props) => <UdpMaintenanceConfigPage {...props} />}\n />\n <PrivateRoute path='*' component={PageNotFoundRoute} />\n </Switch>\n </Suspense>\n );\n};\n"],"mappings":";;;;;;;;;;;;AAKA,MAAM,YAAY,YAAY,WAAW,EACvC,MAAM,EACJ,WAAW,MAAM,QAAQ,EAAE,EAC5B,EACF,EAAE;AAEH,MAAa,sBAAsB,UAAU;CAC3C,MAAM,EAAE,OAAO,YAAY,WAAW,SAAS,eAAe;CAC9D,MAAM,UAAU,WAAW;CAC3B,MAAM,EAAE,MAAM,gBAAgB;AAE9B,QACE,oCAAC,SAAI,WAAW,QAAQ,QACtB,oCAAC;EACC,OAAO,SAAS,EAAE,iBAAiB;EACnC,YAAY,cAAc;EAC1B,WACE,aAAa,EAAE,uDAAuD;EAExE,SAAS,WAAW,EAAE,iDAAiD;EACvE,IAAG;EACH,aAAa,EAAE,oBAAoB;EACvB;GACZ,CACE;;;;;ACtBV,MAAa,gBAAgB,EAAE,GAAG,iBAAiB;CACjD,MAAM,kBAAkB,yBAAyB;CACjD,MAAM,OAAO,SAAS;CACtB,MAAM,EAAE,MAAM,gBAAgB;AAS9B,KAAI,CAP0B,cAAc;AAC1C,MAAI,MAAM,WAAW,SAAS,KAAK,gBAAgB,CACjD,QAAO;AAET,SAAO;IACN,CAAC,KAAK,CAAC,IAEoB,mBAAmB,MAAM,eAAe,IACpE,QACE,oCAAC;EACC,MAAK;EACL,SAAS,UACP,oCAAC;GACC,SAAS,EAAE,2EAA2E;GACtF,YAAY;IACZ;GAEJ;AAIN,KAAI,mBAAmB,MAAM,eAAe,IAC1C,QAAO,oCAAC,OAAU,WAAc;AAGlC,QAAO;;;;;AC7BT,MAAM,iBAAiB,WACrB,OAAO,gCACR;AACD,MAAM,WAAW,WAAW,OAAO,0BAAwB;AAC3D,MAAM,gBAAgB,WAAW,OAAO,+BAA8B;AACtE,MAAM,oBAAoB,WAAW,OAAO,mCAAiC;AAC7E,MAAM,wBAAwB,WAC5B,OAAO,uCACR;AACD,MAAM,gBAAgB,WAAW,OAAO,+BAA+B;AACvE,MAAM,oBAAoB,WAAW,OAAO,mCAAkC;AAC9E,MAAM,2BAA2B,WAC/B,OAAO,0CACR;AACD,MAAM,2BAA2B,WAC/B,OAAO,0CACR;AAED,MAAa,aAAa,UAAU;CAClC,MAAM,EAAE,GAAG,UAAU;AACrB,QACE,oCAAC,YAAS,UAAU,oCAAC,kBAAc,IACjC,oCAACA,gBACC,oCAAC;EACC,MAAK;EACL,SAAS,YAAU,oCAAC;GAAe,GAAIC;GAAO,GAAI;IAAS;GAC3D,EACF,oCAAC;EACC,MAAK;EACL,SAAS,YAAU,oCAAC;GAAS,GAAIA;GAAO,GAAI;IAAS;GACrD,EAEF,oCAAC;EACC,MAAM,SAAS,aAAa;EAC5B,SAAS,YAAU,oCAAC;GAAc,GAAIA;GAAO,GAAI;IAAS;GAC1D,EACF,oCAAC;EACC,MAAM;EACN,SAAS,YAAU,oCAAC,yBAAsB,OAAOA,UAAS;GAC1D,EACF,oCAAC;EACC,MAAK;EACL,SAAS,YAAU,oCAAC;GAAkB,GAAIA;GAAO,GAAI;IAAS;GAC9D,EACF,oCAAC;EACC,MAAK;EACL,SAAS,YACP,oCAAC;GACC,WAAW,cAAc,OAAO;GAChC,GAAIA;GACJ,GAAI;IACJ;GAEJ,EACF,oCAAC;EACC,MAAK;EACL,SAAS,YAAU,oCAAC,0BAA6BA,QAAS;GAC1D,EACF,oCAAC;EACC,MAAK;EACL,SAAS,YAAU,oCAAC,0BAA6BA,QAAS;GAC1D,EACF,oCAAC;EAAa,MAAK;EAAI,WAAW;GAAqB,CAChD,CACA"}
package/dist/index.js CHANGED
@@ -196,7 +196,7 @@ import { PageContent, PageHeader, PageSectionHeader, PageSectionSpacer } from ".
196
196
  import { useIsUnityAuthenticated } from "./useIsUnityAuthenticated-n3QuDnIj.js";
197
197
  import { PowerBIReport } from "./PowerBIReport-Bt0Fjlyw.js";
198
198
  import { PageStatus } from "./PageStatus-CjupI8az.js";
199
- import { PrivateRoute, UdpRoutes } from "./UdpRoutes-Bjfl5no0.js";
199
+ import { PrivateRoute, UdpRoutes } from "./UdpRoutes-KQam73g2.js";
200
200
  import { PageLoading } from "./PageLoading-DCoyVjWf.js";
201
201
  import { AmbientProjectSwitcher, FluentProfileMenuCard, ShellDropdown } from "./FluentProfileMenuCard-FKdOEzYd.js";
202
202
  import "./redirectToLink-B4Y9oH1K.js";
@@ -228,7 +228,7 @@ import "./tagEnums-BD6xUu3X.js";
228
228
  import { CrudForm, UdpCrudFormFields } from "./CrudForm-DIlveZRg.js";
229
229
  import "./CrudTableSidePanel-1A8qrCCX.js";
230
230
  import { UdpMaintenanceEnginePage } from "./UdpMaintenanceEnginePage-DAioIeSf.js";
231
- import { DonutChartWidget_exports, FluentPrimaryStatNumber_default, FluentSecondaryStatNumber_default, FluentStatNumber_default, FluentStatsSnippet_default, ProgressBarWidget_exports, RecentlyLoadedNodesWidget_exports, RemindersWidget_exports, SparklineWidget_exports, UdpPages, convertISODate } from "./udpPages-D6t7REhp.js";
231
+ import { DonutChartWidget_exports, FluentPrimaryStatNumber_default, FluentSecondaryStatNumber_default, FluentStatNumber_default, FluentStatsSnippet_default, ProgressBarWidget_exports, RecentlyLoadedNodesWidget_exports, RemindersWidget_exports, SparklineWidget_exports, UdpPages, convertISODate } from "./udpPages-P-7udUnT.js";
232
232
  import { FluentCheckbox } from "./FluentCheckbox-DdPx94AF.js";
233
233
  import "./FluentIconKey-DdoCGnzt.js";
234
234
  import "./IconLibrary-DIc1kbJA.js";
@@ -238,7 +238,7 @@ import "./DataBrowserContainer-Bd2FU4Y4.js";
238
238
  import "./RemindersCard-BrjYmZVz.js";
239
239
  import { UdpPublicForm } from "./UdpPublicForm-C0SHN_iy.js";
240
240
  import { AmbientAutoComplete } from "./AmbientAutoComplete-BmBgMVpv.js";
241
- import { AmbientStepper, ImportDataFromFileMapping } from "./ImportDataFromFileMapping-Cr-Yof-6.js";
241
+ import { AmbientStepper, ImportDataFromFileMapping } from "./ImportDataFromFileMapping-b_i26ucy.js";
242
242
  import { Divider } from "./Divider-BU1-Ll14.js";
243
243
  import { CompactDataListItem } from "./CompactDataListItem-DMGFdFDP.js";
244
244
  import { AlertContainer } from "./AlertContainer-nZR1BsF6.js";
@@ -332,7 +332,7 @@ import { UdpMap } from "./UdpMap-5NE3rUIS.js";
332
332
  import { MyExportsPage, StatusCellRenderer } from "./MyExportsPage-Cq2MRoRf.js";
333
333
  import { InputsExample } from "./InputsExample-BPDEWFXK.js";
334
334
  import "./BaseTreeMenu-DHEMztjA.js";
335
- import { MenuPage_default } from "./MenuPage-DJGGAhH5.js";
335
+ import { MenuPage_default } from "./MenuPage-ubGSLrRu.js";
336
336
  import * as React$1 from "react";
337
337
  import React, { Fragment, forwardRef, useCallback, useEffect, useMemo, useRef, useState } from "react";
338
338
  import { Avatar, Badge, Box as Box$1, Card, CardContent, Chip, Divider as Divider$1, FormControl as FormControl$1, FormControlLabel as FormControlLabel$1, FormGroup, Grid as Grid$1, Grow, IconButton, InputAdornment as InputAdornment$1, InputLabel, LinearProgress as LinearProgress$1, ListItemIcon, Menu, MenuItem, Select, Tab, Tabs, Tooltip, Typography as Typography$1, colors as colors$1, darken, lighten, makeStyles, styled, useTheme } from "@material-ui/core";
@@ -4098,7 +4098,7 @@ const InsightRenderer = (props) => {
4098
4098
  //#region src/menuPage/CustomMenuPage.jsx
4099
4099
  const useStyles$1 = makeStyles((theme) => ({ root: {
4100
4100
  flexGrow: 1,
4101
- padding: theme.spacing(2)
4101
+ padding: theme.spacing(1)
4102
4102
  } }));
4103
4103
  function buildInnerMenuFromItems(items = [], menuTitle, idPrefix = "custom", showItemCount = false, itemCountAccessor = null) {
4104
4104
  const idMap = {};
@@ -4152,7 +4152,7 @@ function buildInnerMenuFromItems(items = [], menuTitle, idPrefix = "custom", sho
4152
4152
  const CustomMenuPage = ({ items = [], className = "", menuTitle, mainContent: clientMainContent, idPrefix = "custom", showItemCount = false, itemCountAccessor = null }) => {
4153
4153
  const classes = useStyles$1();
4154
4154
  const { innerMenu, idMap } = buildInnerMenuFromItems(items, menuTitle, idPrefix, showItemCount, itemCountAccessor);
4155
- const mainContent = clientMainContent ? ({ selectedNode, menuItemsList }) => clientMainContent({
4155
+ const clientContent = clientMainContent ? ({ selectedNode, menuItemsList }) => clientMainContent({
4156
4156
  selectedNode,
4157
4157
  menuItemsList,
4158
4158
  idMap,
@@ -4160,9 +4160,13 @@ const CustomMenuPage = ({ items = [], className = "", menuTitle, mainContent: cl
4160
4160
  classes,
4161
4161
  className
4162
4162
  }) : ({ selectedNode, menuItemsList }) => /* @__PURE__ */ React.createElement("div", { className: `${classes.root} ${className}` });
4163
+ const composedMainContent = ({ selectedNode, menuItemsList }) => /* @__PURE__ */ React.createElement("div", { className: `${classes.root} ${className}` }, clientContent({
4164
+ selectedNode,
4165
+ menuItemsList
4166
+ }));
4163
4167
  return /* @__PURE__ */ React.createElement(MenuPage_default, {
4164
4168
  innerMenuOverride: innerMenu,
4165
- mainContent
4169
+ mainContent: composedMainContent
4166
4170
  });
4167
4171
  };
4168
4172
  CustomMenuPage.propTypes = {