udp-react-enterprise-component-library 25.18.1-beta.75 → 25.18.1-beta.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/{Shell-Bcr0PHnd.js → Shell-Bf26jefp.js} +2 -2
  2. package/dist/{Shell-Bcr0PHnd.js.map → Shell-Bf26jefp.js.map} +1 -1
  3. package/dist/{SiteHeader-DmfTUOmH.js → SiteHeader-CQSKBolX.js} +3 -3
  4. package/dist/{SiteHeader-DmfTUOmH.js.map → SiteHeader-CQSKBolX.js.map} +1 -1
  5. package/dist/UI/forms/index.js +1 -1
  6. package/dist/UI/index.js +1 -1
  7. package/dist/{UdpTransactionsPage-DXt_i8vP.js → UdpTransactionsPage-Dr3XbvFa.js} +111 -16
  8. package/dist/UdpTransactionsPage-Dr3XbvFa.js.map +1 -0
  9. package/dist/{UserForm-DNgeQvad.js → UserForm-CBm_ZIJx.js} +4 -4
  10. package/dist/UserForm-CBm_ZIJx.js.map +1 -0
  11. package/dist/{UserFormSideSheet-RyDFg3QI.js → UserFormSideSheet-7fHGhAER.js} +2 -2
  12. package/dist/{UserFormSideSheet-RyDFg3QI.js.map → UserFormSideSheet-7fHGhAER.js.map} +1 -1
  13. package/dist/UserFormSideSheet-DEGPuhUQ.js +3 -0
  14. package/dist/{forms-lyNriVSn.js → forms-sRKithEr.js} +15 -7
  15. package/dist/{forms-lyNriVSn.js.map → forms-sRKithEr.js.map} +1 -1
  16. package/dist/index.js +5 -5
  17. package/dist/shell/index.js +4 -4
  18. package/dist/shell/ui/addUser/index.js +2 -2
  19. package/dist/shell/ui/index.js +3 -3
  20. package/dist/types/src/UI/forms/UdpTransactionEmailForm.d.ts +6 -1
  21. package/dist/types/src/UI/forms/UdpTransactionEmailForm.d.ts.map +1 -1
  22. package/dist/types/src/hooks/useUdpGridFilterModel.d.ts +2 -0
  23. package/dist/types/src/hooks/useUdpGridFilterModel.d.ts.map +1 -0
  24. package/dist/types/src/maintenanceEngine/tableBrowser/TableColumnDefs.d.ts +1 -1
  25. package/dist/types/src/maintenanceEngine/tableBrowser/TableColumnDefs.d.ts.map +1 -1
  26. package/dist/types/src/shell/ui/addUser/UserFormFields.d.ts +1 -1
  27. package/dist/types/src/shell/ui/addUser/UserFormFields.d.ts.map +1 -1
  28. package/dist/types/src/udp/pages/UdpTransactionsPage/UdpTransactionGrid.d.ts.map +1 -1
  29. package/dist/types/src/udp/pages/UdpTransactionsPage/UdpTransactionSidesheet.d.ts.map +1 -1
  30. package/dist/types/src/udp/pages/UdpTransactionsPage/UdpTransactionsPage.d.ts.map +1 -1
  31. package/dist/types/src/udp/pages/UdpTransactionsPage/components/UdpTransactionCustomPage.d.ts.map +1 -1
  32. package/dist/types/src/udp/pages/UdpTransactionsPage/sidesheets/EditTransaction.d.ts.map +1 -1
  33. package/dist/types/tsconfig.tsbuildinfo +1 -1
  34. package/dist/udp/pages/UdpPages/index.js +1 -1
  35. package/dist/udp/pages/UdpTransactionsPage/index.js +1 -1
  36. package/export-map.json +3 -2
  37. package/package.json +1 -1
  38. package/dist/UdpTransactionsPage-DXt_i8vP.js.map +0 -1
  39. package/dist/UserForm-DNgeQvad.js.map +0 -1
  40. package/dist/UserFormSideSheet-iBczI7p0.js +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UdpTransactionsPage-Dr3XbvFa.js","names":["ConfigService","LinearProgress","ConfigService","Divider","AttachmentTransactionAttachmentList","LinearProgress","ConfigService","UdpTransactionCustomPage","Typography","ConfigService","useStyles","Typography","useStyles","ConfigService","LinearProgress","Typography","ConfigService","LinearProgress","transaction","ConfigService","catalogObjectInfo","DetailsFormFields","ConfigService","WorkflowActions","EditTransactionHeaderItem","Divider","UdpTransactionCustomPage","EditTransactionDetailsForm","EditTransactionDetailsFooterItem","ConfigService","ViewTransaction","UdpTransactionCustomPage","AttachmentTransaction","WorkflowActions","EditTransaction","ConfigService","UdpTransactionGrid","UdpTransactionSidesheet"],"sources":["../src/stores/transactionStore.ts","../src/utilities/transactions/useTransactionEngine.js","../src/udp/pages/UdpTransactionsPage/UdpTransactionGrid.jsx","../src/udp/pages/UdpTransactionsPage/sidesheets/ViewTransaction.jsx","../src/udp/pages/UdpTransactionsPage/components/AttachmentTransactionAttachmentList.jsx","../src/udp/pages/UdpTransactionsPage/sidesheets/AttachmentTransaction.jsx","../src/udp/pages/UdpTransactionsPage/components/UdpTransactionCustomPage.jsx","../src/udp/pages/UdpTransactionsPage/sidesheets/WorkflowActions.jsx","../src/uploader/utils/allowedFileProperties.js","../src/udp/pages/UdpTransactionsPage/sidesheets/EditTransactionHeaderItem.jsx","../src/udp/pages/UdpTransactionsPage/components/transactionHistory/TransactionTimelineItem.jsx","../src/udp/pages/UdpTransactionsPage/components/transactionHistory/TransactionTimeline.jsx","../src/udp/pages/UdpTransactionsPage/components/transactionAttachment/TransactionAttachment.jsx","../src/udp/pages/UdpTransactionsPage/components/transactionAttachment/TransactionAttachments.jsx","../src/udp/pages/UdpTransactionsPage/components/transactionNote/TransactionNote.jsx","../src/udp/pages/UdpTransactionsPage/components/transactionNote/TransactionNoteForm.jsx","../src/udp/pages/UdpTransactionsPage/components/transactionNote/TransactionNotes.jsx","../src/udp/pages/UdpTransactionsPage/sidesheets/enum.ts","../src/udp/pages/UdpTransactionsPage/components/EditTransactionDetailsFooterItem.jsx","../src/udp/pages/UdpTransactionsPage/components/EditTransactionDetailsFormFields.jsx","../src/udp/pages/UdpTransactionsPage/components/EditTransactionDetailsForm.jsx","../src/udp/pages/UdpTransactionsPage/sidesheets/EditTransaction.jsx","../src/udp/pages/UdpTransactionsPage/UdpTransactionSidesheet.jsx","../src/hooks/useTransactionType.js","../src/hooks/useUdpGridFilterModel.js","../src/udp/pages/UdpTransactionsPage/UdpTransactionsPage.jsx","../src/udp/pages/UdpTransactionsPage/index.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { devtools } from 'zustand/middleware';\n\ninterface TransactionState {\n transactionTypesMap: object | null | undefined;\n setTransactionTypesMap: (transactionTypes: object) => void;\n}\n\nexport const useTransactionStore: () => TransactionState =\n create<TransactionState>()(\n devtools((set) => ({\n transactionTypesMap: {},\n setTransactionTypesMap: (transactionTypesMap) =>\n set((state) => ({\n transactionTypesMap: {\n ...state.transactionTypesMap,\n ...transactionTypesMap\n }\n }))\n }))\n );\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport jsonLogic from 'json-logic-js';\nimport { useTransactionStore } from '../../stores/transactionStore';\nimport { useUser } from '../auth';\nimport { useCatalogStore } from '../../stores';\nimport {\n TransactionActionTypeEnums,\n TransactionEventTypeEnums\n} from '../../enums';\n\nexport const useTransactionEngine = (transactionTypeId) => {\n const user = useUser();\n const [transactionTypeFields, setTransactionTypeFields] = useState([]);\n\n const currentApiCatalogId = useCatalogStore(\n (state) => state.currentApiCatalogId\n );\n const catalogsMap = useCatalogStore((state) => state.catalogsMap);\n\n const transactionTypesMap = useTransactionStore(\n (state) => state.transactionTypesMap\n );\n const transactionType = transactionTypesMap\n ? transactionTypesMap[transactionTypeId]\n : null;\n\n const evaluateRule = useCallback(\n (rule, udpTransaction) => {\n let udpTransactionEvaluationData = {\n currentStatusId: udpTransaction?.currentStatusId,\n currentDomainValue: udpTransaction?.entityBusinessObject,\n tenantUserRoleIds: user?.roleIds || []\n };\n\n return jsonLogic.apply(rule, udpTransactionEvaluationData);\n },\n [user?.roleIds]\n );\n\n const getTransactionTypeTransactionActions = useCallback(\n (udpTransaction, ruleTypeId = null) => {\n const transactionActions =\n transactionType?.udpTransactionTypeUdpTransactionTypeConfiguration?.reduce(\n (actions, config) => {\n const ruleLogic = config?.expressionLogic;\n if (!ruleTypeId) {\n return actions;\n }\n if (\n config.transactionRuleTypeId === ruleTypeId &&\n config.enabled &&\n ruleLogic\n ) {\n const result = evaluateRule(ruleLogic, udpTransaction);\n if (result) {\n const configActions =\n config?.udpTransactionTypeConfigurationUdpTransactionTypeConfigurationTransactionAction ||\n [];\n\n const nestedActions = configActions\n .map(\n (action) =>\n action.udpTransactionTypeConfigurationTransactionActionUdpTransactionTypeTransactionAction\n )\n .filter((action) => action);\n\n if (nestedActions.length > 0) {\n actions = actions.concat(nestedActions);\n }\n }\n return actions;\n }\n return actions;\n },\n []\n );\n\n return transactionActions;\n },\n [transactionType, evaluateRule]\n );\n\n const hasRevisions = useMemo(() => {\n return transactionType?.hasRevision;\n }, [transactionType]);\n\n const hasClosedStatus = useMemo(() => {\n return transactionType?.udpTransactionTypeUdpTransactionTypeStatus?.some(\n (status) => status.isClosedStatus\n );\n }, [transactionType]);\n\n const transactionTypeGridColumns = useMemo(() => {\n if (Array.isArray(transactionType?.domainFields)) {\n return transactionType?.domainFields || [];\n } else if (\n transactionType?.domainFields &&\n Object.keys(transactionType.domainFields).length\n ) {\n const orderedColumns = Object.entries(transactionType.domainFields)\n .map(([propertyName, value]) => ({\n propertyName,\n ...value\n }))\n .sort((a, b) => a.order - b.order);\n return orderedColumns || [];\n }\n return [];\n }, [transactionType]);\n\n const transactionTypeStatusColorsMap = useMemo(() => {\n const statusColorsMap = {};\n transactionType?.udpTransactionTypeUdpTransactionTypeStatus?.forEach(\n (status) => {\n statusColorsMap[status.name] = status.color || 'default';\n }\n );\n return statusColorsMap;\n }, [transactionType]);\n\n const getHiddenFields = useCallback(\n (udpTransaction) => {\n const transactionActions = getTransactionTypeTransactionActions(\n udpTransaction,\n TransactionEventTypeEnums.Form\n );\n if (!transactionActions) return [];\n let hiddenFields = [];\n transactionActions\n .filter(\n (action) =>\n action.transactionActionId ===\n TransactionActionTypeEnums.Set_Fields_Hidden\n )\n .forEach((action) => {\n if (action.parameters?.hiddenFields) {\n hiddenFields = hiddenFields.concat(action.parameters.hiddenFields);\n }\n });\n return hiddenFields;\n },\n [getTransactionTypeTransactionActions]\n );\n\n const getRequiredFields = useCallback(\n (udpTransaction) => {\n const transactionActions = getTransactionTypeTransactionActions(\n udpTransaction,\n TransactionEventTypeEnums.Form\n );\n if (!transactionActions) return [];\n let requiredFields = [];\n transactionActions\n .filter(\n (action) =>\n action.transactionActionId ===\n TransactionActionTypeEnums.Set_Mandatory_Fields\n )\n .forEach((action) => {\n if (action.parameters?.mandatoryFields) {\n requiredFields = requiredFields.concat(\n action.parameters.mandatoryFields\n );\n }\n });\n return requiredFields;\n },\n [getTransactionTypeTransactionActions]\n );\n\n const getUiActionRenderPageId = useCallback(\n (uiActionType) => {\n const uiAction =\n transactionType?.udpTransactionTypeUdpTransactionUiAction?.find(\n (action) => action.transactionUiActionTypeId === uiActionType\n );\n return uiAction?.parameters?.pageId || null;\n },\n [transactionType]\n );\n\n const getTransactionTypeLabel = useCallback(\n (udpTransaction) => {\n if (!transactionType?.domainFieldLabel) return null;\n return udpTransaction?.entityBusinessObject\n ? udpTransaction.entityBusinessObject[transactionType.domainFieldLabel]\n : null;\n },\n [transactionType]\n );\n\n const checkIfTransactionIsClosed = useCallback(\n (udpTransaction) => {\n if (!hasClosedStatus) return false;\n const closedStatus =\n transactionType?.udpTransactionTypeUdpTransactionTypeStatus?.find(\n (status) => status.isClosedStatus\n );\n if (!closedStatus) return false;\n return (\n closedStatus.transactionTypeStatusId === udpTransaction?.currentStatusId\n );\n },\n [hasClosedStatus, transactionType]\n );\n\n useEffect(() => {\n if (catalogsMap && currentApiCatalogId && transactionType) {\n const apiCatalog = catalogsMap[currentApiCatalogId];\n if (apiCatalog) {\n const catalogObjects = apiCatalog.ctlg.catalogObjectList;\n const transactionTypeObject = catalogObjects.find(\n (obj) =>\n obj.catalogObjectName.toLowerCase() ===\n transactionType?.domainName?.toLowerCase()\n );\n if (transactionTypeObject) {\n setTransactionTypeFields(transactionTypeObject.properties || []);\n }\n }\n }\n }, [catalogsMap, currentApiCatalogId, transactionType]);\n\n return {\n currentTransactionType: transactionType,\n evaluateRule,\n getTransactionTypeTransactionActions,\n hasRevisions,\n getHiddenFields,\n getRequiredFields,\n hasClosedStatus,\n transactionTypeGridColumns,\n getUiActionRenderPageId,\n checkIfTransactionIsClosed,\n getTransactionTypeLabel,\n transactionTypeStatusColorsMap\n };\n};\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { SearchMethodUdpGrid } from '../../../UI/templates/newGrid';\nimport { FluentDialog, LinearProgress } from '../../../UI';\nimport { useTransactionEngine } from '../../../utilities/transactions/useTransactionEngine';\nimport { useAxiosMutate } from '../../../utilities';\nimport { ConfigService } from '../../../configService';\nimport { useHandleAxiosSnackbar } from '../../../utilities';\nimport { TransactionUiActionTypeEnums, UdpSearchEnums } from '../../../enums';\nimport { useCatalogStore } from '../../../../src/stores/catalogStore';\nimport { getSanitizedName } from '../../../utilities/entities';\n\nconst UdpTransactionGrid = (props) => {\n const {\n transactionTypeId,\n domainName,\n transactionTypeLoading,\n handleGridApiCallback,\n openAddTransaction,\n openViewTransaction,\n openEditTransaction,\n openAttachmentTransaction,\n openWorkflowActionTransaction,\n openCreateRevision,\n searchMethodObject,\n domainColumnFormatters = {},\n refreshGridData,\n gridApi,\n initialFilterModel,\n initialGridOptions = {}\n } = props;\n const [dialogOpen, setDialogOpen] = useState(false);\n const [selectedTransaction, setSelectedTransaction] = useState(null);\n\n const { t } = useTranslation();\n\n const {\n hasRevisions,\n transactionTypeGridColumns,\n getUiActionRenderPageId,\n transactionTypeStatusColorsMap,\n getTransactionTypeLabel\n } = useTransactionEngine(transactionTypeId);\n\n const { handleErrorSnackbar, handleSuccessSnackbar } =\n useHandleAxiosSnackbar();\n\n const [\n { data, loading: deleteLoading, error: deleteError },\n deleteTransaction\n ] = useAxiosMutate(\n `${ConfigService.productV1ApiUrl}`,\n `udptransaction/${selectedTransaction?.transactionId}`,\n {\n method: 'delete'\n },\n {}\n );\n\n const { currentApiCatalogId, catalogsMap } = useCatalogStore();\n\n const handleDialogClose = () => {\n setSelectedTransaction(null);\n setDialogOpen(false);\n };\n\n const handleConfirmActionDialog = useCallback(async () => {\n try {\n const response = await deleteTransaction();\n if (response?.status === 204) {\n refreshGridData();\n handleSuccessSnackbar(t(`Transaction has been cancelled successfully`));\n } else {\n handleErrorSnackbar(\n new Error(t(`Error cancelling Transaction. Please try again later.`))\n );\n }\n } catch (error) {\n handleErrorSnackbar(error);\n } finally {\n handleDialogClose();\n }\n }, [\n deleteTransaction,\n refreshGridData,\n handleErrorSnackbar,\n handleSuccessSnackbar,\n t\n ]);\n\n const removeTimeFromDate = (date) => {\n const parsedDate = new Date(date);\n if (parsedDate.getTime()) {\n const year = parsedDate.getFullYear();\n //Month is zero based 0 = Jan so need to add 1\n const month = parsedDate.getMonth() + 1;\n const day = parsedDate.getDate().toString();\n return `${year}-${month.toString()}-${day}`;\n }\n return parsedDate;\n };\n\n const addSpacingInHeaderName = (headerName) => {\n let formattedHeaderName = '';\n for (var i = 0; i < headerName.length; i++) {\n if (i !== 0 && headerName[i].match(/[A-Z]/)) {\n formattedHeaderName += ' ' + headerName[i];\n } else {\n formattedHeaderName += headerName[i];\n }\n }\n return formattedHeaderName;\n };\n\n const transactionLabel = useMemo(() => {\n return (\n getTransactionTypeLabel(selectedTransaction) ??\n selectedTransaction?.entityBusinessKey\n );\n }, [getTransactionTypeLabel, selectedTransaction]);\n\n const pdfViewPageId = useMemo(() => {\n return getUiActionRenderPageId(\n TransactionUiActionTypeEnums.Render_View_Pdf_Page\n );\n }, [getUiActionRenderPageId]);\n\n const catalogObjectList = useMemo(() => {\n if (\n catalogsMap &&\n currentApiCatalogId &&\n catalogsMap[currentApiCatalogId]\n ) {\n return catalogsMap[currentApiCatalogId]?.ctlg?.catalogObjectList;\n }\n return null;\n }, [catalogsMap, currentApiCatalogId]);\n\n const columnDefs = useMemo(() => {\n const initialColumnDefs = [\n {\n headerName: t('Transaction Id'),\n field: 'transactionId',\n hide: true\n },\n {\n headerName: t('Created On'),\n field: 'createdOn',\n cellDataType: 'dateString',\n valueFormatter: (params) => {\n return removeTimeFromDate(params?.data.createdOn);\n }\n },\n {\n headerName: t('Current Status'),\n field: 'currentStatusId',\n cellRenderer: 'statusRenderer',\n cellRendererParams: {\n statusMappingConfig: transactionTypeStatusColorsMap,\n getStatusValue: (params) =>\n params?.data.udpTransactionUdpTransactionTypeStatus.name\n },\n valueFormatter: (params) =>\n params?.data.udpTransactionUdpTransactionTypeStatus.name\n },\n {\n headerName: t('Last Event Type'),\n field: 'lastEventTypeId',\n valueFormatter: (params) =>\n params?.data.udpTransactionUdpTransactionEventType.name\n },\n {\n headerName: t('Attachments'),\n field: 'attachments',\n pinned: 'right',\n maxWidth: 100,\n onCellClicked: (event) => {\n openAttachmentTransaction(event.data);\n },\n valueFormatter: (params) => {\n return params?.data.udpTransactionUdpTransactionAttachment.length;\n }\n },\n {\n field: 'actions',\n cellRenderer: 'actionsRenderer',\n cellRendererParams: {\n actionList: [\n {\n id: 0,\n title: t('Next Steps'),\n iconName: 'migrateAlt',\n handleOnClick: (e, params) => {\n openWorkflowActionTransaction(params?.data);\n }\n },\n ...(pdfViewPageId\n ? [\n {\n id: 1,\n title: t('View'),\n iconName: 'view',\n handleOnClick: (e, params) => {\n openViewTransaction(params?.data);\n },\n disabled: !pdfViewPageId\n }\n ]\n : []),\n {\n id: 2,\n title: t('Edit'),\n iconName: 'edit',\n handleOnClick: (e, params) => {\n openEditTransaction(params?.data);\n }\n },\n {\n id: 3,\n title: t('Create Revision'),\n iconName: 'add',\n handleOnClick: (e, params) => {\n openCreateRevision(params?.data);\n },\n disabled: !hasRevisions\n },\n {\n id: 4,\n title: t('Cancel'),\n iconName: 'close16',\n handleOnClick: (e, params) => {\n setSelectedTransaction(params?.data);\n setDialogOpen(true);\n }\n }\n ]\n }\n }\n ];\n transactionTypeGridColumns?.forEach((gridColumn) => {\n const propertyName = gridColumn?.propertyName || '';\n\n let valueFormatter = (params) => {\n if (catalogObjectList) {\n let catalogObject = catalogObjectList?.find(\n (catalogObject) =>\n getSanitizedName(catalogObject.catalogObjectName) == domainName\n );\n const matchingFieldInfo = catalogObject?.properties?.find(\n (objectProperty) => {\n return objectProperty.name === propertyName;\n }\n );\n if (\n matchingFieldInfo?.type.toLowerCase() == 'datetime' &&\n params?.data?.entityBusinessObject[propertyName]\n ) {\n return removeTimeFromDate(\n params?.data?.entityBusinessObject[propertyName]\n );\n }\n }\n return params?.data\n ? params?.data?.entityBusinessObject[propertyName]\n : '';\n };\n\n if (domainColumnFormatters[propertyName]) {\n valueFormatter = domainColumnFormatters[propertyName].formatter;\n }\n\n initialColumnDefs.push({\n headerName: gridColumn?.displayName,\n field: `${UdpSearchEnums.UdpBusinessDomainPrefix}.${domainName}.${propertyName}`,\n valueFormatter: valueFormatter\n });\n });\n\n Object.keys(domainColumnFormatters).forEach((columnKey) => {\n const gridColumnPropertyNames = transactionTypeGridColumns?.map(\n (col) => col.propertyName\n );\n if (!gridColumnPropertyNames?.includes(columnKey)) {\n let formatedHeaderName =\n columnKey.slice(0, 1).toUpperCase() + columnKey.slice(1);\n initialColumnDefs.push({\n headerName: formatedHeaderName,\n field: `${UdpSearchEnums.UdpBusinessDomainPrefix}.${domainName}.${columnKey}`,\n valueFormatter: domainColumnFormatters[columnKey].formatter\n });\n }\n });\n\n if (hasRevisions) {\n initialColumnDefs.splice(3, 0, {\n headerName: t('Revision No'),\n field: 'currentRevisionNo'\n });\n }\n\n return initialColumnDefs;\n }, [\n domainName,\n t,\n openViewTransaction,\n openEditTransaction,\n openAttachmentTransaction,\n openWorkflowActionTransaction,\n domainColumnFormatters,\n transactionTypeGridColumns,\n openCreateRevision,\n hasRevisions,\n pdfViewPageId,\n transactionTypeStatusColorsMap,\n catalogObjectList\n ]);\n\n const headerConfig = {\n title: domainName,\n primaryActionButton: {\n label: domainName + ' Entry',\n iconName: 'add',\n onClick: () => {\n openAddTransaction();\n }\n }\n // secondaryActionButtons: secondaryActionButtons\n };\n\n const gridFunctions = [\n { name: 'agGridExport' },\n { name: 'agGridHideShowColumns' },\n { name: 'agGridSizeColumnsToFit' }\n ];\n\n const gridOptions = useMemo(() => {\n return {\n pagination: true,\n rowSelection: 'none',\n ...initialGridOptions\n };\n }, [initialGridOptions]);\n\n const searchMethodConfig = useMemo(() => {\n let combinedSearchObject = {\n eagerLoad: true,\n filterElements: [\n {\n searchField: 'transactionTypeId',\n searchOperator: '=',\n searchValue: transactionTypeId\n },\n {\n searchField: 'isDeleted',\n searchOperator: '=',\n searchValue: false\n }\n ]\n };\n\n if (searchMethodObject) {\n let combinedFilterElems = combinedSearchObject.filterElements.concat(\n searchMethodObject?.filterElements || []\n );\n\n combinedSearchObject = {\n ...combinedSearchObject,\n ...searchMethodObject\n };\n\n combinedSearchObject = {\n ...combinedSearchObject,\n filterElements: combinedFilterElems\n };\n }\n\n return {\n requestUrl: `${ConfigService.productV1ApiUrl}/UdpTransaction/search`,\n customSearchObject: combinedSearchObject\n };\n }, [transactionTypeId, searchMethodObject]);\n\n // eslint-disable-next-line react-you-might-not-need-an-effect/no-manage-parent\n useEffect(() => {\n if (\n gridApi &&\n initialFilterModel &&\n Object.keys(initialFilterModel).length\n ) {\n // 1. Set the filter model\n gridApi.setFilterModel(initialFilterModel);\n\n // 2. Inform the grid that filters have changed, which re-runs the data fetch (Server-Side)\n gridApi.onFilterChanged();\n }\n }, [gridApi, initialFilterModel]);\n\n console.log(gridApi?.getFilterModel());\n\n return (\n <>\n {transactionTypeLoading && <LinearProgress />}\n <SearchMethodUdpGrid\n gridHeaderConfig={headerConfig}\n gridFunctions={gridFunctions}\n gridOptions={gridOptions}\n columnDefs={columnDefs}\n searchMethodConfig={searchMethodConfig}\n gridApiCallback={handleGridApiCallback}\n />\n <FluentDialog\n title={t(`Cancel Transaction`)}\n message={`Are you sure you want to cancel the transaction for ${domainName} - ${\n transactionLabel || ''\n }?`}\n labelOne={t('Confirm')}\n actionOne={handleConfirmActionDialog}\n labelTwo={t('Cancel')}\n actionTwo={handleDialogClose}\n open={dialogOpen}\n handleClose={handleDialogClose}\n loading={deleteLoading}\n />\n </>\n );\n};\n\nexport default UdpTransactionGrid;\n","import React from 'react';\nimport { FileViewer } from '../../../../UI';\n\nconst ViewTransaction = (props) => {\n // Currently don't have the cover file so no pdf file passed need to change once we know where it is from by cahnging filePath\n const { transaction } = props;\n\n return (\n <>\n <FileViewer\n data={{\n filePath: '',\n fileExtension: 'pdf'\n }}\n acceptedFileExtensions='pdf'\n />\n </>\n );\n};\n\nexport default ViewTransaction;\n","import React, { useMemo } from 'react';\nimport { AmbientList } from '../../../../UI';\nimport {\n PDFIcon,\n WordDocumentIcon,\n FileImageIcon\n} from '@fluentui/react-icons';\n\nconst AttachmentTransactionAttachmentList = (props) => {\n const { attachments, setSelectedAttachment } = props;\n\n const formattedAttachments = useMemo(() => {\n return attachments.map((attachment) => ({\n attachmentName: attachment.fileName,\n extension: attachment.extension,\n transactionAttachmentId: attachment.transactionAttachmentId\n }));\n }, [attachments]);\n\n const getFileIcon = (item) => {\n if (item.attachmentName.includes('.pdf')) {\n return PDFIcon;\n } else if (item.attachmentName.includes('.docx')) {\n return WordDocumentIcon;\n } else if (item.attachmentName.includes('.')) {\n return FileImageIcon;\n }\n };\n\n return (\n <>\n <AmbientList\n data={formattedAttachments}\n useAvatar={false}\n fieldConfig={{\n primaryText: 'attachmentName',\n secondaryText: 'description'\n }}\n onItemClick={(item) => {\n setSelectedAttachment(item);\n }}\n getItemIcon={(item) => {\n return getFileIcon(item);\n }}\n listHeight={ 'calc(100vh - 105px)'}\n maxHeight={'calc(100vh - 105px)'}\n />\n </>\n );\n};\n\nexport default AttachmentTransactionAttachmentList;\n","import React, {\n useState,\n useEffect,\n useImperativeHandle,\n useMemo,\n useCallback\n} from 'react';\nimport {\n AmbientAlert,\n Divider,\n EmptyStateDisplay,\n FileViewer,\n LinearProgress\n} from '../../../../UI';\nimport AttachmentTransactionAttachmentList from '../components/AttachmentTransactionAttachmentList';\nimport { apiMutate } from '../../../../utilities';\nimport { ViewIcon } from '@fluentui/react-icons';\nimport { makeStyles } from '@material-ui/core';\nimport { useAxiosGet } from '../../../../utilities';\nimport { ConfigService } from '../../../../configService/index';\nimport { useTranslation } from 'react-i18next';\n\nconst AttachmentTransaction = (props) => {\n const { transaction, attachmentRef } = props;\n const [selectedAttachment, setSelectedAttachment] = useState('');\n\n const attachments = transaction?.udpTransactionUdpTransactionAttachment;\n\n const { t } = useTranslation();\n\n const [{ data: attachmentFileInfo }, refetchattachmentFileInfo] = useAxiosGet(\n `${process.env.REACT_APP_PRODUCT_API_BASE}`,\n `UdpTransactionAttachment/${selectedAttachment?.transactionAttachmentId}/udpDriveFile/download`,\n {},\n true\n );\n\n const [{ data: attachmentFile, loading: loadingFile, error: downloadError }, refetchAttachmentFile] = useAxiosGet(\n `${process.env.REACT_APP_PRODUCT_API_BASE}`,\n `UdpTransactionAttachment/${selectedAttachment?.transactionAttachmentId}/download`,\n {\n responseType: 'blob'\n },\n true\n );\n\n const blobUrl = useMemo(() => {\n if (!attachmentFile) return null;\n const pdfBlob = new Blob([attachmentFile], { type: 'application/pdf' });\n return URL.createObjectURL(pdfBlob);\n }, [attachmentFile]);\n\n useEffect(() => {\n if (selectedAttachment) {\n refetchattachmentFileInfo();\n refetchAttachmentFile();\n }\n }, [selectedAttachment, refetchattachmentFileInfo, refetchAttachmentFile]);\n\n const getErrorMessage = () => {\n if (!downloadError) return null;\n\n const status = downloadError.response?.status;\n if (status === 404) return t('The requested attachment could not be found.');\n if (status >= 500) return t('A server error occured. Please try again later.');\n\n return downloadError.message || t('An unexpected error occured.');\n };\n\n let fileDataObj = {\n filePath: blobUrl,\n fileExtension: attachmentFileInfo?.extension\n };\n\n const fixedHeight = 'calc(100vh - 140px)'\n const useStyles = makeStyles((theme) => ({\n sidesheet: {\n display: 'flex',\n flexDirection: 'row',\n flex: 1,\n height: fixedHeight,\n },\n attachmentListContainer: {\n textAlign: 'left',\n width: '35%',\n height: fixedHeight\n },\n attachmentListHeader: {\n backgroundColor: 'white',\n justifyItems: 'left',\n paddingLeft: '5%'\n },\n attachmentListHeaderPrimaryText: {\n fontSize: 'var(--h6-font-size)',\n fontWeight: 'var(--body1-font-weight)',\n color: 'var(--text-main)'\n },\n attachmentListHeaderSecondaryText: {\n fontSize: 'var(--body2-font-size)',\n color: 'var(--text-secondary)',\n paddingBottom: '2%'\n },\n attachemntFileInfoCol: {\n width: '50%',\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n overflowY: \"auto\",\n height:'calc(100vh - 50px)'\n },\n attachmentFileNameHeader: {\n backgroundColor: 'white'\n },\n attachmentFileName: {\n color: 'var(--text-main)',\n fontSize: 'var(--h6-font-size)',\n fontWeight: 'var(--body1-font-weight)',\n marginTop: '1%',\n marginBottom: '1%',\n justifySelf: 'center'\n },\n fileViewer: {\n marginLeft: 'var(--spacing-02)',\n marginRight: 'var(--spacing-02)'\n },\n divider: {\n '& MuiDivider-root': {\n backgroundColor: 'var(--gray-02)'\n }\n }\n }));\n\n const classStyles = useStyles();\n\n useImperativeHandle(attachmentRef, () => ({\n downloadSelectedFile: async () => {\n if (!selectedAttachment) return;\n\n try {\n const response = await apiMutate(\n ConfigService.productV1ApiUrl,\n `UdpTransactionAttachment/${selectedAttachment.transactionAttachmentId}/udpDriveFile/download`,\n {}\n );\n const url = response.data.link;\n const link = document.createElement('a');\n link.href = url;\n link.download = selectedAttachment.fileName ?? selectedAttachment.name;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } catch (e) {\n console.error('Download failed', e);\n }\n }\n }));\n\n const handleOpenInNewTab = useCallback(\n e => {\n e?.preventDefault();\n\n if (blobUrl) {\n window.open(blobUrl, '_blank');\n }\n },\n [blobUrl]\n );\n\n const refetchAttachment = () => {\n refetchattachmentFileInfo();\n refetchAttachmentFile();\n }\n\n return (\n <>\n <div className={classStyles.sidesheet}>\n <div className={classStyles.attachmentListContainer}>\n <div className={classStyles.attachmentListHeader}>\n <div className={classStyles.attachmentListHeaderPrimaryText}>\n Attachments\n </div>\n <div className={classStyles.attachmentListHeaderSecondaryText}>\n {attachments.length + ' file(s) attached'}\n </div>\n </div>\n <div className={classStyles.divider}>\n <Divider />\n </div>\n <AttachmentTransactionAttachmentList\n transaction={transaction}\n attachments={attachments}\n setSelectedAttachment={setSelectedAttachment}\n />\n </div>\n\n <div className={classStyles.attachemntFileInfoCol}>\n <div className={classStyles.attachmentFileNameHeader}>\n {selectedAttachment && (\n <p className={classStyles.attachmentFileName}>\n {selectedAttachment.attachmentName}\n </p>\n )}\n <div className={classStyles.divider}>\n <Divider />\n </div>\n </div>\n\n {downloadError && (\n <AmbientAlert\n showAlert={!!downloadError}\n alertSeverity={\"error\"}\n alertTitle={t('Failed to load preview')}\n alertMessage={getErrorMessage()}\n alertAction={true}\n alertActionButton={t('Retry')}\n alertHandleAction={() => refetchAttachment()}\n />\n )}\n\n {loadingFile && !downloadError ? (\n <LinearProgress />\n ) : selectedAttachment && attachmentFileInfo && blobUrl ? (\n <div className={classStyles.fileViewer}>\n <FileViewer\n data={\n attachmentFileInfo?.extension == 'pdf'\n ? fileDataObj\n : [fileDataObj]\n }\n onClickDownload={handleOpenInNewTab}\n />\n </div>\n ) : !selectedAttachment &&\n (<EmptyStateDisplay\n icon={ViewIcon}\n primaryText={'Select an attachment to preview'}\n secondaryText={\n 'Choose a file from the attachments list to view its contents'\n }\n />\n )}\n </div>\n </div>\n </>\n );\n};\nexport default AttachmentTransaction;\n","import React, { useCallback, useMemo } from 'react';\nimport { PageContainer } from '../../../../page/PageContainer';\nimport { useTransactionEngine } from '../../../../utilities/transactions/useTransactionEngine';\nimport { TransactionUiActionTypeEnums } from '../../../../enums';\nimport { Form, FormSpy } from '../../../../utilities/form';\nimport { ConfigService } from 'udp-react-stencil-component-library';\nimport { apiMutate } from '../../../../utilities';\nimport { useHandleAxiosSnackbar } from '../../../../utilities/apiHelpers';\nimport { useTranslation } from 'react-i18next';\nimport { set } from 'date-fns';\n\nconst UdpTransactionCustomPage = (props) => {\n const {\n pageId,\n transactionTypeId,\n transactionUiActionType,\n formRef,\n transaction,\n transactionTypeTransactionActionId,\n setHasUnsavedChanges\n } = props;\n\n const { getUiActionRenderPageId, getHiddenFields, getRequiredFields } =\n useTransactionEngine(transactionTypeId);\n\n const { handleErrorSnackbar, handleSuccessSnackbar } =\n useHandleAxiosSnackbar();\n const { t } = useTranslation();\n\n const executeCreateTransactionAction = useCallback(\n async (data) =>\n apiMutate(\n ConfigService.productV1ApiUrl,\n `udpTransaction/transactionType/${transactionTypeId}/create`,\n {\n method: 'post'\n },\n data\n ),\n [transactionTypeId]\n );\n\n const executeSaveChanges = useCallback(\n async (data) =>\n apiMutate(\n ConfigService.productV1ApiUrl,\n `udpTransaction/${transaction?.transactionId}/saveChanges`,\n {\n method: 'put'\n },\n data\n ),\n [transaction?.transactionId]\n );\n\n const executeCreateRevision = useCallback(\n async (data) =>\n apiMutate(\n ConfigService.productV1ApiUrl,\n `udpTransaction/${transaction?.transactionId}/createRevision`,\n {\n method: 'post'\n },\n data\n ),\n [transaction?.transactionId]\n );\n\n const executeSubmitCustomAction = useCallback(\n async (data) =>\n apiMutate(\n ConfigService.productV1ApiUrl,\n `udptransactiontypeTransactionAction/${transactionTypeTransactionActionId}/transaction/${transaction.transactionId}/submit`,\n {\n method: 'post'\n },\n data\n ),\n [transactionTypeTransactionActionId, transaction?.transactionId]\n );\n\n const onSubmit = useCallback(\n async (values) => {\n try {\n const request = { data: values };\n let response = null;\n let message = '';\n let errorMessagePart = '';\n if (\n transactionUiActionType ===\n TransactionUiActionTypeEnums.Render_Create_Transaction_Page\n ) {\n response = await executeCreateTransactionAction(request);\n message = 'Transaction has been created successfully';\n errorMessagePart = 'creating';\n } else if (\n transactionUiActionType ===\n TransactionUiActionTypeEnums.Render_Transaction_Details_Page\n ) {\n response = await executeSaveChanges(request);\n message = 'Transaction has been saved successfully';\n errorMessagePart = 'saving';\n } else if (\n transactionUiActionType ===\n TransactionUiActionTypeEnums.Render_Create_Revision_Page\n ) {\n response = await executeCreateRevision(request);\n message = 'Revision has been created successfully';\n errorMessagePart = 'creating revision for';\n } else if (!!transactionTypeTransactionActionId) {\n response = await executeSubmitCustomAction(request);\n message = 'Action has been submitted successfully';\n errorMessagePart = 'submitting action for';\n }\n\n if (response?.status === 200) {\n handleSuccessSnackbar(t(`${message} `));\n } else {\n handleErrorSnackbar(\n new Error(\n t(\n `Error ${errorMessagePart} Transaction. Please try again later.`\n )\n )\n );\n }\n } catch (error) {\n handleErrorSnackbar(error);\n } finally {\n if (setHasUnsavedChanges) {\n formRef.current?.form?.restart(values);\n setHasUnsavedChanges(false);\n }\n }\n },\n [\n executeCreateTransactionAction,\n executeSaveChanges,\n executeCreateRevision,\n handleErrorSnackbar,\n handleSuccessSnackbar,\n transactionUiActionType,\n executeSubmitCustomAction,\n t,\n transactionTypeTransactionActionId,\n setHasUnsavedChanges,\n formRef\n ]\n );\n\n const isFieldRequired = useCallback(\n (fieldName) => {\n const requiredFields = getRequiredFields(transaction);\n return requiredFields?.includes(fieldName);\n },\n [getRequiredFields, transaction]\n );\n\n const isFieldHidden = useCallback(\n (fieldName) => {\n const hiddenFields = getHiddenFields(transaction);\n return hiddenFields?.includes(fieldName);\n },\n [getHiddenFields, transaction]\n );\n\n const transactionPageId = useMemo(() => {\n if (pageId) {\n return pageId;\n }\n return getUiActionRenderPageId(transactionUiActionType);\n }, [getUiActionRenderPageId, transactionUiActionType, pageId]);\n\n if (!transactionPageId) {\n return null;\n }\n\n return (\n <Form onSubmit={onSubmit} ref={formRef}>\n <FormSpy subscription={{ dirty: true }}>\n {({ dirty }) => {\n if (setHasUnsavedChanges) {\n setHasUnsavedChanges(dirty);\n }\n }}\n </FormSpy>\n <PageContainer\n pageId={transactionPageId}\n updateLocationState={false}\n widgetParams={{ transaction, isFieldRequired, isFieldHidden }}\n />\n </Form>\n );\n};\n\nexport default UdpTransactionCustomPage;\n","import React, { useState, useCallback, useMemo, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useSnackbar } from 'notistack';\nimport { DocumentIcon } from '@fluentui/react-icons';\nimport { FluentDialog, SideSheet } from '../../../../UI';\nimport { useAxiosMutate } from '../../../../utilities';\nimport { ConfigService } from '../../../../configService';\nimport { UdpActionCard } from '../../../../UI/inputs/buttons/UdpActionCard/UdpActionCard';\nimport { getIconFromName } from '../../../../utilities/tree';\nimport './WorkflowActions.css';\nimport { TransactionEventTypeEnums } from '../../../../enums/unitySystemEnums';\nimport { useTransactionEngine } from '../../../../utilities/transactions/useTransactionEngine';\nimport UdpTransactionCustomPage from '../components/UdpTransactionCustomPage';\n\nconst TransactionActionButton = ({\n icon,\n primaryText,\n secondaryText,\n onClick,\n action\n}) => {\n const actionCardIcon = useMemo(() => getIconFromName(icon), [icon]);\n\n return (\n <UdpActionCard\n icon={actionCardIcon ? actionCardIcon : DocumentIcon}\n primaryText={primaryText}\n secondaryText={secondaryText}\n onClick={() => {\n onClick(action);\n }}\n />\n );\n};\n\nconst WorkflowActions = ({ transaction, closeSideSheet, refreshGridData }) => {\n const [dialogOpen, setDialogOpen] = useState(true);\n const [dialogUserStrings, setDialogUserStrings] = useState(null);\n const [selectedAction, setSelectedAction] = useState(null);\n const [sideSheetOpen, setSideSheetOpen] = useState(false);\n const [loading, setLoading] = useState(false);\n\n const formRef = useRef(null);\n\n const { getTransactionTypeTransactionActions } = useTransactionEngine(\n transaction.transactionTypeId\n );\n\n const handleOnCloseSideSheet = useCallback(() => {\n setSideSheetOpen(false);\n }, []);\n\n const handleSubmitWorkflowAction = useCallback(async () => {\n setLoading(true);\n await formRef.current?.form?.submit();\n setLoading(false);\n handleOnCloseSideSheet();\n closeSideSheet();\n refreshGridData();\n }, [handleOnCloseSideSheet, refreshGridData, closeSideSheet, formRef]);\n\n const transactionTypeTransactionActions = useMemo(() => {\n return (\n getTransactionTypeTransactionActions(\n transaction,\n TransactionEventTypeEnums.Sidesheet\n ) || []\n );\n }, [getTransactionTypeTransactionActions, transaction]);\n\n // Base URL and url get overwritten in postTransactionData function call in handleConfirmActionDialog()\n const [{ data: transactionData }, postTransactionData] = useAxiosMutate(\n `${ConfigService.productV1ApiUrl}`,\n 'udptransactiontypeTransactionAction',\n {\n method: 'post'\n },\n {}\n );\n\n const i18n = useTranslation().t;\n const { enqueueSnackbar } = useSnackbar();\n\n const handleDialogOpen = useCallback((title, message) => {\n setDialogUserStrings({ title, message });\n setDialogOpen(true);\n }, []);\n\n const handleDialogClose = useCallback(() => {\n setDialogOpen(false);\n }, []);\n\n const handleConfirmActionDialog = useCallback(async () => {\n setDialogOpen(true);\n handleDialogClose();\n setLoading(true);\n try {\n const data = await postTransactionData({\n // Change URL to config\n url:\n `${ConfigService.productV1ApiUrl}` +\n `/udptransactiontypeTransactionAction/${selectedAction.transactionTypeTransactionActionId}/transaction/${transaction.transactionId}/submit`,\n data: {}\n });\n enqueueSnackbar(i18n('Successfully submitted!'), {\n variant: 'success',\n anchorOrigin: {\n vertical: 'top',\n horizontal: 'center'\n }\n });\n closeSideSheet();\n refreshGridData();\n } catch (event) {\n enqueueSnackbar(i18n(event.message), {\n variant: 'error',\n anchorOrigin: {\n vertical: 'top',\n horizontal: 'center'\n }\n });\n }\n setLoading(false);\n }, [\n postTransactionData,\n handleDialogClose,\n transaction,\n selectedAction,\n enqueueSnackbar,\n i18n,\n closeSideSheet,\n refreshGridData\n ]);\n const handleOnActionClick = useCallback(\n (action) => {\n const pageId = action.parameters.pageId;\n setSelectedAction(action);\n if (pageId) {\n setSideSheetOpen(true);\n } else {\n handleDialogOpen(action.name, action.description);\n }\n },\n [handleDialogOpen]\n );\n\n const TransactionActionButtons = useMemo(() => {\n if (!transactionTypeTransactionActions.length) {\n return null;\n }\n return transactionTypeTransactionActions?.map((action) => (\n <TransactionActionButton\n key={action.transactionTypeTransactionActionId}\n primaryText={action.name}\n secondaryText={action.description}\n icon={action.icon}\n onClick={handleOnActionClick}\n action={action}\n />\n ));\n }, [transactionTypeTransactionActions, handleOnActionClick]);\n\n return (\n <>\n <div className='transaction-action-buttons-container'>\n {TransactionActionButtons}\n </div>\n\n {dialogUserStrings && (\n <FluentDialog\n title={i18n(\n `Are you sure you want to proceed with \\\"${dialogUserStrings.title}\\\"?`\n )}\n message={dialogUserStrings.message}\n labelOne={i18n('Confirm')}\n actionOne={handleConfirmActionDialog}\n labelTwo={i18n('Cancel')}\n actionTwo={handleDialogClose}\n open={dialogOpen}\n handleClose={handleDialogClose}\n />\n )}\n\n <SideSheet\n open={sideSheetOpen}\n title={selectedAction?.name} // To Change\n onClose={handleOnCloseSideSheet}\n width={600}\n buttonLabel={i18n('Submit')}\n onSubmit={handleSubmitWorkflowAction}\n progress={loading}\n variant='indeterminate'\n >\n {selectedAction && selectedAction.parameters?.pageId && (\n <UdpTransactionCustomPage\n pageId={selectedAction.parameters.pageId}\n transaction={transaction}\n formRef={formRef}\n transactionTypeTransactionActionId={\n selectedAction.transactionTypeTransactionActionId\n }\n />\n )}\n </SideSheet>\n </>\n );\n};\n\nexport default WorkflowActions;\n","export const MAX_FILE_SIZE_MB = 30;\n\nexport const allowedExtensions = [\n \"pdf\",\n \"xlsx\",\n \"xls\",\n \"xlsm\",\n \"csv\",\n \"jpg\",\n \"jpeg\",\n \"png\",\n \"tif\",\n \"tiff\",\n \"doc\",\n \"docx\",\n \"docm\",\n \"ppt\",\n \"pptm\",\n \"rtf\"\n];\n","import React from 'react';\nimport { StatusChip } from '../../../../UI/dataDisplay/status';\nimport { Typography } from '../../../../UI/dataDisplay/typography';\nimport './EditTransaction.css';\n\nconst EditTransactionHeaderItem = (props) => {\n const { label, value, statusChip } = props;\n return (\n <div className='transaction-sidesheet-header-item'>\n <Typography variant='caption'>{label}</Typography>\n {statusChip ? (\n <div className='transaction-sidesheet-header-item-status'>\n <StatusChip {...statusChip} />\n </div>\n ) : (\n <Typography variant='body1'>{value}</Typography>\n )}\n </div>\n );\n};\n\nexport default EditTransactionHeaderItem;\n","import React from 'react';\nimport {\n UdpTimelineItem,\n UdpTimelineConnector,\n UdpTimelineDot,\n UdpTimelineSeparator\n} from 'udp-react-stencil-component-library';\n\nexport const TransactionTimelineItem = (props) => {\n const {\n title,\n description,\n date,\n status,\n onClick\n } = props;\n\n return (\n <UdpTimelineItem\n dotShape='default'\n onItemClick={onClick}\n clickable\n statusLabel={status}\n >\n <UdpTimelineSeparator slot='separator'>\n <UdpTimelineConnector />\n <UdpTimelineDot color='primary' shape='default' size='medium'>\n </UdpTimelineDot>\n </UdpTimelineSeparator>\n <span slot='title'>{title}</span>\n <span slot='content'>{date}</span>\n <span slot='caption'>{description}</span>\n </UdpTimelineItem>\n );\n};\n","import React, { useEffect, useMemo } from 'react';\nimport { LinearProgress } from '@material-ui/core';\nimport { useAxiosMutate } from '../../../../../utilities/useAxiosMutate';\nimport { UdpTimeline } from '../../../../../UI/timeline/UdpTimeline';\nimport { EmptyStateDisplay } from '../../../../../UI';\nimport { useTranslation } from 'react-i18next';\nimport { TransactionTimelineItem } from './TransactionTimelineItem';\nimport { ConfigService } from '../../../../../configService';\nimport { formatDate } from '../../../../../UI/widgets/utils/dateUtils';\nimport { AmbientCard } from '../../../../../UI/surfaces/cards/AmbientCard';\n\nexport const TransactionTimeline = (props) => {\n const { transactionId } = props;\n const { t } = useTranslation();\n\n const searchObj = useMemo(() => {\n return {\n eagerLoad: true,\n pageNumber: 0,\n pageSize: 100,\n filterElements: [\n {\n searchField: 'transactionId',\n searchValue: transactionId,\n searchOperator: '='\n }\n ],\n orderElements: [\n {\n sortColumn: 'createdOn',\n sortDirection: 'desc'\n }\n ],\n getAll: true\n };\n }, [transactionId]);\n\n const [\n { data: transactionHistory, loading: isLoading },\n fetchTransactionHistory\n ] = useAxiosMutate(\n ConfigService.productV1ApiUrl,\n `UdpTransactionHistory/search`,\n {\n method: 'post',\n data: searchObj\n }\n );\n\n useEffect(() => {\n fetchTransactionHistory();\n }, [fetchTransactionHistory]);\n\n return (\n <div>\n {isLoading ? (\n <div>\n <LinearProgress />\n </div>\n ) : transactionHistory?.pageList?.length > 0 ? (\n <AmbientCard>\n <UdpTimeline>\n {transactionHistory?.pageList?.map((item, index) => (\n <TransactionTimelineItem\n key={index}\n title={\n item?.udpTransactionHistoryUdpTransactionTypeTransactionAction\n ?.name ??\n item?.udpTransactionHistoryUdpTransactionEventType?.name\n }\n description={\n item?.changedByName ? `By ${item?.changedByName}` : null\n }\n date={\n item?.createdOn\n ? formatDate(item?.createdOn, 'dd/mm/yyyy')\n : null\n }\n status={item?.udpTransactionHistoryUdpTransactionTypeStatus?.name}\n />\n ))}\n </UdpTimeline>\n </AmbientCard>\n ) : (\n <div>\n <EmptyStateDisplay primaryText={t('No History')} />\n </div>\n )}\n </div>\n );\n};\n\nexport default TransactionTimeline;\n","import React from 'react';\nimport { ConfigService, UdpAttachmentItem } from 'udp-react-stencil-component-library';\nimport { useAxiosGet } from '../../../../../utilities';\n\nexport const TransactionAttachment = (props) => {\n const { attachment, isLastItem } = props;\n\n const [{ data: attachmentWithDownloadLink, loading: isLoading }] =\n useAxiosGet(\n ConfigService.productV1ApiUrl,\n `UdpTransactionAttachment/${attachment?.transactionAttachmentId}/udpDriveFile/download`,\n {},\n !!!attachment?.transactionAttachmentId\n );\n\n return (\n <UdpAttachmentItem\n loading={isLoading}\n fileName={attachment?.fileName}\n fileSize={attachment?.fileSize}\n fileExtension={attachment?.extension}\n uploadedBy={attachment?.updatedByName}\n uploadedDate={attachment?.lastUpdated}\n isLastItem={isLastItem}\n downloadUrl={attachmentWithDownloadLink?.link}\n />\n );\n};\n","import React from 'react';\nimport { AmbientCard } from '../../../../../UI/surfaces/cards/AmbientCard';\nimport { EmptyStateDisplay } from '../../../../../UI';\nimport { useTranslation } from 'react-i18next';\nimport { TransactionAttachment } from './TransactionAttachment';\nimport { LinearProgress } from '@material-ui/core';\n\nexport const TransactionAttachments = (props) => {\n const { transactionAttachments, isLoading } = props;\n const { t } = useTranslation();\n\n return (\n <div>\n {isLoading ? (\n <LinearProgress />\n ) : transactionAttachments?.pageList?.length > 0 ? (\n <AmbientCard fullWidth>\n {transactionAttachments.pageList.map((attachment, index) => (\n <TransactionAttachment\n key={index}\n attachment={attachment}\n isLastItem={index === transactionAttachments.pageList.length - 1}\n />\n ))}\n </AmbientCard>\n ) : (\n <div>\n <EmptyStateDisplay primaryText={t('No Attachments')} />\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { AmbientCard } from '../../../../../UI/surfaces/cards/AmbientCard';\nimport { Typography } from '../../../../../UI/dataDisplay/typography';\nimport { StatusChip } from '../../../../../UI/dataDisplay/status';\nimport { makeStyles } from '@material-ui/core';\nimport { Adornment } from '../../../../../UI';\nimport { getLocalizedDateTimeString } from '../../../../../UI/widgets/utils/dateUtils';\nimport { ContactIcon } from '@fluentui/react-icons';\n\nconst useStyles = makeStyles((theme) => ({\n titleContainer: {\n display: 'flex',\n gap: '8px',\n justifyContent: 'space-between',\n alignItems: 'center'\n },\n chipContainer: {\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n marginTop: theme.spacing(1)\n },\n card: {\n width: '100%',\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: 'rgba(0, 0, 0, 0.04)'\n },\n padding: '8px 12px',\n border: '1px solid rgba(0, 0, 0, 0.08)'\n },\n captionText: {\n color: theme.palette.text.hint\n }\n}));\n\nexport const TransactionNote = (props) => {\n const { onClick, note } = props;\n const classes = useStyles();\n\n return (\n <div>\n <AmbientCard\n fullWidth\n adornment='info'\n noAdornment={false}\n customAdornment={<Adornment color={'info'} />}\n removeTopLayoutUnit\n removePadding\n lastChildBottomPadding={'0px'}\n cardContentHeight={'100%'}\n >\n <div className={classes.card} onClick={onClick}>\n <div className={classes.titleContainer}>\n <Typography variant='h6'>\n {note?.subject ?? 'Transaction Note'}\n </Typography>\n <Typography variant='caption' className={classes.captionText}>\n {getLocalizedDateTimeString(note?.createdOn)}\n </Typography>\n </div>\n <Typography variant='body1'>\n {note?.content ??\n 'This is a placeholder for the transaction note component.'}\n </Typography>\n\n <div className={classes.chipContainer}>\n <StatusChip\n label={note?.userDisplayName}\n color='default'\n variant='outline'\n icon={<ContactIcon />}\n />\n </div>\n </div>\n </AmbientCard>\n </div>\n );\n};\n","import React, { forwardRef, useCallback, useState } from 'react';\nimport { LinearProgress } from '../../../../../UI';\nimport { Form, Field } from '../../../../../utilities/form';\nimport { FluentTextField } from '../../../../../UI/inputs/textField/FluentTextField';\nimport { FluentTextFieldAutoComplete } from '../../../../../UI/inputs/textField/FluentTextFieldAutoComplete';\nimport { Typography } from '../../../../../UI/dataDisplay/typography';\nimport { apiMutate } from '../../../../../utilities/useAxiosMutate';\nimport { ConfigService } from '../../../../../configService';\nimport { useAuthedUser } from '../../../../../utilities/auth';\nimport { useHandleAxiosSnackbar } from '../../../../../utilities';\nimport { useTranslation } from 'react-i18next';\nimport { makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles((theme) => ({\n loading: {\n marginBottom: theme.spacing(1)\n }\n}));\n\nconst TransactionNoteFormComponent = (props, ref) => {\n const {\n initialValues,\n viewOnly,\n businessObjectKey,\n closeSideSheet,\n noteTypes,\n fetchNoteTypesLoading\n } = props;\n const [isLoading, setIsLoading] = useState(false);\n const user = useAuthedUser();\n const { handleSuccessSnackbar, handleErrorSnackbar } =\n useHandleAxiosSnackbar();\n const { t } = useTranslation();\n const classes = useStyles();\n\n // TODO: create a new api to include both\n const addTransactionNote = useCallback(\n async (data) =>\n apiMutate(\n ConfigService.productV1ApiUrl,\n `UdpNote`,\n {\n method: 'post'\n },\n data\n ),\n []\n );\n\n const addNoteFiledFor = useCallback(\n async (data) =>\n apiMutate(\n ConfigService.productV1ApiUrl,\n `UdpNoteFiledFor`,\n {\n method: 'post'\n },\n data\n ),\n []\n );\n\n const handleSubmitForm = useCallback(\n async (values) => {\n setIsLoading(true);\n const formattedValues = {\n typeCode: values?.noteType?.code,\n subject: values?.subject,\n content: values?.content,\n unityUserID: user?.id,\n userDisplayName: user?.name ?? ''\n };\n\n await addTransactionNote({\n data: formattedValues\n })\n .then(async (res) => {\n console.log('Transaction Note response: ', { res });\n if (res?.data?.id) {\n await addNoteFiledFor({\n data: {\n entityBusinessKey: businessObjectKey,\n noteId: res?.data?.id\n }\n }).then(() => {\n handleSuccessSnackbar(\n t('Transaction note has been added successfully.')\n );\n if (closeSideSheet) {\n closeSideSheet();\n }\n });\n }\n })\n .catch((res) => {\n handleErrorSnackbar(res, t('Unable to add transaction note.'));\n });\n setIsLoading(false);\n },\n [\n addNoteFiledFor,\n addTransactionNote,\n businessObjectKey,\n handleErrorSnackbar,\n handleSuccessSnackbar,\n t,\n user,\n closeSideSheet\n ]\n );\n\n return (\n <div>\n {fetchNoteTypesLoading ? (\n <div>\n <LinearProgress />\n </div>\n ) : (\n <div>\n {isLoading && (\n <div className={classes.loading}>\n <LinearProgress />\n </div>\n )}\n <Form\n ref={ref}\n onSubmit={handleSubmitForm}\n initialValues={initialValues}\n id={`transactionNoteForm-${businessObjectKey}`}\n render={({ submitting }) => (\n <>\n <Field\n component={FluentTextFieldAutoComplete}\n id='noteType'\n name='noteType'\n optionKey='name'\n disableClearable\n label={t('Type')}\n options={noteTypes ?? []}\n disabled={viewOnly || submitting}\n onChange={() => {}}\n required\n />\n\n <Field\n component={FluentTextField}\n id='subject'\n name='subject'\n label={t('Subject')}\n disabled={viewOnly || submitting}\n onChange={() => {}}\n required\n />\n <Field\n component={FluentTextField}\n id='content'\n name='content'\n label={t('Details')}\n onChange={() => {}}\n multiline\n rows={5}\n maxRows={10}\n disabled={viewOnly || submitting}\n required\n />\n {viewOnly && (\n <Typography variant='caption'>\n {t(\n 'Viewing note details. Use the Add Note action to create a new entry.'\n )}\n </Typography>\n )}\n </>\n )}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport const TransactionNoteForm = forwardRef(TransactionNoteFormComponent);\n","import React, { useCallback, useState, useMemo, useEffect } from 'react';\nimport { ConfigService } from '../../../../../configService';\nimport {\n EmptyStateDisplay,\n LinearProgress,\n SideSheet\n} from '../../../../../UI';\nimport { TransactionNote } from './TransactionNote';\nimport { useTranslation } from 'react-i18next';\nimport { makeStyles } from '@material-ui/core';\nimport {\n apiMutate,\n useAxiosMutate\n} from '../../../../../utilities/useAxiosMutate';\nimport { TransactionNoteForm } from './TransactionNoteForm';\n\nconst useStyles = makeStyles((theme) => ({\n notes: {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1)\n }\n}));\n\nexport const TransactionNotes = (props) => {\n const {\n businessObjectKey,\n refreshNotes,\n setRefreshNotes,\n noteTypes,\n fetchNoteTypesLoading\n } = props;\n const [openSideSheet, setOpenSideSheet] = useState(false);\n const [selectedNote, setSelectedNote] = useState(null);\n const [noteList, setNoteList] = useState([]);\n const classes = useStyles();\n const { t } = useTranslation();\n const [isLoading, setIsLoading] = useState(false);\n\n const noteFileForSearchObj = useMemo(() => {\n return {\n eagerLoad: true,\n pageNumber: 0,\n pageSize: 100,\n filterElements: [\n {\n searchField: 'entityBusinessKey',\n searchValue: businessObjectKey,\n searchOperator: '='\n }\n ],\n getAll: true\n };\n }, [businessObjectKey]);\n\n const [\n { data: noteFiledFor, loading: fetchNoteFiledForLoading },\n fetchNoteFiledFor\n ] = useAxiosMutate(ConfigService.productV1ApiUrl, `UdpNoteFiledFor/search`, {\n method: 'post',\n data: noteFileForSearchObj\n });\n\n const handleViewNote = useCallback((note) => {\n setSelectedNote(note);\n setOpenSideSheet(true);\n }, []);\n\n const handleCloseSideSheet = useCallback(() => {\n setOpenSideSheet(false);\n setSelectedNote(null);\n }, []);\n\n useEffect(() => {\n fetchNoteFiledFor();\n }, [fetchNoteFiledFor]);\n\n useEffect(() => {\n if (refreshNotes) {\n fetchNoteFiledFor();\n // eslint-disable-next-line react-you-might-not-need-an-effect/no-pass-data-to-parent\n setRefreshNotes(false);\n }\n }, [fetchNoteFiledFor, refreshNotes, setRefreshNotes]);\n\n useEffect(() => {\n if (!fetchNoteFiledForLoading && noteFiledFor?.pageList?.length > 0) {\n // eslint-disable-next-line react-you-might-not-need-an-effect/no-pass-data-to-parent\n const noteIds = noteFiledFor?.pageList\n ?.map((obj) => obj?.noteID)\n .join(',');\n\n const searchObj = {\n eagerLoad: true,\n pageNumber: 0,\n pageSize: 100,\n filterElements: [\n {\n searchField: 'iD',\n searchValue: noteIds,\n searchOperator: 'IN'\n }\n ],\n getAll: true\n };\n\n setIsLoading(true);\n apiMutate(\n ConfigService.productV1ApiUrl,\n `UdpNote/search`,\n {\n method: 'post',\n data: searchObj\n },\n {}\n )\n .then((resp) => {\n if (resp && resp.data) {\n setNoteList(resp.data?.pageList);\n } else {\n setNoteList([]);\n }\n })\n .finally(() => {\n setIsLoading(false);\n });\n } else {\n setNoteList([]);\n }\n }, [fetchNoteFiledForLoading, noteFiledFor, setIsLoading]);\n\n return (\n <div>\n <div className={classes.notes}>\n {isLoading || fetchNoteFiledForLoading ? (\n <div>\n <LinearProgress />\n </div>\n ) : noteList?.length > 0 ? (\n noteList.map((note, index) => (\n <TransactionNote\n key={index}\n note={note}\n onClick={() => handleViewNote(note)}\n />\n ))\n ) : (\n <div>\n <EmptyStateDisplay primaryText='No Notes' />\n </div>\n )}\n </div>\n\n <SideSheet\n title={t('View Note')}\n width={600}\n open={openSideSheet}\n onClose={handleCloseSideSheet}\n >\n <div>\n <TransactionNoteForm\n initialValues={selectedNote}\n businessObjectKey={businessObjectKey}\n viewOnly\n noteTypes={noteTypes}\n fetchNoteTypeLoading={fetchNoteTypesLoading}\n />\n </div>\n </SideSheet>\n </div>\n );\n};\n","export enum TRANSACTION_TAB {\n DETAILS = 0,\n HISTORY,\n ATTACHMENTS,\n NOTES\n}\n","import React from 'react';\nimport { FluentButton } from '../../../../UI/inputs/buttons';\nimport { useTranslation } from 'react-i18next';\nimport './EditTransactionDetailsFooterItem.css';\nimport { useTransactionEngine } from '../../../../utilities/transactions/useTransactionEngine';\n\nconst EditTransactionDetailsFooterItem = (props) => {\n const {\n transactionTypeId,\n transactionIsClosed,\n handleOnCancel,\n handleOnSaveChanges\n } = props;\n const { hasRevisions } = useTransactionEngine(transactionTypeId);\n const { t } = useTranslation();\n return (\n <div className='transaction-details-footer-item'>\n <FluentButton color='primary' onClick={handleOnCancel}>\n {t('Cancel')}\n </FluentButton>\n {!transactionIsClosed && (\n <FluentButton\n variant='contained'\n color='primary'\n onClick={handleOnSaveChanges}\n >\n {t('Save Changes')}\n </FluentButton>\n )}\n </div>\n );\n};\n\nexport default EditTransactionDetailsFooterItem;\n","import React from 'react';\nimport { Field } from '../../../../utilities/form';\nimport {\n AmbientAutoComplete,\n AmbientTextField,\n} from '../../../../UI/inputs/textField';\nimport { FormControlLabel, Switch } from '@material-ui/core';\nimport { useTranslation } from 'react-i18next';\nimport { useTransactionEngine } from '../../../../utilities/transactions/useTransactionEngine';\n\n\nconst EditTransactionDetailsFormFields = (props) => {\n const { transaction, fieldAttributes } = props;\n const { t } = useTranslation();\n\n const { getHiddenFields, getRequiredFields } = useTransactionEngine(\n transaction.transactionTypeId\n );\n\n const fieldComponentMap = {\n string: AmbientTextField,\n datetime: AmbientTextField,\n number: AmbientTextField,\n bool: Switch,\n array: AmbientAutoComplete\n };\n\n const getEntityName = (optionValuesArr, entityId) => {\n const matchingEntity = optionValuesArr?.find(\n (entity) => entity.id == entityId\n );\n return matchingEntity?.name;\n };\n\n const numberDataTypes = ['int', 'short', 'long'];\n\n const removeTimeFormatDate = (date) => {\n const parsedDate = new Date(date);\n if (parsedDate.getTime()) {\n const year = parsedDate.getFullYear();\n //Month is zero based 0 = Jan so need to add 1\n const month = parsedDate.getMonth() + 1;\n const day = parsedDate.getDate().toString().padStart(2, '0');\n return `${year}-${month.toString().padStart(2, '0')}-${day}`;\n }\n return parsedDate;\n };\n\n const dataTypeComponentMap = (transaction, attribute) => {\n const fieldName = attribute.name;\n let fieldDataType = attribute.type.toLowerCase();\n fieldDataType = numberDataTypes.includes(fieldDataType) ? \"number\" : fieldDataType\n const isAsscoiationLabel = attribute.associationLabel;\n let fieldComponentProps = null;\n switch (fieldDataType) {\n case 'number':\n fieldComponentProps = {\n initialValue: transaction.entityBusinessObject[fieldName],\n type: 'number',\n InputProps: { inputProps: { min: 0 } }\n };\n break;\n case 'datetime':\n fieldComponentProps = {\n initialValue: removeTimeFormatDate(transaction.entityBusinessObject[fieldName]),\n type: \"date\"\n };\n break;\n case 'array':\n fieldComponentProps = {\n options: attribute?.options?.map((option) => option.id),\n getOptionLabelFunction: (option) =>\n getEntityName(attribute?.options, option) || option,\n initialValue: transaction.entityBusinessObject[fieldName]\n };\n\n break;\n case 'bool':\n fieldComponentProps = {\n type: 'checkbox',\n initialValue: false\n };\n break;\n default:\n fieldComponentProps = {\n initialValue: transaction.entityBusinessObject[fieldName]\n };\n }\n const formLabel = isAsscoiationLabel ? fieldName + ' Name' : fieldName;\n const isRequired = getRequiredFields(transaction).includes(fieldName) || attribute.required;\n const isHidden = getHiddenFields(transaction).includes(fieldName) || attribute.isPrimaryKey || !attribute.extendedProperties.defaultVisible\n\n let fieldComponent = (\n <Field\n component={fieldComponentMap[fieldDataType] ?? AmbientTextField}\n label={t(formLabel)}\n name={fieldName}\n fullWidth\n variant='outlined'\n margin='normal'\n disabled={attribute.isReadOnly}\n required={isRequired && fieldDataType != 'bool'}\n {...fieldComponentProps}\n />\n );\n return (\n <>\n { !isHidden &&\n (fieldDataType == 'bool' ? (\n <FormControlLabel control={fieldComponent} label={formLabel} />\n ) : (\n fieldComponent\n ))\n }\n </>\n );\n };\n\n return (\n <>\n {fieldAttributes.map((attribute) => {\n return <>{dataTypeComponentMap(transaction, attribute)}</>;\n })}\n </>\n );\n};\n\nexport default EditTransactionDetailsFormFields;\n","import React, { useEffect, useState, useCallback, useMemo } from 'react';\nimport { apiMutate, useAxiosGet, useAxiosMutate } from '../../../../utilities';\nimport { getSanitizedName } from '../../../../utilities/entities/entityUtilities';\nimport { Form } from '../../../../utilities/form';\nimport { CardinalityTypeEnums } from '../../../../enums';\nimport DetailsFormFields from './EditTransactionDetailsFormFields';\nimport { AmbientCard } from '../../../../UI/surfaces/cards/AmbientCard';\nimport { LinearProgress } from '@material-ui/core';\nimport { useHandleAxiosSnackbar } from '../../../../utilities/apiHelpers';\nimport { useTranslation } from 'react-i18next';\nimport { ConfigService } from '../../../../configService';\nimport { useCatalogStore } from '../../../../../src/stores/catalogStore';\n\nconst EditTransactionDetailsForm = (props) => {\n const { transaction, formRef } = props;\n const [entityAttributes, setEntityAttributes] = useState(null);\n\n const fullyQualifiedName = transaction.entityBusinessKey?.split('|')[0];\n\n const { handleErrorSnackbar, handleSuccessSnackbar } =\n useHandleAxiosSnackbar();\n const { t } = useTranslation();\n\n const { currentApiCatalogId, catalogsMap } = useCatalogStore();\n\n const catalogObjectList = useMemo(() => {\n if (\n catalogsMap &&\n currentApiCatalogId &&\n catalogsMap[currentApiCatalogId]\n ) {\n return catalogsMap[currentApiCatalogId]?.ctlg?.catalogObjectList;\n }\n }, [catalogsMap, currentApiCatalogId]);\n\n const [{ data: udpObjectInfo }, fetchUdpObjectInfo] = useAxiosMutate(\n ConfigService.productV1ApiUrl,\n `UdpObjectInfo/search`,\n {\n method: 'post',\n data: {\n eagerLoad: true,\n pageNumber: 1,\n pageSize: 50,\n filterElements: [\n {\n searchField: 'sanitizedName',\n searchOperator: '=',\n searchValue: getSanitizedName(fullyQualifiedName)\n }\n ]\n }\n }\n );\n\n const updateFieldInfo = (\n tableEntries,\n catalogObjectFieldInfo,\n fkFieldInfo,\n fkDomainName\n ) => {\n let updatedFields = {\n type: 'array',\n options: tableEntries,\n domainName: fkDomainName\n };\n const updatedFieldInfo = { ...fkFieldInfo, ...updatedFields };\n const index = catalogObjectFieldInfo.findIndex(\n (f) => f.name.toLowerCase() === fkFieldInfo.name.toLowerCase()\n );\n if (index != -1) {\n catalogObjectFieldInfo[index] = updatedFieldInfo;\n }\n };\n\n const mergeCatalogObjectInfoFieldInfo = useCallback(\n (entityCatalogObjectInfo, filteredEntityFieldInfo) => {\n let catalogObjectFieldInfoCombo = entityCatalogObjectInfo.map(\n (entityCatalogObject) => {\n let matchingEntityFieldInfo = filteredEntityFieldInfo.find(\n (fieldInfo) => {\n let formattedFieldName =\n fieldInfo.name.slice(0, 1).toLowerCase() +\n fieldInfo.name.slice(1);\n if (fieldInfo.name == 'ID') {\n formattedFieldName = formattedFieldName.toLowerCase();\n }\n\n return formattedFieldName == entityCatalogObject.name;\n }\n );\n if (matchingEntityFieldInfo) {\n let additional_fields = {\n hidden:\n matchingEntityFieldInfo.properties.maintainenceConfig.hidden,\n associationLabel:\n matchingEntityFieldInfo.properties.maintainenceConfig\n .associationLabel,\n isPrimaryKey: matchingEntityFieldInfo.isPrimaryKey\n };\n return {\n ...entityCatalogObject,\n ...additional_fields\n };\n } else {\n return entityCatalogObject;\n }\n }\n );\n\n return catalogObjectFieldInfoCombo;\n },\n []\n );\n\n const filterOutManyToManyRelationships = (CatalogObjectInfo) => {\n let entityCatalogObjectInfo = CatalogObjectInfo.filter((catalogObject) => {\n const cardinality =\n catalogObject.extendedProperties?.childEntityAssoc?.Cardinality;\n if (cardinality != undefined) {\n return (\n cardinality != CardinalityTypeEnums.Many_To_Many &&\n cardinality != CardinalityTypeEnums.One_To_One &&\n catalogObject.name.toLowerCase() != 'businessobjectkey'\n );\n } else {\n return catalogObject.name.toLowerCase() != 'businessobjectkey';\n }\n });\n return entityCatalogObjectInfo;\n };\n\n const updateFkFields = useCallback(\n async (entityCatalogObjectInfo, catalogObjectInfo) => {\n const childEntityAssociation =\n catalogObjectInfo.extendedProperties.childEntityAssoc;\n const cardinality = childEntityAssociation.Cardinality;\n if (cardinality != undefined) {\n const foreignKeyAssociationFields =\n childEntityAssociation.Keys[0].split(',');\n let fieldsInAssociationToIgnore = [\n 'id',\n 'businessobjectkey',\n 'entitybusinesskey'\n ];\n return Promise.all(\n foreignKeyAssociationFields.map(async (fkFieldName) => {\n if (\n fkFieldName.toLowerCase() != 'id' &&\n !fieldsInAssociationToIgnore.includes(fkFieldName.toLowerCase())\n ) {\n let fkFieldInfo = entityCatalogObjectInfo.find(\n (field) => field.name.toLowerCase() == fkFieldName.toLowerCase()\n );\n const fkDomainName = getSanitizedName(\n childEntityAssociation.TargetType\n );\n try {\n const getTableEntriesResp = await apiMutate(\n ConfigService.productV1ApiUrl,\n `${fkDomainName}`,\n { method: 'get' }\n );\n\n if (getTableEntriesResp.data.length > 0 && fkFieldInfo) {\n updateFieldInfo(\n getTableEntriesResp.data,\n entityCatalogObjectInfo,\n fkFieldInfo,\n fkDomainName\n );\n }\n } catch (error) {\n handleErrorSnackbar(\n new Error(\n t(`Error finiding field information! Please try again.`)\n )\n );\n }\n }\n })\n );\n }\n },\n [handleErrorSnackbar, t]\n );\n\n const filterAdjustEntityAttributes = useCallback(\n async (catalogObjectInfo) => {\n let entityCatalogObjectInfo = catalogObjectInfo;\n\n entityCatalogObjectInfo = filterOutManyToManyRelationships(\n entityCatalogObjectInfo\n );\n\n const entityObjectInfoResponse = await fetchUdpObjectInfo();\n const entityObjectInfo = entityObjectInfoResponse.data.pageList[0];\n let filteredEntityFieldInfo = entityObjectInfo.objectFieldInfo.filter(\n (fieldInfo) => fieldInfo.properties.isDefaultVisible\n );\n\n await Promise.all(\n entityCatalogObjectInfo.map((catalogObjectInfo) => {\n return updateFkFields(entityCatalogObjectInfo, catalogObjectInfo);\n })\n );\n\n entityCatalogObjectInfo = entityCatalogObjectInfo.filter(\n (catalogObject) => !catalogObject.extendedProperties.childEntity\n );\n\n let mergedFieldInfo = mergeCatalogObjectInfoFieldInfo(\n entityCatalogObjectInfo,\n filteredEntityFieldInfo\n );\n return mergedFieldInfo;\n },\n [fetchUdpObjectInfo, mergeCatalogObjectInfoFieldInfo, updateFkFields]\n );\n\n useEffect(() => {\n if (catalogObjectList) {\n let domainName = transaction.entityBusinessKey\n .split('|')[0]\n .split('.')\n .pop();\n let domainCatalogObject = catalogObjectList?.find(\n (catalogObject) =>\n getSanitizedName(catalogObject.catalogObjectName) == domainName\n );\n if (domainCatalogObject) {\n filterAdjustEntityAttributes(domainCatalogObject.properties).then(\n (filteredResp) => {\n setEntityAttributes(filteredResp);\n }\n );\n }\n }\n }, [filterAdjustEntityAttributes, catalogObjectList, transaction]);\n\n const executeSaveChanges = useCallback(\n async (data) =>\n apiMutate(\n ConfigService.productV1ApiUrl,\n `udpTransaction/${transaction?.transactionId}/saveChanges`,\n {\n method: 'put'\n },\n data\n ),\n [transaction.transactionId]\n );\n\n const onSubmit = useCallback(\n async (values) => {\n const saveChangesResponse = await executeSaveChanges({ data: values });\n if (saveChangesResponse?.status === 200) {\n handleSuccessSnackbar(t('Transaction has been saved successfully'));\n } else {\n handleErrorSnackbar(\n new Error(t(`Error saving Transaction. Please try again later.`))\n );\n }\n },\n [executeSaveChanges, handleSuccessSnackbar, handleErrorSnackbar, t]\n );\n\n const fieldAttributes = useMemo(() => {\n if (!entityAttributes) {\n return [];\n }\n return entityAttributes;\n }, [entityAttributes]);\n\n return fieldAttributes.length == 0 ? (\n <LinearProgress />\n ) : (\n <AmbientCard>\n <Form onSubmit={onSubmit} ref={formRef}>\n <DetailsFormFields\n transaction={transaction}\n fieldAttributes={fieldAttributes}\n />\n </Form>\n </AmbientCard>\n );\n};\n\nexport default EditTransactionDetailsForm;\n","import React, {\n useState,\n useRef,\n useCallback,\n useMemo,\n useEffect\n} from 'react';\n\nimport { Divider, SideSheet, UdpTabPanel } from '../../../../UI';\nimport { UdpTabs } from '../../../../UI/navigation/tabs/UdpTabs';\nimport { useTranslation } from 'react-i18next';\nimport {\n allowedExtensions,\n MAX_FILE_SIZE_MB\n} from '../../../../uploader/utils/allowedFileProperties';\n\nimport './EditTransaction.css';\nimport EditTransactionHeaderItem from './EditTransactionHeaderItem';\nimport { FluentButton } from '../../../../UI/inputs/buttons';\nimport WorkflowActions from './WorkflowActions';\nimport { TransactionTimeline } from '../components/transactionHistory/TransactionTimeline';\nimport { TransactionAttachments } from '../components/transactionAttachment/TransactionAttachments';\nimport { TransactionNotes } from '../components/transactionNote/TransactionNotes';\nimport { TRANSACTION_TAB } from './enum';\nimport { TransactionUiActionTypeEnums } from '../../../../enums';\nimport UdpTransactionCustomPage from '../components/UdpTransactionCustomPage';\nimport EditTransactionDetailsFooterItem from '../components/EditTransactionDetailsFooterItem';\nimport { ConfigService } from '../../../../configService';\nimport { useTransactionEngine } from '../../../../utilities/transactions/useTransactionEngine';\nimport EditTransactionDetailsForm from '../components/EditTransactionDetailsForm';\nimport { Attachments } from '../../../../uploader';\nimport { apiMutate, useAxiosGet, useAxiosMutate } from '../../../../utilities';\nimport { useSnackbar } from 'notistack';\nimport { TransactionNoteForm } from '../components/transactionNote/TransactionNoteForm';\nimport { FluentIcon } from '../../../../utilities/iconLibrary';\nimport { AddIcon } from '@fluentui/react-icons';\n\nconst EditTransaction = (props) => {\n const {\n transaction: initialTransaction,\n transactionTypeId,\n transactionIsClosed,\n openInnerSidesheetState,\n setOpenInnerSidesheetState,\n refreshGridData,\n closeSideSheet,\n setSidesheetLoading,\n setHasUnsavedChanges\n } = props;\n const { t } = useTranslation();\n\n const [selectedTab, setSelectedTab] = useState(0);\n const [transaction, setTransaction] = useState(initialTransaction);\n const [transactionAttachments, setTransactionAttachments] = useState([]);\n const [filePreview, setFilePreview] = useState(false);\n const [currentAttachments, setCurrentAttachments] = useState([]);\n const [attachmentType, setAttachmentType] = useState(null);\n const [attachmentProgress, setAttachmentProgress] = useState(false);\n const [refreshNotes, setRefreshNotes] = useState(false);\n\n const [{ data: noteTypes, loading: fetchNoteTypesLoading }] = useAxiosGet(\n ConfigService.productV1ApiUrl,\n `UdpNoteType`,\n {}\n );\n\n const { getUiActionRenderPageId, transactionTypeStatusColorsMap } =\n useTransactionEngine(transactionTypeId);\n\n const refetchTransaction = useCallback(async () => {\n setSidesheetLoading(true);\n const response = await apiMutate(\n ConfigService.productV1ApiUrl,\n `udpTransaction/${initialTransaction.transactionId}/full`,\n {\n method: 'get'\n }\n );\n if (response?.status === 200) {\n setTransaction(response.data);\n }\n setSidesheetLoading(false);\n }, [initialTransaction.transactionId, setSidesheetLoading]);\n\n const formRef = useRef(null);\n const transactionNoteFormRef = useRef(null);\n\n const handleNoteFormSubmit = useCallback(() => {\n transactionNoteFormRef.current?.handleSubmit?.();\n }, []);\n\n const handleNoteFormReset = useCallback(() => {\n transactionNoteFormRef.current?.form?.reset?.();\n }, []);\n\n const handleSaveChanges = useCallback(async () => {\n setSidesheetLoading(true);\n await formRef.current?.form?.submit();\n setSidesheetLoading(false);\n refreshGridData();\n }, [refreshGridData, setSidesheetLoading, formRef]);\n\n const [\n {\n data: transactionAttachmentsData,\n loading: fetchTransactionAttachmentsLoading\n },\n fetchTransactionAttachments\n ] = useAxiosMutate(\n ConfigService.productV1ApiUrl,\n `UdpTransactionAttachment/search`,\n {\n method: 'post',\n data: {\n pageSize: 50,\n filterElements: [\n {\n searchField: 'TransactionId',\n searchValue: transaction.transactionId,\n searchOperator: '='\n },\n {\n searchField: 'IsDeleted',\n searchValue: 0,\n searchOperator: '='\n }\n ]\n }\n }\n );\n\n const [{ data: transactionAttachmentTypes }, fetchTransactionAttachmentType] =\n useAxiosMutate(\n process.env.REACT_APP_PRODUCT_API_BASE,\n `UdpTransactionAttachmentType/search`,\n {\n method: 'post',\n data: {\n pageSize: 50,\n filterElements: [\n {\n searchField: 'TransactionTypeId',\n searchValue: transaction.transactionTypeId,\n searchOperator: '='\n }\n ]\n }\n }\n );\n\n const { enqueueSnackbar } = useSnackbar();\n\n const getAttachments = useCallback(async () => {\n try {\n const response = await fetchTransactionAttachments();\n setTransactionAttachments(response.data.pageList);\n refetchTransaction();\n } catch (error) {\n console.error('Failed to fetch attachments:', error);\n if (error?.message !== 'canceled') {\n enqueueSnackbar(\n 'Attachment fetch failed: We encountered a system error. Please try again or contact support if the issue persists.',\n {\n variant: 'error',\n anchorOrigin: { vertical: 'top', horizontal: 'center' }\n }\n );\n }\n }\n }, [fetchTransactionAttachments, enqueueSnackbar, refetchTransaction]);\n\n const tabNames = [t('Details'), t('History'), t('Attachments'), t('Notes')];\n\n const headerItemInfo = useMemo(() => {\n const items = [\n {\n label: 'Status',\n statusChip: {\n label: transaction.udpTransactionUdpTransactionTypeStatus?.name,\n status:\n transactionTypeStatusColorsMap[\n transaction.udpTransactionUdpTransactionTypeStatus?.name\n ] || 'default'\n }\n }\n ];\n if (transaction?.currentRevisionNo) {\n items.push({\n label: 'Revision',\n value: `${transaction.currentRevisionNo}`\n });\n }\n return items;\n }, [transaction, transactionTypeStatusColorsMap]);\n\n const handleUploadFiles = useCallback(async () => {\n if (!currentAttachments.length) {\n throw new Error('No files added for upload');\n }\n const formData = new FormData();\n currentAttachments.forEach((file) => formData.append('files', file));\n formData.append(\n 'attachmentTypeId',\n attachmentType.transactionAttachmentTypeId\n );\n\n try {\n setAttachmentProgress(true);\n await apiMutate(\n ConfigService.productV1ApiUrl,\n `UdpTransactionAttachment/transaction/${transaction.transactionId}/upload`,\n {\n method: 'post',\n headers: {\n transactionId: transaction.transactionId,\n attachmentTypeId: attachmentType.transactionAttachmentTypeId\n },\n data: formData\n }\n );\n\n await getAttachments();\n setCurrentAttachments([]);\n setOpenInnerSidesheetState({ attachments: false });\n\n enqueueSnackbar('Files uploaded successfully', {\n variant: 'success',\n anchorOrigin: {\n vertical: 'top',\n horizontal: 'center'\n }\n });\n } catch (error) {\n enqueueSnackbar(\n `File upload failed: We encountered a system error. Please try again or contact support if the issue persists.`,\n {\n variant: 'error',\n anchorOrigin: {\n vertical: 'top',\n horizontal: 'center'\n }\n }\n );\n throw error;\n } finally {\n setAttachmentProgress(false);\n }\n }, [\n attachmentType,\n currentAttachments,\n enqueueSnackbar,\n getAttachments,\n setOpenInnerSidesheetState,\n transaction.transactionId\n ]);\n\n const innerSidesheetList = useMemo(\n () => [\n {\n open: openInnerSidesheetState.workflowAction,\n closeSheet: () =>\n setOpenInnerSidesheetState({ workflowActions: false }),\n title: 'Available Workflow Actions',\n children: (\n <WorkflowActions\n transaction={transaction}\n closeSideSheet={() => {\n setOpenInnerSidesheetState({\n workflowActions: false\n });\n refetchTransaction();\n }}\n refreshGridData={refreshGridData}\n />\n )\n },\n {\n open: openInnerSidesheetState.attachments,\n closeSheet: () => setOpenInnerSidesheetState({ attachments: false }),\n title: 'Add Attachment',\n buttonLabel: 'Save',\n buttonOneDisabled: !attachmentType || currentAttachments.length <= 0,\n onSubmit: () => {\n handleUploadFiles()\n .then(() => refreshGridData())\n .catch((error) => console.error(error));\n },\n children: (\n <Attachments\n attachmentTypes={transactionAttachmentTypes}\n attachmentType={attachmentType}\n setAttachmentType={setAttachmentType}\n attachmentProgress={attachmentProgress}\n setAttachmentProgress={setAttachmentProgress}\n currentAttachments={currentAttachments}\n setCurrentAttachments={setCurrentAttachments}\n transaction={transaction}\n previousAttachments={transactionAttachments}\n setPreviousAttachments={setTransactionAttachments}\n MAX_FILE_SIZE_MB={MAX_FILE_SIZE_MB}\n allowedExtensions={allowedExtensions}\n filePreview={filePreview}\n setFilePreview={setFilePreview}\n />\n )\n },\n {\n open: openInnerSidesheetState.notes,\n closeSheet: () => setOpenInnerSidesheetState({ notes: false }),\n title: 'Add Note',\n buttonLabel: 'Save note',\n buttonTwoLabel: 'Clear',\n buttonTwoAction: handleNoteFormReset,\n onSubmit: handleNoteFormSubmit,\n children: (\n <TransactionNoteForm\n ref={transactionNoteFormRef}\n businessObjectKey={transaction?.businessObjectKey}\n closeSideSheet={() => {\n setOpenInnerSidesheetState({ notes: false });\n setRefreshNotes(true);\n }}\n noteTypes={noteTypes}\n fetchNoteTypesLoading={fetchNoteTypesLoading}\n />\n )\n }\n ],\n [\n openInnerSidesheetState.workflowAction,\n openInnerSidesheetState.attachments,\n openInnerSidesheetState.notes,\n transaction,\n refreshGridData,\n attachmentType,\n currentAttachments,\n transactionAttachmentTypes,\n attachmentProgress,\n transactionAttachments,\n filePreview,\n handleNoteFormReset,\n handleNoteFormSubmit,\n noteTypes,\n fetchNoteTypesLoading,\n setOpenInnerSidesheetState,\n refetchTransaction,\n handleUploadFiles\n ]\n );\n\n const transactionDetailPageId = useMemo(() => {\n return getUiActionRenderPageId(\n TransactionUiActionTypeEnums.Render_Transaction_Details_Page\n );\n }, [getUiActionRenderPageId]);\n\n useEffect(() => {\n (async () => {\n if (!transactionAttachmentsData) {\n getAttachments();\n }\n })();\n }, [transactionAttachmentsData, getAttachments]);\n\n useEffect(() => {\n if (!transactionAttachmentTypes) {\n setAttachmentProgress(true);\n fetchTransactionAttachmentType().then(() => {\n setAttachmentProgress(false);\n });\n }\n }, [fetchTransactionAttachmentType, transactionAttachmentTypes]);\n\n return (\n <>\n <div className='edit-transaction-sidesheet'>\n <div className={`edit-transaction-sidesheet-header 'is-sticky'`}>\n <div className='edit-transaction-sidesheet-header-title'></div>\n <div className='edit-transaction-sidesheet-header-content'>\n <div className='edit-transaction-sidesheet-header-items'>\n {headerItemInfo.map((headerItem) => {\n return (\n <EditTransactionHeaderItem\n key={headerItem.label}\n label={headerItem.label}\n statusChip={headerItem.statusChip}\n value={headerItem.value}\n />\n );\n })}\n </div>\n <div className='edit-transaction-sidesheet-header-buttons'>\n <FluentButton\n color='primary'\n onClick={() => {\n setOpenInnerSidesheetState({ attachments: true });\n }}\n >\n <FluentIcon\n component={AddIcon}\n className='edit-transaction-header-button-icon'\n size='small'\n />\n {'Attachment'}\n </FluentButton>\n <FluentButton\n color='primary'\n onClick={() => {\n setOpenInnerSidesheetState({ notes: true });\n }}\n >\n <FluentIcon\n component={AddIcon}\n className='edit-transaction-header-button-icon'\n size='small'\n />\n {'Note'}\n </FluentButton>\n </div>\n <div className='divider'>\n <Divider />\n </div>\n <div className='edit-transaction-sidesheet-tabs'>\n <UdpTabs\n value={selectedTab}\n onChange={(value, tabIndex) => {\n setSelectedTab(tabIndex);\n }}\n tabList={tabNames.map((tabName) => ({ label: tabName }))}\n buttonWidth={'100%'}\n />\n </div>\n </div>\n <div className='divider'>\n <Divider />\n </div>\n </div>\n\n <div className='edit-transaction-sidesheet-body'>\n <div>\n <UdpTabPanel value={selectedTab} index={TRANSACTION_TAB.DETAILS}>\n {transactionDetailPageId ? (\n <UdpTransactionCustomPage\n transactionTypeId={transactionTypeId}\n transactionUiActionType={\n TransactionUiActionTypeEnums.Render_Transaction_Details_Page\n }\n formRef={formRef}\n transaction={transaction}\n setHasUnsavedChanges={setHasUnsavedChanges}\n />\n ) : (\n <EditTransactionDetailsForm\n transaction={transaction}\n formRef={formRef}\n />\n )}\n </UdpTabPanel>\n\n <UdpTabPanel value={selectedTab} index={TRANSACTION_TAB.HISTORY}>\n <TransactionTimeline transactionId={transaction?.transactionId} />\n </UdpTabPanel>\n <UdpTabPanel\n value={selectedTab}\n index={TRANSACTION_TAB.ATTACHMENTS}\n >\n <TransactionAttachments\n transactionAttachments={transactionAttachmentsData}\n isLoading={fetchTransactionAttachmentsLoading}\n />\n </UdpTabPanel>\n <UdpTabPanel value={selectedTab} index={TRANSACTION_TAB.NOTES}>\n <TransactionNotes\n businessObjectKey={transaction?.businessObjectKey}\n refreshNotes={refreshNotes}\n setRefreshNotes={setRefreshNotes}\n noteTypes={noteTypes}\n fetchNoteTypeLoading={fetchNoteTypesLoading}\n />\n </UdpTabPanel>\n </div>\n </div>\n {selectedTab == TRANSACTION_TAB.DETAILS && (\n <div className='edit-transaction-sidesheet-footer'>\n <EditTransactionDetailsFooterItem\n transactionTypeId={transactionTypeId}\n transactionIsClosed={transactionIsClosed}\n handleOnCancel={closeSideSheet}\n handleOnSaveChanges={handleSaveChanges}\n />\n </div>\n )}\n </div>\n\n {openInnerSidesheetState &&\n // eslint-disable-next-line react-hooks/refs\n innerSidesheetList.map((item) => {\n return (\n <SideSheet\n key={item.title}\n open={item.open}\n width={600}\n title={item.title}\n onClose={item.closeSheet}\n buttonLabel={item?.buttonLabel}\n buttonOneDisabled={item?.buttonOneDisabled}\n buttonTwoLabel={item?.buttonTwoLabel}\n buttonTwoAction={item?.buttonTwoAction}\n onSubmit={item?.onSubmit}\n color='primary'\n >\n {item.children}\n </SideSheet>\n );\n })}\n </>\n );\n};\n\nexport default EditTransaction;\n","import React, { useState, useMemo, useRef, useCallback } from 'react';\nimport ViewTransaction from './sidesheets/ViewTransaction';\nimport AttachmentTransaction from './sidesheets/AttachmentTransaction';\nimport { LinearProgress, SideSheet } from '../../../UI';\nimport WorkflowActions from './sidesheets/WorkflowActions';\nimport EditTransaction from './sidesheets/EditTransaction';\nimport { useTransactionEngine } from '../../../utilities/transactions/useTransactionEngine';\nimport { TransactionUiActionTypeEnums } from '../../../enums';\nimport UdpTransactionCustomPage from './components/UdpTransactionCustomPage';\nimport { apiMutate } from '../../../utilities';\nimport { ConfigService } from '../../../configService';\nimport { useHandleAxiosSnackbar } from '../../../utilities';\nimport { useTranslation } from 'react-i18next';\nimport { FluentDialog } from '../../../UI';\nimport { PageContainer } from '../../../page/PageContainer';\n\nconst UdpTransactionSidesheet = (props) => {\n const {\n openStates,\n handleSidesheet,\n handleAttachmentTransaction,\n transaction,\n transactionTypeId,\n domainName,\n refreshGridData\n } = props;\n\n const [sidesheetLoading, setSidesheetLoading] = useState(false);\n const [closingTransactionLoading, setClosingTransactionLoading] =\n useState(false);\n const [\n editTransactionopenInnerSidesheetState,\n setEditTransactionOpenInnerSidesheetState\n ] = useState({\n attachments: false,\n workflowActions: false,\n notes: false\n });\n const [dialogOpen, setDialogOpen] = useState(false);\n const [unsavedChangesDialogOpen, setUnsavedChangesDialogOpen] =\n useState(false);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n\n const { handleSuccessSnackbar, handleErrorSnackbar } =\n useHandleAxiosSnackbar();\n\n const {\n hasClosedStatus,\n checkIfTransactionIsClosed,\n getTransactionTypeLabel,\n getUiActionRenderPageId\n } = useTransactionEngine(transactionTypeId);\n\n const { t } = useTranslation();\n const formRef = useRef(null);\n const attachmentRef = useRef();\n const sidesheetWidth = openStates?.width ?? 800;\n const transactionTypeEntry = transaction?.entityBusinessObject;\n\n const handleDialogClose = () => {\n setDialogOpen(false);\n };\n\n const handleUnsavedChangesDialogClose = () => {\n setUnsavedChangesDialogOpen(false);\n };\n\n const executeCloseTransaction = useCallback(async () => {\n // setSidesheetLoading(true);\n const response = await apiMutate(\n ConfigService.productV1ApiUrl,\n `udpTransaction/${transaction?.transactionId}/closeTransaction`,\n {\n method: 'post'\n }\n );\n // setSidesheetLoading(false);\n if (response?.status === 200) {\n handleSidesheet('edit', false);\n refreshGridData();\n handleSuccessSnackbar(t(`Transaction has been closed successfully`));\n } else {\n handleErrorSnackbar(\n new Error(t(`Error closing Transaction. Please try again later.`))\n );\n }\n }, [\n transaction,\n refreshGridData,\n handleSidesheet,\n handleSuccessSnackbar,\n handleErrorSnackbar,\n t\n ]);\n\n const handleConfirmCloseTransactionDialog = useCallback(async () => {\n try {\n setClosingTransactionLoading(true);\n await executeCloseTransaction();\n } catch (error) {\n handleErrorSnackbar(error);\n } finally {\n setClosingTransactionLoading(false);\n handleDialogClose();\n }\n }, [executeCloseTransaction, handleErrorSnackbar]);\n\n const formattedBusinesskey = transactionTypeEntry?.businessObjectKey\n ?.split('|')\n ?.pop();\n\n const handleTransactionCreation = useCallback(async () => {\n setSidesheetLoading(true);\n await formRef.current?.form?.submit();\n setSidesheetLoading(false);\n handleSidesheet('add', false);\n refreshGridData();\n }, [handleSidesheet, refreshGridData, formRef]);\n\n const handleCreateRevision = useCallback(async () => {\n setSidesheetLoading(true);\n await formRef.current?.form?.submit();\n setSidesheetLoading(false);\n handleSidesheet('createRevision', false);\n refreshGridData();\n }, [handleSidesheet, refreshGridData, formRef]);\n\n const handleNextStepsAction = useCallback(() => {\n if (!hasUnsavedChanges) {\n setEditTransactionOpenInnerSidesheetState({ workflowAction: true });\n } else {\n setUnsavedChangesDialogOpen(true);\n }\n }, [hasUnsavedChanges]);\n\n const handleConfirmUnsavedChangesDialog = useCallback(() => {\n setUnsavedChangesDialogOpen(false);\n setEditTransactionOpenInnerSidesheetState({ workflowAction: true });\n }, []);\n\n const pdfViewPageId = useMemo(() => {\n return getUiActionRenderPageId(\n TransactionUiActionTypeEnums.Render_View_Pdf_Page\n );\n }, [getUiActionRenderPageId]);\n\n const viewTransactionPage = useMemo(() => {\n if (pdfViewPageId) {\n return (\n <PageContainer pageId={pdfViewPageId} widgetParams={{ transaction }} />\n );\n } else {\n return <ViewTransaction transaction={transaction} />;\n }\n }, [transaction, pdfViewPageId]);\n\n const transactionIsClosed = useMemo(() => {\n return checkIfTransactionIsClosed(transaction);\n }, [checkIfTransactionIsClosed, transaction]);\n\n const transactionLabel = useMemo(() => {\n return getTransactionTypeLabel(transaction) ?? formattedBusinesskey;\n }, [getTransactionTypeLabel, transaction, formattedBusinesskey]);\n\n const sidesheetList = useMemo(() => {\n const list = [\n {\n open: openStates.addTransaction,\n closeSheet: () => handleSidesheet('add', false),\n title: domainName,\n width: sidesheetWidth,\n onSubmit: handleTransactionCreation,\n children: (\n <UdpTransactionCustomPage\n transactionTypeId={transactionTypeId}\n transactionUiActionType={\n TransactionUiActionTypeEnums.Render_Create_Transaction_Page\n }\n formRef={formRef}\n />\n ),\n buttonLabel: 'Add'\n },\n {\n open: openStates.viewTransaction,\n closeSheet: () => handleSidesheet('view', false),\n title: domainName + ' ' + transactionLabel + ' - Preview',\n width: sidesheetWidth,\n children: viewTransactionPage,\n buttonLabel: !pdfViewPageId ? 'Download' : null\n },\n {\n open: openStates.attachmentTransaction,\n closeSheet: () => handleSidesheet('view', false),\n title: 'Attachment for ' + domainName + ' ' + transactionLabel,\n width: sidesheetWidth,\n buttonLabel: 'Download',\n onSubmit: () => {\n if (attachmentRef.current) {\n attachmentRef.current.downloadSelectedFile();\n }\n },\n children: (\n <AttachmentTransaction\n handleAttachmentTransaction={handleAttachmentTransaction}\n attachmentRef={attachmentRef}\n transaction={transaction}\n domainName={domainName}\n setSidesheetLoading={setSidesheetLoading}\n />\n )\n },\n {\n open: openStates.workflowAction,\n closeSheet: () => handleSidesheet('action', false),\n title: `Workflow Actions - ${domainName} ${transactionLabel}`,\n width: sidesheetWidth,\n children: (\n <WorkflowActions\n transaction={transaction}\n closeSideSheet={() => {\n handleSidesheet('action', false);\n }}\n refreshGridData={refreshGridData}\n />\n )\n },\n {\n open: openStates.editTransaction,\n closeSheet: () => handleSidesheet('edit', false),\n title: `Edit ${domainName} ${transactionLabel}`,\n width: sidesheetWidth,\n buttonLabel: 'Next Steps',\n buttonOneDisabled: transactionIsClosed,\n onSubmit: handleNextStepsAction,\n buttonTwoLabel: 'Close ' + domainName,\n buttonTwoDisabled: transactionIsClosed || !hasClosedStatus,\n buttonTwoAction: () => setDialogOpen(true),\n children: (\n <EditTransaction\n transaction={transaction}\n transactionTypeId={transactionTypeId}\n transactionIsClosed={transactionIsClosed}\n openInnerSidesheetState={editTransactionopenInnerSidesheetState}\n setOpenInnerSidesheetState={\n setEditTransactionOpenInnerSidesheetState\n }\n refreshGridData={refreshGridData}\n closeSideSheet={() => handleSidesheet('edit', false)}\n setSidesheetLoading={setSidesheetLoading}\n setHasUnsavedChanges={setHasUnsavedChanges}\n />\n )\n },\n {\n open: openStates.createRevision,\n closeSheet: () => handleSidesheet('createRevision', false),\n title: `Create Revision for ${domainName}`,\n width: sidesheetWidth,\n onSubmit: handleCreateRevision,\n children: (\n <UdpTransactionCustomPage\n transactionTypeId={transactionTypeId}\n transactionUiActionType={\n TransactionUiActionTypeEnums.Render_Create_Revision_Page\n }\n formRef={formRef}\n transaction={transaction}\n />\n ),\n buttonLabel: 'Create Revision'\n }\n ];\n return list;\n }, [\n openStates,\n handleSidesheet,\n handleAttachmentTransaction,\n transaction,\n domainName,\n editTransactionopenInnerSidesheetState,\n setEditTransactionOpenInnerSidesheetState,\n transactionLabel,\n refreshGridData,\n transactionTypeId,\n handleTransactionCreation,\n hasClosedStatus,\n handleCreateRevision,\n transactionIsClosed,\n viewTransactionPage,\n pdfViewPageId,\n sidesheetWidth,\n handleNextStepsAction\n ]);\n\n return (\n <>\n {openStates &&\n sidesheetList.map((item) => {\n return (\n <SideSheet\n key={item.title}\n open={item.open}\n width={sidesheetWidth}\n title={item.title}\n onClose={item.closeSheet}\n noPadding={\n openStates.attachmentTransaction || openStates.editTransaction\n }\n buttonLabel={item?.buttonLabel}\n onSubmit={item?.onSubmit}\n color='primary'\n buttonTwoLabel={item?.buttonTwoLabel}\n buttonTwoAction={item?.buttonTwoAction}\n buttonOneDisabled={item?.buttonOneDisabled}\n buttonTwoDisabled={item?.buttonTwoDisabled}\n progress={sidesheetLoading}\n variant='indeterminate'\n >\n <div>{item.children}</div>\n </SideSheet>\n );\n })}\n <FluentDialog\n title={t(`Close Transaction`)}\n message={`Are you sure you want to close transaction for ${\n transaction?.entityBusinessKey || ''\n }?`}\n labelOne={t('Confirm')}\n actionOne={handleConfirmCloseTransactionDialog}\n labelTwo={t('Cancel')}\n actionTwo={handleDialogClose}\n open={dialogOpen}\n handleClose={handleDialogClose}\n loading={closingTransactionLoading}\n />\n <FluentDialog\n title={t(`Unsaved Changes`)}\n message={`You have unsaved changes. Are you sure you want to go to next steps?`}\n labelOne={t('Confirm')}\n actionOne={handleConfirmUnsavedChangesDialog}\n labelTwo={t('Cancel')}\n actionTwo={handleUnsavedChangesDialogClose}\n open={unsavedChangesDialogOpen}\n handleClose={handleUnsavedChangesDialogClose}\n loading={closingTransactionLoading}\n />\n </>\n );\n};\n\nexport default UdpTransactionSidesheet;\n","import { useState, useEffect, useCallback } from 'react';\nimport { apiMutate } from '../utilities/useAxiosMutate';\nimport { ConfigService } from '../configService';\nimport { useTransactionStore } from '../stores/transactionStore';\n\nexport const useTransactionType = (options = {}) => {\n const { transactionTypeId, domainName, domainFieldType, domainFieldValue } =\n options;\n\n const [resolvedId, setResolvedId] = useState(transactionTypeId || null);\n const [data, setData] = useState(undefined);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(undefined);\n const [promise, setPromise] = useState(undefined);\n\n const { transactionTypesMap, setTransactionTypesMap } = useTransactionStore();\n\n const setSuccessState = useCallback((response) => {\n setError(undefined);\n setLoading(false);\n setData(response);\n }, []);\n\n // ---------------------------------------------------------\n // EFFECT 1:\n // Resolve transactionTypeId if using domainName\n // ---------------------------------------------------------\n useEffect(() => {\n if (transactionTypeId) {\n setResolvedId(transactionTypeId);\n return;\n }\n\n if (!domainName) return;\n\n setLoading(true);\n\n const domainPromise = apiMutate(\n ConfigService.productV1ApiUrl,\n `udpTransactionType/domain/${domainName}${\n domainFieldType && domainFieldValue\n ? `?domainFieldType=${domainFieldType}&domainFieldValue=${domainFieldValue}`\n : ''\n }`,\n {}\n );\n\n domainPromise\n .then((res) => {\n const newId = res.data?.transactionTypeId;\n\n if (newId) {\n setResolvedId(newId);\n setTransactionTypesMap({ [newId]: res.data });\n setSuccessState(res.data);\n } else {\n setError('Transaction type not found for domain.');\n }\n })\n .catch(setError)\n .finally(() => setPromise(domainPromise));\n }, [transactionTypeId, domainName, domainFieldType, domainFieldValue]);\n\n // ---------------------------------------------------------\n // EFFECT 2:\n // Fetch transaction type once resolvedId is known\n // ---------------------------------------------------------\n useEffect(() => {\n if (!resolvedId) return;\n\n // Check cache first\n if (transactionTypesMap[resolvedId]) {\n setSuccessState(transactionTypesMap[resolvedId]);\n return;\n }\n\n setLoading(true);\n\n const fetchPromise = apiMutate(\n ConfigService.productV1ApiUrl,\n `udpTransactionType/${resolvedId}?withAssociationData=true`,\n {}\n );\n\n fetchPromise\n .then((res) => {\n const transactionType = res.data;\n setTransactionTypesMap({ [resolvedId]: transactionType });\n setSuccessState(transactionType);\n })\n .catch(setError)\n .finally(() => setPromise(fetchPromise));\n }, [\n resolvedId,\n transactionTypesMap,\n setTransactionTypesMap,\n setSuccessState\n ]);\n\n return { data, loading, error, promise };\n};\n","import { useLocation } from 'react-router-dom';\nimport { useMemo } from 'react';\n\nexport const useUdpGridFilterModel = () => {\n const { search } = useLocation();\n const searchParams = useMemo(() => new URLSearchParams(search), [search]);\n\n const filterModel = useMemo(() => {\n const constructedFilterModel = {};\n\n searchParams.forEach((value, key) => {\n if (key.startsWith('udp_search-')) {\n const paramBody = key.replace('udp_search-', '');\n const lastHyphenIndex = paramBody.lastIndexOf('-');\n\n if (lastHyphenIndex !== -1) {\n const field = paramBody.substring(0, lastHyphenIndex);\n const rawOp = paramBody.substring(lastHyphenIndex + 1);\n const operator = rawOp.replace(/_([a-z])/g, (_, char) =>\n char.toUpperCase()\n );\n\n // Determine Filter Type & Parse Value\n const { filterType, filterKey, parsedValue } =\n parseFilterValue(value);\n\n if (constructedFilterModel[field]) {\n // Append to existing conditions\n constructedFilterModel[field].conditions.push({\n filterType: filterType,\n type: operator,\n [filterKey]: parsedValue\n });\n } else {\n constructedFilterModel[field] = {\n filterType: filterType,\n operator: 'OR',\n conditions: [\n {\n filterType: filterType,\n type: operator,\n [filterKey]: parsedValue\n }\n ]\n };\n }\n }\n }\n });\n return constructedFilterModel;\n }, [searchParams]);\n\n return filterModel;\n};\n\nconst parseFilterValue = (value) => {\n const isDate =\n !isNaN(Date.parse(value)) && (value.includes('-') || value.includes('/'));\n\n if (isDate) {\n return {\n filterType: 'date',\n filterKey: 'dateFrom',\n parsedValue: value\n };\n }\n\n if (!isNaN(value) && !isNaN(parseFloat(value))) {\n return {\n filterType: 'number',\n filterKey: 'filter',\n parsedValue: Number(value)\n };\n }\n\n return {\n filterType: 'text',\n filterKey: 'filter',\n parsedValue: value\n };\n};\n","import UdpTransactionGrid from './UdpTransactionGrid';\nimport React, { useState, useCallback, useMemo } from 'react';\nimport UdpTransactionSidesheet from './UdpTransactionSidesheet';\nimport { useTransactionType } from '../../../hooks/useTransactionType';\nimport { useTransactionEngine } from '../../../utilities/transactions/useTransactionEngine';\nimport { CircularProgress } from '@material-ui/core';\nimport './UdpTransactionsPage.css';\nimport { useUdpGridFilterModel } from '../../../hooks/useUdpGridFilterModel';\n\n// const domainColumnFormattersExample = {\n// submittedBy: {\n// formatter: (params) => {\n// return params?.data\n// ? params?.data?.entityBusinessObject['submittedBy']\n// : '';\n// }\n// },\n// submittedTo: {\n// formatter: (params) => {\n// return params?.data\n// ? params?.data?.entityBusinessObject['submittedTo']\n// : '';\n// }\n// },\n// test: {\n// formatter: (params) => {\n// return 'test';\n// }\n// }\n// };\n\nconst UdpTransactionsPage = (props) => {\n const {\n transactionTypeId = '',\n domainName: initialDomainName = '',\n domainFieldType,\n domainFieldValue,\n searchMethodObject,\n domainColumnFormatters,\n gridOptions\n } = props;\n\n const [sidesheetState, setSidesheetState] = useState({\n workflowAction: false,\n addTransaction: false,\n editTransaction: false,\n viewTransaction: false,\n attachmentTransaction: false,\n createRevision: false\n });\n const [selectedTransaction, setSelectedTransaction] = useState(null);\n const [gridApi, setGridApi] = useState(null);\n\n const {\n data: transactionType,\n loading: transactionTypeLoading,\n error: transactionTypeError\n } = useTransactionType({\n transactionTypeId: transactionTypeId,\n domainName: initialDomainName,\n domainFieldType: domainFieldType,\n domainFieldValue: domainFieldValue\n });\n\n useTransactionEngine(transactionType?.transactionTypeId);\n const filterModel = useUdpGridFilterModel();\n\n const handleSidesheet = (\n actionType,\n openStatus,\n transaction,\n width = 800\n ) => {\n if (actionType == 'add') {\n setSidesheetState({ addTransaction: openStatus, width: width });\n } else if (actionType == 'edit') {\n setSidesheetState({ editTransaction: openStatus, width: width });\n } else if (actionType == 'view') {\n setSidesheetState({ viewTransaction: openStatus, width: width });\n } else if (actionType == 'attachment') {\n setSidesheetState({ attachmentTransaction: openStatus, width: width });\n } else if (actionType == 'action') {\n setSidesheetState({ workflowAction: openStatus, width: width });\n } else if (actionType == 'createRevision') {\n setSidesheetState({ createRevision: openStatus, width: width });\n }\n setSelectedTransaction(transaction);\n };\n\n const handleAttachmentTransaction = () => {};\n\n const handleGridApiCallback = useCallback((api) => {\n setGridApi(api);\n }, []);\n\n const domainName = useMemo(() => {\n if (transactionType) {\n const splitDomainNameArr = transactionType.domainName.split('.');\n return splitDomainNameArr.pop();\n }\n return initialDomainName;\n }, [transactionType, initialDomainName]);\n\n if (!transactionType) {\n return (\n <div className='udp-transaction-page-loading'>\n <CircularProgress size={64} />\n </div>\n );\n }\n\n return (\n <>\n <UdpTransactionGrid\n transactionTypeId={transactionType?.transactionTypeId}\n transactionType={transactionType}\n domainName={domainName}\n transactionTypeLoading={transactionTypeLoading}\n searchMethodObject={searchMethodObject}\n domainColumnFormatters={domainColumnFormatters}\n openAddTransaction={() => {\n handleSidesheet('add', true);\n }}\n openViewTransaction={(transaction) => {\n handleSidesheet('view', true, transaction);\n }}\n openEditTransaction={(transaction) => {\n handleSidesheet('edit', true, transaction);\n }}\n openAttachmentTransaction={(transaction) => {\n handleSidesheet('attachment', true, transaction, 1000);\n }}\n openWorkflowActionTransaction={(transaction) => {\n handleSidesheet('action', true, transaction);\n }}\n openCreateRevision={(transaction) => {\n handleSidesheet('createRevision', true, transaction);\n }}\n handleGridApiCallback={handleGridApiCallback}\n refreshGridData={() => {\n gridApi?.refreshServerSide();\n }}\n gridApi={gridApi}\n initialFilterModel={filterModel}\n initialGridOptions={gridOptions}\n />\n\n <UdpTransactionSidesheet\n openStates={sidesheetState}\n handleSidesheet={handleSidesheet}\n handleAttachmentTransaction={handleAttachmentTransaction}\n transaction={selectedTransaction}\n transactionTypeId={transactionType?.transactionTypeId}\n domainName={domainName}\n refreshGridData={() => {\n gridApi?.refreshServerSide();\n }}\n />\n </>\n );\n};\n\nexport default UdpTransactionsPage;\n","export * from './UdpTransactionsPage';\nexport { default } from './UdpTransactionsPage';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,MAAa,sBACX,QAA0B,CACxB,UAAU,SAAS;CACjB,qBAAqB,EAAE;CACvB,yBAAyB,wBACvB,KAAK,WAAW,EACd,qBAAqB;EACnB,GAAG,MAAM;EACT,GAAG;EACJ,EACF,EAAE;CACN,EAAE,CACJ;;;;ACVH,MAAa,wBAAwB,sBAAsB;CACzD,MAAM,OAAO,SAAS;CACtB,MAAM,CAAC,uBAAuB,4BAA4B,SAAS,EAAE,CAAC;CAEtE,MAAM,sBAAsB,iBACzB,UAAU,MAAM,oBAClB;CACD,MAAM,cAAc,iBAAiB,UAAU,MAAM,YAAY;CAEjE,MAAM,sBAAsB,qBACzB,UAAU,MAAM,oBAClB;CACD,MAAM,kBAAkB,sBACpB,oBAAoB,qBACpB;CAEJ,MAAM,eAAe,aAClB,MAAM,mBAAmB;EACxB,IAAI,+BAA+B;GACjC,iBAAiB,gBAAgB;GACjC,oBAAoB,gBAAgB;GACpC,mBAAmB,MAAM,WAAW,EAAE;GACvC;AAED,SAAO,UAAU,MAAM,MAAM,6BAA6B;IAE5D,CAAC,MAAM,QAAQ,CAChB;CAED,MAAM,uCAAuC,aAC1C,gBAAgB,aAAa,SAAS;AAqCrC,SAnCE,iBAAiB,mDAAmD,QACjE,SAAS,WAAW;GACnB,MAAM,YAAY,QAAQ;AAC1B,OAAI,CAAC,WACH,QAAO;AAET,OACE,OAAO,0BAA0B,cACjC,OAAO,WACP,WACA;AAEA,QADe,aAAa,WAAW,eAAe,EAC1C;KAKV,MAAM,iBAHJ,QAAQ,mFACR,EAAE,EAGD,KACE,WACC,OAAO,oFACV,CACA,QAAQ,WAAW,OAAO;AAE7B,SAAI,cAAc,SAAS,EACzB,WAAU,QAAQ,OAAO,cAAc;;AAG3C,WAAO;;AAET,UAAO;KAET,EAAE,CACH;IAIL,CAAC,iBAAiB,aAAa,CAChC;CAED,MAAM,eAAe,cAAc;AACjC,SAAO,iBAAiB;IACvB,CAAC,gBAAgB,CAAC;CAErB,MAAM,kBAAkB,cAAc;AACpC,SAAO,iBAAiB,4CAA4C,MACjE,WAAW,OAAO,eACpB;IACA,CAAC,gBAAgB,CAAC;CAErB,MAAM,6BAA6B,cAAc;AAC/C,MAAI,MAAM,QAAQ,iBAAiB,aAAa,CAC9C,QAAO,iBAAiB,gBAAgB,EAAE;WAE1C,iBAAiB,gBACjB,OAAO,KAAK,gBAAgB,aAAa,CAAC,OAQ1C,QANuB,OAAO,QAAQ,gBAAgB,aAAa,CAChE,KAAK,CAAC,cAAc,YAAY;GAC/B;GACA,GAAG;GACJ,EAAE,CACF,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,IACX,EAAE;AAE7B,SAAO,EAAE;IACR,CAAC,gBAAgB,CAAC;CAErB,MAAM,iCAAiC,cAAc;EACnD,MAAM,kBAAkB,EAAE;AAC1B,mBAAiB,4CAA4C,SAC1D,WAAW;AACV,mBAAgB,OAAO,QAAQ,OAAO,SAAS;IAElD;AACD,SAAO;IACN,CAAC,gBAAgB,CAAC;CAErB,MAAM,kBAAkB,aACrB,mBAAmB;EAClB,MAAM,qBAAqB,qCACzB,gBACA,0BAA0B,KAC3B;AACD,MAAI,CAAC,mBAAoB,QAAO,EAAE;EAClC,IAAI,eAAe,EAAE;AACrB,qBACG,QACE,WACC,OAAO,wBACP,2BAA2B,kBAC9B,CACA,SAAS,WAAW;AACnB,OAAI,OAAO,YAAY,aACrB,gBAAe,aAAa,OAAO,OAAO,WAAW,aAAa;IAEpE;AACJ,SAAO;IAET,CAAC,qCAAqC,CACvC;CAED,MAAM,oBAAoB,aACvB,mBAAmB;EAClB,MAAM,qBAAqB,qCACzB,gBACA,0BAA0B,KAC3B;AACD,MAAI,CAAC,mBAAoB,QAAO,EAAE;EAClC,IAAI,iBAAiB,EAAE;AACvB,qBACG,QACE,WACC,OAAO,wBACP,2BAA2B,qBAC9B,CACA,SAAS,WAAW;AACnB,OAAI,OAAO,YAAY,gBACrB,kBAAiB,eAAe,OAC9B,OAAO,WAAW,gBACnB;IAEH;AACJ,SAAO;IAET,CAAC,qCAAqC,CACvC;CAED,MAAM,0BAA0B,aAC7B,iBAAiB;AAKhB,UAHE,iBAAiB,0CAA0C,MACxD,WAAW,OAAO,8BAA8B,aAClD,GACc,YAAY,UAAU;IAEzC,CAAC,gBAAgB,CAClB;CAED,MAAM,0BAA0B,aAC7B,mBAAmB;AAClB,MAAI,CAAC,iBAAiB,iBAAkB,QAAO;AAC/C,SAAO,gBAAgB,uBACnB,eAAe,qBAAqB,gBAAgB,oBACpD;IAEN,CAAC,gBAAgB,CAClB;CAED,MAAM,6BAA6B,aAChC,mBAAmB;AAClB,MAAI,CAAC,gBAAiB,QAAO;EAC7B,MAAM,eACJ,iBAAiB,4CAA4C,MAC1D,WAAW,OAAO,eACpB;AACH,MAAI,CAAC,aAAc,QAAO;AAC1B,SACE,aAAa,4BAA4B,gBAAgB;IAG7D,CAAC,iBAAiB,gBAAgB,CACnC;AAED,iBAAgB;AACd,MAAI,eAAe,uBAAuB,iBAAiB;GACzD,MAAM,aAAa,YAAY;AAC/B,OAAI,YAAY;IAEd,MAAM,wBADiB,WAAW,KAAK,kBACM,MAC1C,QACC,IAAI,kBAAkB,aAAa,KACnC,iBAAiB,YAAY,aAAa,CAC7C;AACD,QAAI,sBACF,0BAAyB,sBAAsB,cAAc,EAAE,CAAC;;;IAIrE;EAAC;EAAa;EAAqB;EAAgB,CAAC;AAEvD,QAAO;EACL,wBAAwB;EACxB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;;;;AChOH,MAAM,sBAAsB,UAAU;CACpC,MAAM,EACJ,mBACA,YACA,wBACA,uBACA,oBACA,qBACA,qBACA,2BACA,+BACA,oBACA,oBACA,yBAAyB,EAAE,EAC3B,iBACA,SACA,oBACA,qBAAqB,EAAE,KACrB;CACJ,MAAM,CAAC,YAAY,iBAAiB,SAAS,MAAM;CACnD,MAAM,CAAC,qBAAqB,0BAA0B,SAAS,KAAK;CAEpE,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,EACJ,cACA,4BACA,yBACA,gCACA,4BACE,qBAAqB,kBAAkB;CAE3C,MAAM,EAAE,qBAAqB,0BAC3B,wBAAwB;CAE1B,MAAM,CACJ,EAAE,MAAM,SAAS,eAAe,OAAO,eACvC,qBACE,eACF,GAAGA,gBAAc,mBACjB,kBAAkB,qBAAqB,iBACvC,EACE,QAAQ,UACT,EACD,EAAE,CACH;CAED,MAAM,EAAE,qBAAqB,gBAAgB,iBAAiB;CAE9D,MAAM,0BAA0B;AAC9B,yBAAuB,KAAK;AAC5B,gBAAc,MAAM;;CAGtB,MAAM,4BAA4B,YAAY,YAAY;AACxD,MAAI;AAEF,QADiB,MAAM,mBAAmB,GAC5B,WAAW,KAAK;AAC5B,qBAAiB;AACjB,0BAAsB,EAAE,8CAA8C,CAAC;SAEvE,qBACE,IAAI,MAAM,EAAE,wDAAwD,CAAC,CACtE;WAEI,OAAO;AACd,uBAAoB,MAAM;YAClB;AACR,sBAAmB;;IAEpB;EACD;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,sBAAsB,SAAS;EACnC,MAAM,aAAa,IAAI,KAAK,KAAK;AACjC,MAAI,WAAW,SAAS,EAAE;GACxB,MAAM,OAAO,WAAW,aAAa;GAErC,MAAM,QAAQ,WAAW,UAAU,GAAG;GACtC,MAAM,MAAM,WAAW,SAAS,CAAC,UAAU;AAC3C,UAAO,GAAG,KAAK,GAAG,MAAM,UAAU,CAAC,GAAG;;AAExC,SAAO;;CAeT,MAAM,mBAAmB,cAAc;AACrC,SACE,wBAAwB,oBAAoB,IAC5C,qBAAqB;IAEtB,CAAC,yBAAyB,oBAAoB,CAAC;CAElD,MAAM,gBAAgB,cAAc;AAClC,SAAO,wBACL,6BAA6B,qBAC9B;IACA,CAAC,wBAAwB,CAAC;CAE7B,MAAM,oBAAoB,cAAc;AACtC,MACE,eACA,uBACA,YAAY,qBAEZ,QAAO,YAAY,sBAAsB,MAAM;AAEjD,SAAO;IACN,CAAC,aAAa,oBAAoB,CAAC;CAEtC,MAAM,aAAa,cAAc;EAC/B,MAAM,oBAAoB;GACxB;IACE,YAAY,EAAE,iBAAiB;IAC/B,OAAO;IACP,MAAM;IACP;GACD;IACE,YAAY,EAAE,aAAa;IAC3B,OAAO;IACP,cAAc;IACd,iBAAiB,WAAW;AAC1B,YAAO,mBAAmB,QAAQ,KAAK,UAAU;;IAEpD;GACD;IACE,YAAY,EAAE,iBAAiB;IAC/B,OAAO;IACP,cAAc;IACd,oBAAoB;KAClB,qBAAqB;KACrB,iBAAiB,WACf,QAAQ,KAAK,uCAAuC;KACvD;IACD,iBAAiB,WACf,QAAQ,KAAK,uCAAuC;IACvD;GACD;IACE,YAAY,EAAE,kBAAkB;IAChC,OAAO;IACP,iBAAiB,WACf,QAAQ,KAAK,sCAAsC;IACtD;GACD;IACE,YAAY,EAAE,cAAc;IAC5B,OAAO;IACP,QAAQ;IACR,UAAU;IACV,gBAAgB,UAAU;AACxB,+BAA0B,MAAM,KAAK;;IAEvC,iBAAiB,WAAW;AAC1B,YAAO,QAAQ,KAAK,uCAAuC;;IAE9D;GACD;IACE,OAAO;IACP,cAAc;IACd,oBAAoB,EAClB,YAAY;KACV;MACE,IAAI;MACJ,OAAO,EAAE,aAAa;MACtB,UAAU;MACV,gBAAgB,GAAG,WAAW;AAC5B,qCAA8B,QAAQ,KAAK;;MAE9C;KACD,GAAI,gBACA,CACE;MACE,IAAI;MACJ,OAAO,EAAE,OAAO;MAChB,UAAU;MACV,gBAAgB,GAAG,WAAW;AAC5B,2BAAoB,QAAQ,KAAK;;MAEnC,UAAU,CAAC;MACZ,CACF,GACD,EAAE;KACN;MACE,IAAI;MACJ,OAAO,EAAE,OAAO;MAChB,UAAU;MACV,gBAAgB,GAAG,WAAW;AAC5B,2BAAoB,QAAQ,KAAK;;MAEpC;KACD;MACE,IAAI;MACJ,OAAO,EAAE,kBAAkB;MAC3B,UAAU;MACV,gBAAgB,GAAG,WAAW;AAC5B,0BAAmB,QAAQ,KAAK;;MAElC,UAAU,CAAC;MACZ;KACD;MACE,IAAI;MACJ,OAAO,EAAE,SAAS;MAClB,UAAU;MACV,gBAAgB,GAAG,WAAW;AAC5B,8BAAuB,QAAQ,KAAK;AACpC,qBAAc,KAAK;;MAEtB;KACF,EACF;IACF;GACF;AACD,8BAA4B,SAAS,eAAe;GAClD,MAAM,eAAe,YAAY,gBAAgB;GAEjD,IAAI,kBAAkB,WAAW;AAC/B,QAAI,mBAUF;WAToB,mBAAmB,MACpC,kBACC,iBAAiB,cAAc,kBAAkB,IAAI,WACxD,GACwC,YAAY,MAClD,mBAAmB;AAClB,aAAO,eAAe,SAAS;OAElC,GAEoB,KAAK,aAAa,IAAI,cACzC,QAAQ,MAAM,qBAAqB,cAEnC,QAAO,mBACL,QAAQ,MAAM,qBAAqB,cACpC;;AAGL,WAAO,QAAQ,OACX,QAAQ,MAAM,qBAAqB,gBACnC;;AAGN,OAAI,uBAAuB,cACzB,kBAAiB,uBAAuB,cAAc;AAGxD,qBAAkB,KAAK;IACrB,YAAY,YAAY;IACxB,OAAO,GAAG,eAAe,wBAAwB,GAAG,WAAW,GAAG;IAClD;IACjB,CAAC;IACF;AAEF,SAAO,KAAK,uBAAuB,CAAC,SAAS,cAAc;AAIzD,OAAI,EAH4B,4BAA4B,KACzD,QAAQ,IAAI,aACd,GAC6B,SAAS,UAAU,EAAE;IACjD,IAAI,qBACF,UAAU,MAAM,GAAG,EAAE,CAAC,aAAa,GAAG,UAAU,MAAM,EAAE;AAC1D,sBAAkB,KAAK;KACrB,YAAY;KACZ,OAAO,GAAG,eAAe,wBAAwB,GAAG,WAAW,GAAG;KAClE,gBAAgB,uBAAuB,WAAW;KACnD,CAAC;;IAEJ;AAEF,MAAI,aACF,mBAAkB,OAAO,GAAG,GAAG;GAC7B,YAAY,EAAE,cAAc;GAC5B,OAAO;GACR,CAAC;AAGJ,SAAO;IACN;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,eAAe;EACnB,OAAO;EACP,qBAAqB;GACnB,OAAO,aAAa;GACpB,UAAU;GACV,eAAe;AACb,wBAAoB;;GAEvB;EAEF;CAED,MAAM,gBAAgB;EACpB,EAAE,MAAM,gBAAgB;EACxB,EAAE,MAAM,yBAAyB;EACjC,EAAE,MAAM,0BAA0B;EACnC;CAED,MAAM,cAAc,cAAc;AAChC,SAAO;GACL,YAAY;GACZ,cAAc;GACd,GAAG;GACJ;IACA,CAAC,mBAAmB,CAAC;CAExB,MAAM,qBAAqB,cAAc;EACvC,IAAI,uBAAuB;GACzB,WAAW;GACX,gBAAgB,CACd;IACE,aAAa;IACb,gBAAgB;IAChB,aAAa;IACd,EACD;IACE,aAAa;IACb,gBAAgB;IAChB,aAAa;IACd,CACF;GACF;AAED,MAAI,oBAAoB;GACtB,IAAI,sBAAsB,qBAAqB,eAAe,OAC5D,oBAAoB,kBAAkB,EAAE,CACzC;AAED,0BAAuB;IACrB,GAAG;IACH,GAAG;IACJ;AAED,0BAAuB;IACrB,GAAG;IACH,gBAAgB;IACjB;;AAGH,SAAO;GACL,YAAY,GAAGA,gBAAc,gBAAgB;GAC7C,oBAAoB;GACrB;IACA,CAAC,mBAAmB,mBAAmB,CAAC;AAG3C,iBAAgB;AACd,MACE,WACA,sBACA,OAAO,KAAK,mBAAmB,CAAC,QAChC;AAEA,WAAQ,eAAe,mBAAmB;AAG1C,WAAQ,iBAAiB;;IAE1B,CAAC,SAAS,mBAAmB,CAAC;AAEjC,SAAQ,IAAI,SAAS,gBAAgB,CAAC;AAEtC,QACE,0DACG,0BAA0B,oCAACC,uBAAiB,EAC7C,oCAAC;EACC,kBAAkB;EACH;EACF;EACD;EACQ;EACpB,iBAAiB;GACjB,EACF,oCAAC;EACC,OAAO,EAAE,qBAAqB;EAC9B,SAAS,uDAAuD,WAAW,KACzE,oBAAoB,GACrB;EACD,UAAU,EAAE,UAAU;EACtB,WAAW;EACX,UAAU,EAAE,SAAS;EACrB,WAAW;EACX,MAAM;EACN,aAAa;EACb,SAAS;GACT,CACD;;AAIP,iCAAe;;;;ACxaf,MAAM,mBAAmB,UAAU;CAEjC,MAAM,EAAE,gBAAgB;AAExB,QACE,0DACE,oCAAC;EACC,MAAM;GACJ,UAAU;GACV,eAAe;GAChB;EACD,wBAAuB;GACvB,CACD;;AAIP,8BAAe;;;;ACZf,MAAM,uCAAuC,UAAU;CACrD,MAAM,EAAE,aAAa,0BAA0B;CAE/C,MAAM,uBAAuB,cAAc;AACzC,SAAO,YAAY,KAAK,gBAAgB;GACtC,gBAAgB,WAAW;GAC3B,WAAW,WAAW;GACtB,yBAAyB,WAAW;GACrC,EAAE;IACF,CAAC,YAAY,CAAC;CAEjB,MAAM,eAAe,SAAS;AAC5B,MAAI,KAAK,eAAe,SAAS,OAAO,CACtC,QAAO;WACE,KAAK,eAAe,SAAS,QAAQ,CAC9C,QAAO;WACE,KAAK,eAAe,SAAS,IAAI,CAC1C,QAAO;;AAIX,QACE,0DACE,oCAAC;EACC,MAAM;EACN,WAAW;EACX,aAAa;GACX,aAAa;GACb,eAAe;GAChB;EACD,cAAc,SAAS;AACrB,yBAAsB,KAAK;;EAE7B,cAAc,SAAS;AACrB,UAAO,YAAY,KAAK;;EAE1B,YAAa;EACb,WAAW;GACX,CACD;;AAIP,kDAAe;;;;AC7Bf,MAAM,yBAAyB,UAAU;CACvC,MAAM,EAAE,aAAa,kBAAkB;CACvC,MAAM,CAAC,oBAAoB,yBAAyB,SAAS,GAAG;CAEhE,MAAM,cAAc,aAAa;CAEjC,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,CAAC,EAAE,MAAM,sBAAsB,6BAA6B,YAChE,GAAG,QAAQ,IAAI,8BACf,4BAA4B,oBAAoB,wBAAwB,yBACxE,EAAE,EACF,KACD;CAED,MAAM,CAAC,EAAE,MAAM,gBAAgB,SAAS,aAAa,OAAO,iBAAiB,yBAAyB,YACpG,GAAG,QAAQ,IAAI,8BACf,4BAA4B,oBAAoB,wBAAwB,YACxE,EACE,cAAc,QACf,EACD,KACD;CAED,MAAM,UAAU,cAAc;AAC5B,MAAI,CAAC,eAAgB,QAAO;EAC5B,MAAM,UAAU,IAAI,KAAK,CAAC,eAAe,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvE,SAAO,IAAI,gBAAgB,QAAQ;IAClC,CAAC,eAAe,CAAC;AAEpB,iBAAgB;AACd,MAAI,oBAAoB;AACtB,8BAA2B;AAC3B,0BAAuB;;IAExB;EAAC;EAAoB;EAA2B;EAAsB,CAAC;CAE1E,MAAM,wBAAwB;AAC5B,MAAI,CAAC,cAAe,QAAO;EAE3B,MAAM,SAAS,cAAc,UAAU;AACvC,MAAI,WAAW,IAAK,QAAO,EAAE,+CAA+C;AAC5E,MAAI,UAAU,IAAK,QAAO,EAAE,kDAAkD;AAE9E,SAAO,cAAc,WAAW,EAAE,+BAA+B;;CAGnE,IAAI,cAAc;EAChB,UAAU;EACV,eAAe,oBAAoB;EACpC;CAED,MAAM,cAAc;CA0DpB,MAAM,cAzDY,YAAY,WAAW;EACvC,WAAW;GACT,SAAS;GACT,eAAe;GACf,MAAM;GACN,QAAQ;GACT;EACD,yBAAyB;GACvB,WAAW;GACX,OAAO;GACP,QAAQ;GACT;EACD,sBAAsB;GACpB,iBAAiB;GACjB,cAAc;GACd,aAAa;GACd;EACD,iCAAiC;GAC/B,UAAU;GACV,YAAY;GACZ,OAAO;GACR;EACD,mCAAmC;GACjC,UAAU;GACV,OAAO;GACP,eAAe;GAChB;EACD,uBAAuB;GACrB,OAAO;GACP,SAAS;GACT,eAAe;GACf,MAAM;GACN,WAAW;GACX,QAAO;GACR;EACD,0BAA0B,EACxB,iBAAiB,SAClB;EACD,oBAAoB;GAClB,OAAO;GACP,UAAU;GACV,YAAY;GACZ,WAAW;GACX,cAAc;GACd,aAAa;GACd;EACD,YAAY;GACV,YAAY;GACZ,aAAa;GACd;EACD,SAAS,EACP,qBAAqB,EACnB,iBAAiB,kBAClB,EACF;EACF,EAAE,EAE4B;AAE/B,qBAAoB,sBAAsB,EACxC,sBAAsB,YAAY;AAChC,MAAI,CAAC,mBAAoB;AAEzB,MAAI;GAMF,MAAM,OALW,MAAM,UACrBC,gBAAc,iBACd,4BAA4B,mBAAmB,wBAAwB,yBACvE,EAAE,CACH,EACoB,KAAK;GAC1B,MAAM,OAAO,SAAS,cAAc,IAAI;AACxC,QAAK,OAAO;AACZ,QAAK,WAAW,mBAAmB,YAAY,mBAAmB;AAClE,YAAS,KAAK,YAAY,KAAK;AAC/B,QAAK,OAAO;AACZ,YAAS,KAAK,YAAY,KAAK;WACxB,GAAG;AACV,WAAQ,MAAM,mBAAmB,EAAE;;IAGxC,EAAE;CAEH,MAAM,qBAAqB,aACzB,MAAK;AACH,KAAG,gBAAgB;AAEnB,MAAI,QACF,QAAO,KAAK,SAAS,SAAS;IAGlC,CAAC,QAAQ,CACV;CAED,MAAM,0BAA0B;AAC9B,6BAA2B;AAC3B,yBAAuB;;AAGzB,QACE,0DACE,oCAAC,SAAI,WAAW,YAAY,aAC1B,oCAAC,SAAI,WAAW,YAAY,2BAC1B,oCAAC,SAAI,WAAW,YAAY,wBAC1B,oCAAC,SAAI,WAAW,YAAY,mCAAiC,cAEvD,EACN,oCAAC,SAAI,WAAW,YAAY,qCACzB,YAAY,SAAS,oBAClB,CACF,EACN,oCAAC,SAAI,WAAW,YAAY,WAC1B,oCAACC,gBAAU,CACP,EACN,oCAACC;EACc;EACA;EACU;GACvB,CACE,EAEN,oCAAC,SAAI,WAAW,YAAY,yBAC1B,oCAAC,SAAI,WAAW,YAAY,4BACzB,sBACC,oCAAC,OAAE,WAAW,YAAY,sBACvB,mBAAmB,eAClB,EAEN,oCAAC,SAAI,WAAW,YAAY,WAC1B,oCAACD,gBAAU,CACP,CACF,EAEL,iBACC,oCAAC;EACC,WAAW,CAAC,CAAC;EACb,eAAe;EACf,YAAY,EAAE,yBAAyB;EACvC,cAAc,iBAAiB;EAC/B,aAAa;EACb,mBAAmB,EAAE,QAAQ;EAC7B,yBAAyB,mBAAmB;GAC5C,EAGH,eAAe,CAAC,gBACf,oCAACE,uBAAiB,GAChB,sBAAsB,sBAAsB,UAC9C,oCAAC,SAAI,WAAW,YAAY,cAC1B,oCAAC;EACC,MACE,oBAAoB,aAAa,QAC7B,cACA,CAAC,YAAY;EAEnB,iBAAiB;GACjB,CACE,GACJ,CAAC,sBACF,oCAAC;EACA,MAAM;EACN,aAAa;EACb,eACE;GAEF,CAEA,CACF,CACL;;AAGP,oCAAe;;;;AC3Of,MAAM,4BAA4B,UAAU;CAC1C,MAAM,EACJ,QACA,mBACA,yBACA,SACA,aACA,oCACA,yBACE;CAEJ,MAAM,EAAE,yBAAyB,iBAAiB,sBAChD,qBAAqB,kBAAkB;CAEzC,MAAM,EAAE,qBAAqB,0BAC3B,wBAAwB;CAC1B,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,iCAAiC,YACrC,OAAO,SACL,UACE,cAAc,iBACd,kCAAkC,kBAAkB,UACpD,EACE,QAAQ,QACT,EACD,KACD,EACH,CAAC,kBAAkB,CACpB;CAED,MAAM,qBAAqB,YACzB,OAAO,SACL,UACE,cAAc,iBACd,kBAAkB,aAAa,cAAc,eAC7C,EACE,QAAQ,OACT,EACD,KACD,EACH,CAAC,aAAa,cAAc,CAC7B;CAED,MAAM,wBAAwB,YAC5B,OAAO,SACL,UACE,cAAc,iBACd,kBAAkB,aAAa,cAAc,kBAC7C,EACE,QAAQ,QACT,EACD,KACD,EACH,CAAC,aAAa,cAAc,CAC7B;CAED,MAAM,4BAA4B,YAChC,OAAO,SACL,UACE,cAAc,iBACd,uCAAuC,mCAAmC,eAAe,YAAY,cAAc,UACnH,EACE,QAAQ,QACT,EACD,KACD,EACH,CAAC,oCAAoC,aAAa,cAAc,CACjE;CAED,MAAM,WAAW,YACf,OAAO,WAAW;AAChB,MAAI;GACF,MAAM,UAAU,EAAE,MAAM,QAAQ;GAChC,IAAI,WAAW;GACf,IAAI,UAAU;GACd,IAAI,mBAAmB;AACvB,OACE,4BACA,6BAA6B,gCAC7B;AACA,eAAW,MAAM,+BAA+B,QAAQ;AACxD,cAAU;AACV,uBAAmB;cAEnB,4BACA,6BAA6B,iCAC7B;AACA,eAAW,MAAM,mBAAmB,QAAQ;AAC5C,cAAU;AACV,uBAAmB;cAEnB,4BACA,6BAA6B,6BAC7B;AACA,eAAW,MAAM,sBAAsB,QAAQ;AAC/C,cAAU;AACV,uBAAmB;cACV,CAAC,CAAC,oCAAoC;AAC/C,eAAW,MAAM,0BAA0B,QAAQ;AACnD,cAAU;AACV,uBAAmB;;AAGrB,OAAI,UAAU,WAAW,IACvB,uBAAsB,EAAE,GAAG,QAAQ,GAAG,CAAC;OAEvC,qBACE,IAAI,MACF,EACE,SAAS,iBAAiB,uCAC3B,CACF,CACF;WAEI,OAAO;AACd,uBAAoB,MAAM;YAClB;AACR,OAAI,sBAAsB;AACxB,YAAQ,SAAS,MAAM,QAAQ,OAAO;AACtC,yBAAqB,MAAM;;;IAIjC;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;CAED,MAAM,kBAAkB,aACrB,cAAc;AAEb,SADuB,kBAAkB,YAAY,EAC9B,SAAS,UAAU;IAE5C,CAAC,mBAAmB,YAAY,CACjC;CAED,MAAM,gBAAgB,aACnB,cAAc;AAEb,SADqB,gBAAgB,YAAY,EAC5B,SAAS,UAAU;IAE1C,CAAC,iBAAiB,YAAY,CAC/B;CAED,MAAM,oBAAoB,cAAc;AACtC,MAAI,OACF,QAAO;AAET,SAAO,wBAAwB,wBAAwB;IACtD;EAAC;EAAyB;EAAyB;EAAO,CAAC;AAE9D,KAAI,CAAC,kBACH,QAAO;AAGT,QACE,oCAAC;EAAe;EAAU,KAAK;IAC7B,oCAAC,WAAQ,cAAc,EAAE,OAAO,MAAM,KAClC,EAAE,YAAY;AACd,MAAI,qBACF,sBAAqB,MAAM;GAGvB,EACV,oCAAC;EACC,QAAQ;EACR,qBAAqB;EACrB,cAAc;GAAE;GAAa;GAAiB;GAAe;GAC7D,CACG;;AAIX,uCAAe;;;;ACrLf,MAAM,2BAA2B,EAC/B,MACA,aACA,eACA,SACA,aACI;CACJ,MAAM,iBAAiB,cAAc,gBAAgB,KAAK,EAAE,CAAC,KAAK,CAAC;AAEnE,QACE,oCAAC;EACC,MAAM,iBAAiB,iBAAiB;EAC3B;EACE;EACf,eAAe;AACb,WAAQ,OAAO;;GAEjB;;AAIN,MAAM,mBAAmB,EAAE,aAAa,gBAAgB,sBAAsB;CAC5E,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAClD,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,KAAK;CAChE,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,KAAK;CAC1D,MAAM,CAAC,eAAe,oBAAoB,SAAS,MAAM;CACzD,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAE7C,MAAM,UAAU,OAAO,KAAK;CAE5B,MAAM,EAAE,yCAAyC,qBAC/C,YAAY,kBACb;CAED,MAAM,yBAAyB,kBAAkB;AAC/C,mBAAiB,MAAM;IACtB,EAAE,CAAC;CAEN,MAAM,6BAA6B,YAAY,YAAY;AACzD,aAAW,KAAK;AAChB,QAAM,QAAQ,SAAS,MAAM,QAAQ;AACrC,aAAW,MAAM;AACjB,0BAAwB;AACxB,kBAAgB;AAChB,mBAAiB;IAChB;EAAC;EAAwB;EAAiB;EAAgB;EAAQ,CAAC;CAEtE,MAAM,oCAAoC,cAAc;AACtD,SACE,qCACE,aACA,0BAA0B,UAC3B,IAAI,EAAE;IAER,CAAC,sCAAsC,YAAY,CAAC;CAGvD,MAAM,CAAC,EAAE,MAAM,mBAAmB,uBAAuB,eACvD,GAAGC,gBAAc,mBACjB,uCACA,EACE,QAAQ,QACT,EACD,EAAE,CACH;CAED,MAAM,OAAO,gBAAgB,CAAC;CAC9B,MAAM,EAAE,oBAAoB,aAAa;CAEzC,MAAM,mBAAmB,aAAa,OAAO,YAAY;AACvD,uBAAqB;GAAE;GAAO;GAAS,CAAC;AACxC,gBAAc,KAAK;IAClB,EAAE,CAAC;CAEN,MAAM,oBAAoB,kBAAkB;AAC1C,gBAAc,MAAM;IACnB,EAAE,CAAC;CAEN,MAAM,4BAA4B,YAAY,YAAY;AACxD,gBAAc,KAAK;AACnB,qBAAmB;AACnB,aAAW,KAAK;AAChB,MAAI;AACW,SAAM,oBAAoB;IAErC,KACE,GAAGA,gBAAc,uDACuB,eAAe,mCAAmC,eAAe,YAAY,cAAc;IACrI,MAAM,EAAE;IACT,CAAC;AACF,mBAAgB,KAAK,0BAA0B,EAAE;IAC/C,SAAS;IACT,cAAc;KACZ,UAAU;KACV,YAAY;KACb;IACF,CAAC;AACF,mBAAgB;AAChB,oBAAiB;WACV,OAAO;AACd,mBAAgB,KAAK,MAAM,QAAQ,EAAE;IACnC,SAAS;IACT,cAAc;KACZ,UAAU;KACV,YAAY;KACb;IACF,CAAC;;AAEJ,aAAW,MAAM;IAChB;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CACF,MAAM,sBAAsB,aACzB,WAAW;EACV,MAAM,SAAS,OAAO,WAAW;AACjC,oBAAkB,OAAO;AACzB,MAAI,OACF,kBAAiB,KAAK;MAEtB,kBAAiB,OAAO,MAAM,OAAO,YAAY;IAGrD,CAAC,iBAAiB,CACnB;CAED,MAAM,2BAA2B,cAAc;AAC7C,MAAI,CAAC,kCAAkC,OACrC,QAAO;AAET,SAAO,mCAAmC,KAAK,WAC7C,oCAAC;GACC,KAAK,OAAO;GACZ,aAAa,OAAO;GACpB,eAAe,OAAO;GACtB,MAAM,OAAO;GACb,SAAS;GACD;IACR,CACF;IACD,CAAC,mCAAmC,oBAAoB,CAAC;AAE5D,QACE,0DACE,oCAAC,SAAI,WAAU,0CACZ,yBACG,EAEL,qBACC,oCAAC;EACC,OAAO,KACL,2CAA2C,kBAAkB,MAAM,KACpE;EACD,SAAS,kBAAkB;EAC3B,UAAU,KAAK,UAAU;EACzB,WAAW;EACX,UAAU,KAAK,SAAS;EACxB,WAAW;EACX,MAAM;EACN,aAAa;GACb,EAGJ,oCAAC;EACC,MAAM;EACN,OAAO,gBAAgB;EACvB,SAAS;EACT,OAAO;EACP,aAAa,KAAK,SAAS;EAC3B,UAAU;EACV,UAAU;EACV,SAAQ;IAEP,kBAAkB,eAAe,YAAY,UAC5C,oCAACC;EACC,QAAQ,eAAe,WAAW;EACrB;EACJ;EACT,oCACE,eAAe;GAEjB,CAEM,CACX;;AAIP,8BAAe;;;;AChNf,MAAa,mBAAmB;AAEhC,MAAa,oBAAoB;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;ACdD,MAAM,6BAA6B,UAAU;CAC3C,MAAM,EAAE,OAAO,OAAO,eAAe;AACrC,QACE,oCAAC,SAAI,WAAU,uCACb,oCAACC,gBAAW,SAAQ,aAAW,MAAmB,EACjD,aACC,oCAAC,SAAI,WAAU,8CACb,oCAAC,YAAe,WAAc,CAC1B,GAEN,oCAACA,gBAAW,SAAQ,WAAS,MAAmB,CAE9C;;AAIV,wCAAe;;;;ACbf,MAAa,2BAA2B,UAAU;CAChD,MAAM,EACJ,OACA,aACA,MACA,QACA,YACE;AAEJ,QACE,oCAAC;EACC,UAAS;EACT,aAAa;EACb;EACA,aAAa;IAEb,oCAAC,wBAAqB,MAAK,eACzB,oCAAC,2BAAuB,EACxB,oCAAC;EAAe,OAAM;EAAU,OAAM;EAAU,MAAK;GACpC,CACI,EACvB,oCAAC,UAAK,MAAK,WAAS,MAAa,EACjC,oCAAC,UAAK,MAAK,aAAW,KAAY,EAClC,oCAAC,UAAK,MAAK,aAAW,YAAmB,CACzB;;;;;ACrBtB,MAAa,uBAAuB,UAAU;CAC5C,MAAM,EAAE,kBAAkB;CAC1B,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,YAAY,cAAc;AAC9B,SAAO;GACL,WAAW;GACX,YAAY;GACZ,UAAU;GACV,gBAAgB,CACd;IACE,aAAa;IACb,aAAa;IACb,gBAAgB;IACjB,CACF;GACD,eAAe,CACb;IACE,YAAY;IACZ,eAAe;IAChB,CACF;GACD,QAAQ;GACT;IACA,CAAC,cAAc,CAAC;CAEnB,MAAM,CACJ,EAAE,MAAM,oBAAoB,SAAS,aACrC,2BACE,eACFC,gBAAc,iBACd,gCACA;EACE,QAAQ;EACR,MAAM;EACP,CACF;AAED,iBAAgB;AACd,2BAAyB;IACxB,CAAC,wBAAwB,CAAC;AAE7B,QACE,oCAAC,aACE,YACC,oCAAC,aACC,oCAAC,qBAAiB,CACd,GACJ,oBAAoB,UAAU,SAAS,IAC3C,oCAAC,mBACC,oCAAC,mBACE,oBAAoB,UAAU,KAAK,MAAM,UACxC,oCAAC;EACC,KAAK;EACL,OACE,MAAM,0DACF,QACJ,MAAM,8CAA8C;EAEtD,aACE,MAAM,gBAAgB,MAAM,MAAM,kBAAkB;EAEtD,MACE,MAAM,YACF,WAAW,MAAM,WAAW,aAAa,GACzC;EAEN,QAAQ,MAAM,+CAA+C;GAC7D,CACF,CACU,CACF,GAEZ,oCAAC,aACC,oCAAC,qBAAkB,aAAa,EAAE,aAAa,GAAI,CAC/C,CAEJ;;;;;ACpFV,MAAa,yBAAyB,UAAU;CAC9C,MAAM,EAAE,YAAY,eAAe;CAEnC,MAAM,CAAC,EAAE,MAAM,4BAA4B,SAAS,eAClD,YACE,cAAc,iBACd,4BAA4B,YAAY,wBAAwB,yBAChE,EAAE,EACF,CAAC,CAAC,CAAC,YAAY,wBAChB;AAEH,QACE,oCAAC;EACC,SAAS;EACT,UAAU,YAAY;EACtB,UAAU,YAAY;EACtB,eAAe,YAAY;EAC3B,YAAY,YAAY;EACxB,cAAc,YAAY;EACd;EACZ,aAAa,4BAA4B;GACzC;;;;;AClBN,MAAa,0BAA0B,UAAU;CAC/C,MAAM,EAAE,wBAAwB,cAAc;CAC9C,MAAM,EAAE,MAAM,gBAAgB;AAE9B,QACE,oCAAC,aACE,YACC,oCAAC,qBAAiB,GAChB,wBAAwB,UAAU,SAAS,IAC7C,oCAAC,eAAY,mBACV,uBAAuB,SAAS,KAAK,YAAY,UAChD,oCAAC;EACC,KAAK;EACO;EACZ,YAAY,UAAU,uBAAuB,SAAS,SAAS;GAC/D,CACF,CACU,GAEd,oCAAC,aACC,oCAAC,qBAAkB,aAAa,EAAE,iBAAiB,GAAI,CACnD,CAEJ;;;;;ACrBV,MAAMC,cAAY,YAAY,WAAW;CACvC,gBAAgB;EACd,SAAS;EACT,KAAK;EACL,gBAAgB;EAChB,YAAY;EACb;CACD,eAAe;EACb,SAAS;EACT,KAAK,MAAM,QAAQ,EAAE;EACrB,YAAY;EACZ,WAAW,MAAM,QAAQ,EAAE;EAC5B;CACD,MAAM;EACJ,OAAO;EACP,QAAQ;EACR,WAAW,EACT,iBAAiB,uBAClB;EACD,SAAS;EACT,QAAQ;EACT;CACD,aAAa,EACX,OAAO,MAAM,QAAQ,KAAK,MAC3B;CACF,EAAE;AAEH,MAAa,mBAAmB,UAAU;CACxC,MAAM,EAAE,SAAS,SAAS;CAC1B,MAAM,UAAUA,aAAW;AAE3B,QACE,oCAAC,aACC,oCAAC;EACC;EACA,WAAU;EACV,aAAa;EACb,iBAAiB,oCAAC,aAAU,OAAO,SAAU;EAC7C;EACA;EACA,wBAAwB;EACxB,mBAAmB;IAEnB,oCAAC;EAAI,WAAW,QAAQ;EAAe;IACrC,oCAAC,SAAI,WAAW,QAAQ,kBACtB,oCAACC,gBAAW,SAAQ,QACjB,MAAM,WAAW,mBACP,EACb,oCAACA;EAAW,SAAQ;EAAU,WAAW,QAAQ;IAC9C,2BAA2B,MAAM,UAAU,CACjC,CACT,EACN,oCAACA,gBAAW,SAAQ,WACjB,MAAM,WACL,4DACS,EAEb,oCAAC,SAAI,WAAW,QAAQ,iBACtB,oCAAC;EACC,OAAO,MAAM;EACb,OAAM;EACN,SAAQ;EACR,MAAM,oCAAC,kBAAc;GACrB,CACE,CACF,CACM,CACV;;;;;AC/DV,MAAMC,cAAY,YAAY,WAAW,EACvC,SAAS,EACP,cAAc,MAAM,QAAQ,EAAE,EAC/B,EACF,EAAE;AAEH,MAAM,gCAAgC,OAAO,QAAQ;CACnD,MAAM,EACJ,eACA,UACA,mBACA,gBACA,WACA,0BACE;CACJ,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;CACjD,MAAM,OAAO,eAAe;CAC5B,MAAM,EAAE,uBAAuB,wBAC7B,wBAAwB;CAC1B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,UAAUA,aAAW;CAG3B,MAAM,qBAAqB,YACzB,OAAO,SACL,UACEC,gBAAc,iBACd,WACA,EACE,QAAQ,QACT,EACD,KACD,EACH,EAAE,CACH;CAED,MAAM,kBAAkB,YACtB,OAAO,SACL,UACEA,gBAAc,iBACd,mBACA,EACE,QAAQ,QACT,EACD,KACD,EACH,EAAE,CACH;CAED,MAAM,mBAAmB,YACvB,OAAO,WAAW;AAChB,eAAa,KAAK;AASlB,QAAM,mBAAmB,EACvB,MATsB;GACtB,UAAU,QAAQ,UAAU;GAC5B,SAAS,QAAQ;GACjB,SAAS,QAAQ;GACjB,aAAa,MAAM;GACnB,iBAAiB,MAAM,QAAQ;GAChC,EAIA,CAAC,CACC,KAAK,OAAO,QAAQ;AACnB,WAAQ,IAAI,+BAA+B,EAAE,KAAK,CAAC;AACnD,OAAI,KAAK,MAAM,GACb,OAAM,gBAAgB,EACpB,MAAM;IACJ,mBAAmB;IACnB,QAAQ,KAAK,MAAM;IACpB,EACF,CAAC,CAAC,WAAW;AACZ,0BACE,EAAE,gDAAgD,CACnD;AACD,QAAI,eACF,iBAAgB;KAElB;IAEJ,CACD,OAAO,QAAQ;AACd,uBAAoB,KAAK,EAAE,kCAAkC,CAAC;IAC9D;AACJ,eAAa,MAAM;IAErB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,oCAAC,aACE,wBACC,oCAAC,aACC,oCAACC,uBAAiB,CACd,GAEN,oCAAC,aACE,aACC,oCAAC,SAAI,WAAW,QAAQ,WACtB,oCAACA,uBAAiB,CACd,EAER,oCAAC;EACM;EACL,UAAU;EACK;EACf,IAAI,uBAAuB;EAC3B,SAAS,EAAE,iBACT,0DACE,oCAAC;GACC,WAAW;GACX,IAAG;GACH,MAAK;GACL,WAAU;GACV;GACA,OAAO,EAAE,OAAO;GAChB,SAAS,aAAa,EAAE;GACxB,UAAU,YAAY;GACtB,gBAAgB;GAChB;IACA,EAEF,oCAAC;GACC,WAAW;GACX,IAAG;GACH,MAAK;GACL,OAAO,EAAE,UAAU;GACnB,UAAU,YAAY;GACtB,gBAAgB;GAChB;IACA,EACF,oCAAC;GACC,WAAW;GACX,IAAG;GACH,MAAK;GACL,OAAO,EAAE,UAAU;GACnB,gBAAgB;GAChB;GACA,MAAM;GACN,SAAS;GACT,UAAU,YAAY;GACtB;IACA,EACD,YACC,oCAACC,gBAAW,SAAQ,aACjB,EACC,uEACD,CACU,CAEd;GAEL,CACE,CAEJ;;AAIV,MAAa,sBAAsB,WAAW,6BAA6B;;;;ACrK3E,MAAM,YAAY,YAAY,WAAW,EACvC,OAAO;CACL,SAAS;CACT,eAAe;CACf,KAAK,MAAM,QAAQ,EAAE;CACtB,EACF,EAAE;AAEH,MAAa,oBAAoB,UAAU;CACzC,MAAM,EACJ,mBACA,cACA,iBACA,WACA,0BACE;CACJ,MAAM,CAAC,eAAe,oBAAoB,SAAS,MAAM;CACzD,MAAM,CAAC,cAAc,mBAAmB,SAAS,KAAK;CACtD,MAAM,CAAC,UAAU,eAAe,SAAS,EAAE,CAAC;CAC5C,MAAM,UAAU,WAAW;CAC3B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;CAEjD,MAAM,uBAAuB,cAAc;AACzC,SAAO;GACL,WAAW;GACX,YAAY;GACZ,UAAU;GACV,gBAAgB,CACd;IACE,aAAa;IACb,aAAa;IACb,gBAAgB;IACjB,CACF;GACD,QAAQ;GACT;IACA,CAAC,kBAAkB,CAAC;CAEvB,MAAM,CACJ,EAAE,MAAM,cAAc,SAAS,4BAC/B,qBACE,eAAeC,gBAAc,iBAAiB,0BAA0B;EAC1E,QAAQ;EACR,MAAM;EACP,CAAC;CAEF,MAAM,iBAAiB,aAAa,SAAS;AAC3C,kBAAgB,KAAK;AACrB,mBAAiB,KAAK;IACrB,EAAE,CAAC;CAEN,MAAM,uBAAuB,kBAAkB;AAC7C,mBAAiB,MAAM;AACvB,kBAAgB,KAAK;IACpB,EAAE,CAAC;AAEN,iBAAgB;AACd,qBAAmB;IAClB,CAAC,kBAAkB,CAAC;AAEvB,iBAAgB;AACd,MAAI,cAAc;AAChB,sBAAmB;AAEnB,mBAAgB,MAAM;;IAEvB;EAAC;EAAmB;EAAc;EAAgB,CAAC;AAEtD,iBAAgB;AACd,MAAI,CAAC,4BAA4B,cAAc,UAAU,SAAS,GAAG;GAMnE,MAAM,YAAY;IAChB,WAAW;IACX,YAAY;IACZ,UAAU;IACV,gBAAgB,CACd;KACE,aAAa;KACb,aAXU,cAAc,UAC1B,KAAK,QAAQ,KAAK,OAAO,CAC1B,KAAK,IAAI;KAUN,gBAAgB;KACjB,CACF;IACD,QAAQ;IACT;AAED,gBAAa,KAAK;AAClB,aACEA,gBAAc,iBACd,kBACA;IACE,QAAQ;IACR,MAAM;IACP,EACD,EAAE,CACH,CACE,MAAM,SAAS;AACd,QAAI,QAAQ,KAAK,KACf,aAAY,KAAK,MAAM,SAAS;QAEhC,aAAY,EAAE,CAAC;KAEjB,CACD,cAAc;AACb,iBAAa,MAAM;KACnB;QAEJ,aAAY,EAAE,CAAC;IAEhB;EAAC;EAA0B;EAAc;EAAa,CAAC;AAE1D,QACE,oCAAC,aACC,oCAAC,SAAI,WAAW,QAAQ,SACrB,aAAa,2BACZ,oCAAC,aACC,oCAACC,uBAAiB,CACd,GACJ,UAAU,SAAS,IACrB,SAAS,KAAK,MAAM,UAClB,oCAAC;EACC,KAAK;EACC;EACN,eAAe,eAAe,KAAK;GACnC,CACF,GAEF,oCAAC,aACC,oCAAC,qBAAkB,aAAY,aAAa,CACxC,CAEJ,EAEN,oCAAC;EACC,OAAO,EAAE,YAAY;EACrB,OAAO;EACP,MAAM;EACN,SAAS;IAET,oCAAC,aACC,oCAAC;EACC,eAAe;EACI;EACnB;EACW;EACX,sBAAsB;GACtB,CACE,CACI,CACR;;;;;ACzKV,IAAY,8DAAL;AACL;AACA;AACA;AACA;;;;;;ACEF,MAAM,oCAAoC,UAAU;CAClD,MAAM,EACJ,mBACA,qBACA,gBACA,wBACE;CACJ,MAAM,EAAE,iBAAiB,qBAAqB,kBAAkB;CAChE,MAAM,EAAE,MAAM,gBAAgB;AAC9B,QACE,oCAAC,SAAI,WAAU,qCACb,oCAAC;EAAa,OAAM;EAAU,SAAS;IACpC,EAAE,SAAS,CACC,EACd,CAAC,uBACA,oCAAC;EACC,SAAQ;EACR,OAAM;EACN,SAAS;IAER,EAAE,eAAe,CACL,CAEb;;AAIV,+CAAe;;;;ACtBf,MAAM,oCAAoC,UAAU;CAClD,MAAM,EAAE,aAAa,oBAAoB;CACzC,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,EAAE,iBAAiB,sBAAsB,qBAC7C,YAAY,kBACb;CAED,MAAM,oBAAoB;EACxB,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,MAAM;EACN,OAAO;EACR;CAED,MAAM,iBAAiB,iBAAiB,aAAa;AAInD,UAHuB,iBAAiB,MACrC,WAAW,OAAO,MAAM,SAC1B,GACsB;;CAGzB,MAAM,kBAAkB;EAAC;EAAO;EAAS;EAAO;CAEhD,MAAM,wBAAwB,SAAS;EACrC,MAAM,aAAa,IAAI,KAAK,KAAK;AACjC,MAAI,WAAW,SAAS,EAAE;GACxB,MAAM,OAAO,WAAW,aAAa;GAErC,MAAM,QAAQ,WAAW,UAAU,GAAG;GACtC,MAAM,MAAM,WAAW,SAAS,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI;AAC5D,UAAO,GAAG,KAAK,GAAG,MAAM,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG;;AAEzD,SAAO;;CAGT,MAAM,wBAAwB,eAAa,cAAc;EACvD,MAAM,YAAY,UAAU;EAC5B,IAAI,gBAAgB,UAAU,KAAK,aAAa;AAChD,kBAAgB,gBAAgB,SAAS,cAAc,GAAG,WAAW;EACrE,MAAM,qBAAqB,UAAU;EACrC,IAAI,sBAAsB;AAC1B,UAAQ,eAAR;GACE,KAAK;AACH,0BAAsB;KACpB,cAAcC,cAAY,qBAAqB;KAC/C,MAAM;KACN,YAAY,EAAE,YAAY,EAAE,KAAK,GAAG,EAAE;KACvC;AACD;GACF,KAAK;AACH,0BAAsB;KACpB,cAAc,qBAAqBA,cAAY,qBAAqB,WAAW;KAC/E,MAAM;KACP;AACD;GACF,KAAK;AACH,0BAAsB;KACpB,SAAS,WAAW,SAAS,KAAK,WAAW,OAAO,GAAG;KACvD,yBAAyB,WACvB,cAAc,WAAW,SAAS,OAAO,IAAI;KAC/C,cAAcA,cAAY,qBAAqB;KAChD;AAED;GACF,KAAK;AACH,0BAAsB;KACpB,MAAM;KACN,cAAc;KACf;AACD;GACF,QACE,uBAAsB,EACpB,cAAcA,cAAY,qBAAqB,YAChD;;EAEL,MAAM,YAAY,qBAAqB,YAAY,UAAU;EAC7D,MAAM,aAAa,kBAAkBA,cAAY,CAAC,SAAS,UAAU,IAAI,UAAU;EACnF,MAAM,WAAW,gBAAgBA,cAAY,CAAC,SAAS,UAAU,IAAI,UAAU,gBAAgB,CAAC,UAAU,mBAAmB;EAE7H,IAAI,iBACF,oCAAC;GACC,WAAW,kBAAkB,kBAAkB;GAC/C,OAAO,EAAE,UAAU;GACnB,MAAM;GACN;GACA,SAAQ;GACR,QAAO;GACP,UAAU,UAAU;GACpB,UAAU,cAAc,iBAAiB;GACzC,GAAI;IACJ;AAEJ,SACE,0DACI,CAAC,aACA,iBAAiB,SAChB,oCAAC;GAAiB,SAAS;GAAgB,OAAO;IAAa,GAE/D,gBAGH;;AAIP,QACE,0DACK,gBAAgB,KAAK,cAAc;AAClC,SAAO,0DAAG,qBAAqB,aAAa,UAAU,CAAI;GAC1D,CACH;;AAIP,+CAAe;;;;AClHf,MAAM,8BAA8B,UAAU;CAC5C,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,KAAK;CAE9D,MAAM,qBAAqB,YAAY,mBAAmB,MAAM,IAAI,CAAC;CAErE,MAAM,EAAE,qBAAqB,0BAC3B,wBAAwB;CAC1B,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,EAAE,qBAAqB,gBAAgB,iBAAiB;CAE9D,MAAM,oBAAoB,cAAc;AACtC,MACE,eACA,uBACA,YAAY,qBAEZ,QAAO,YAAY,sBAAsB,MAAM;IAEhD,CAAC,aAAa,oBAAoB,CAAC;CAEtC,MAAM,CAAC,EAAE,MAAM,iBAAiB,sBAAsB,eACpDC,gBAAc,iBACd,wBACA;EACE,QAAQ;EACR,MAAM;GACJ,WAAW;GACX,YAAY;GACZ,UAAU;GACV,gBAAgB,CACd;IACE,aAAa;IACb,gBAAgB;IAChB,aAAa,iBAAiB,mBAAmB;IAClD,CACF;GACF;EACF,CACF;CAED,MAAM,mBACJ,cACA,wBACA,aACA,iBACG;EACH,IAAI,gBAAgB;GAClB,MAAM;GACN,SAAS;GACT,YAAY;GACb;EACD,MAAM,mBAAmB;GAAE,GAAG;GAAa,GAAG;GAAe;EAC7D,MAAM,QAAQ,uBAAuB,WAClC,MAAM,EAAE,KAAK,aAAa,KAAK,YAAY,KAAK,aAAa,CAC/D;AACD,MAAI,SAAS,GACX,wBAAuB,SAAS;;CAIpC,MAAM,kCAAkC,aACrC,yBAAyB,4BAA4B;AAkCpD,SAjCkC,wBAAwB,KACvD,wBAAwB;GACvB,IAAI,0BAA0B,wBAAwB,MACnD,cAAc;IACb,IAAI,qBACF,UAAU,KAAK,MAAM,GAAG,EAAE,CAAC,aAAa,GACxC,UAAU,KAAK,MAAM,EAAE;AACzB,QAAI,UAAU,QAAQ,KACpB,sBAAqB,mBAAmB,aAAa;AAGvD,WAAO,sBAAsB,oBAAoB;KAEpD;AACD,OAAI,yBAAyB;IAC3B,IAAI,oBAAoB;KACtB,QACE,wBAAwB,WAAW,mBAAmB;KACxD,kBACE,wBAAwB,WAAW,mBAChC;KACL,cAAc,wBAAwB;KACvC;AACD,WAAO;KACL,GAAG;KACH,GAAG;KACJ;SAED,QAAO;IAGZ;IAIH,EAAE,CACH;CAED,MAAM,oCAAoC,sBAAsB;AAc9D,SAb8B,kBAAkB,QAAQ,kBAAkB;GACxE,MAAM,cACJ,cAAc,oBAAoB,kBAAkB;AACtD,OAAI,eAAe,OACjB,QACE,eAAe,qBAAqB,gBACpC,eAAe,qBAAqB,cACpC,cAAc,KAAK,aAAa,IAAI;OAGtC,QAAO,cAAc,KAAK,aAAa,IAAI;IAE7C;;CAIJ,MAAM,iBAAiB,YACrB,OAAO,yBAAyB,sBAAsB;EACpD,MAAM,yBACJ,kBAAkB,mBAAmB;AAEvC,MADoB,uBAAuB,eACxB,QAAW;GAC5B,MAAM,8BACJ,uBAAuB,KAAK,GAAG,MAAM,IAAI;GAC3C,IAAI,8BAA8B;IAChC;IACA;IACA;IACD;AACD,UAAO,QAAQ,IACb,4BAA4B,IAAI,OAAO,gBAAgB;AACrD,QACE,YAAY,aAAa,IAAI,QAC7B,CAAC,4BAA4B,SAAS,YAAY,aAAa,CAAC,EAChE;KACA,IAAI,cAAc,wBAAwB,MACvC,UAAU,MAAM,KAAK,aAAa,IAAI,YAAY,aAAa,CACjE;KACD,MAAM,eAAe,iBACnB,uBAAuB,WACxB;AACD,SAAI;MACF,MAAM,sBAAsB,MAAM,UAChCA,gBAAc,iBACd,GAAG,gBACH,EAAE,QAAQ,OAAO,CAClB;AAED,UAAI,oBAAoB,KAAK,SAAS,KAAK,YACzC,iBACE,oBAAoB,MACpB,yBACA,aACA,aACD;cAEI,OAAO;AACd,0BACE,IAAI,MACF,EAAE,sDAAsD,CACzD,CACF;;;KAGL,CACH;;IAGL,CAAC,qBAAqB,EAAE,CACzB;CAED,MAAM,+BAA+B,YACnC,OAAO,sBAAsB;EAC3B,IAAI,0BAA0B;AAE9B,4BAA0B,iCACxB,wBACD;EAID,IAAI,2BAF6B,MAAM,oBAAoB,EACT,KAAK,SAAS,GACjB,gBAAgB,QAC5D,cAAc,UAAU,WAAW,iBACrC;AAED,QAAM,QAAQ,IACZ,wBAAwB,KAAK,wBAAsB;AACjD,UAAO,eAAe,yBAAyBC,oBAAkB;IACjE,CACH;AAED,4BAA0B,wBAAwB,QAC/C,kBAAkB,CAAC,cAAc,mBAAmB,YACtD;AAMD,SAJsB,gCACpB,yBACA,wBACD;IAGH;EAAC;EAAoB;EAAiC;EAAe,CACtE;AAED,iBAAgB;AACd,MAAI,mBAAmB;GACrB,IAAI,aAAa,YAAY,kBAC1B,MAAM,IAAI,CAAC,GACX,MAAM,IAAI,CACV,KAAK;GACR,IAAI,sBAAsB,mBAAmB,MAC1C,kBACC,iBAAiB,cAAc,kBAAkB,IAAI,WACxD;AACD,OAAI,oBACF,8BAA6B,oBAAoB,WAAW,CAAC,MAC1D,iBAAiB;AAChB,wBAAoB,aAAa;KAEpC;;IAGJ;EAAC;EAA8B;EAAmB;EAAY,CAAC;CAElE,MAAM,qBAAqB,YACzB,OAAO,SACL,UACED,gBAAc,iBACd,kBAAkB,aAAa,cAAc,eAC7C,EACE,QAAQ,OACT,EACD,KACD,EACH,CAAC,YAAY,cAAc,CAC5B;CAED,MAAM,WAAW,YACf,OAAO,WAAW;AAEhB,OAD4B,MAAM,mBAAmB,EAAE,MAAM,QAAQ,CAAC,GAC7C,WAAW,IAClC,uBAAsB,EAAE,0CAA0C,CAAC;MAEnE,qBACE,IAAI,MAAM,EAAE,oDAAoD,CAAC,CAClE;IAGL;EAAC;EAAoB;EAAuB;EAAqB;EAAE,CACpE;CAED,MAAM,kBAAkB,cAAc;AACpC,MAAI,CAAC,iBACH,QAAO,EAAE;AAEX,SAAO;IACN,CAAC,iBAAiB,CAAC;AAEtB,QAAO,gBAAgB,UAAU,IAC/B,oCAAC,qBAAiB,GAElB,oCAAC,mBACC,oCAAC;EAAe;EAAU,KAAK;IAC7B,oCAACE;EACc;EACI;GACjB,CACG,CACK;;AAIlB,yCAAe;;;;AC3Pf,MAAM,mBAAmB,UAAU;CACjC,MAAM,EACJ,aAAa,oBACb,mBACA,qBACA,yBACA,4BACA,iBACA,gBACA,qBACA,yBACE;CACJ,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,CAAC,aAAa,kBAAkB,SAAS,EAAE;CACjD,MAAM,CAAC,aAAa,kBAAkB,SAAS,mBAAmB;CAClE,MAAM,CAAC,wBAAwB,6BAA6B,SAAS,EAAE,CAAC;CACxE,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;CACrD,MAAM,CAAC,oBAAoB,yBAAyB,SAAS,EAAE,CAAC;CAChE,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,KAAK;CAC1D,MAAM,CAAC,oBAAoB,yBAAyB,SAAS,MAAM;CACnE,MAAM,CAAC,cAAc,mBAAmB,SAAS,MAAM;CAEvD,MAAM,CAAC,EAAE,MAAM,WAAW,SAAS,2BAA2B,YAC5DC,gBAAc,iBACd,eACA,EAAE,CACH;CAED,MAAM,EAAE,yBAAyB,mCAC/B,qBAAqB,kBAAkB;CAEzC,MAAM,qBAAqB,YAAY,YAAY;AACjD,sBAAoB,KAAK;EACzB,MAAM,WAAW,MAAM,UACrBA,gBAAc,iBACd,kBAAkB,mBAAmB,cAAc,QACnD,EACE,QAAQ,OACT,CACF;AACD,MAAI,UAAU,WAAW,IACvB,gBAAe,SAAS,KAAK;AAE/B,sBAAoB,MAAM;IACzB,CAAC,mBAAmB,eAAe,oBAAoB,CAAC;CAE3D,MAAM,UAAU,OAAO,KAAK;CAC5B,MAAM,yBAAyB,OAAO,KAAK;CAE3C,MAAM,uBAAuB,kBAAkB;AAC7C,yBAAuB,SAAS,gBAAgB;IAC/C,EAAE,CAAC;CAEN,MAAM,sBAAsB,kBAAkB;AAC5C,yBAAuB,SAAS,MAAM,SAAS;IAC9C,EAAE,CAAC;CAEN,MAAM,oBAAoB,YAAY,YAAY;AAChD,sBAAoB,KAAK;AACzB,QAAM,QAAQ,SAAS,MAAM,QAAQ;AACrC,sBAAoB,MAAM;AAC1B,mBAAiB;IAChB;EAAC;EAAiB;EAAqB;EAAQ,CAAC;CAEnD,MAAM,CACJ,EACE,MAAM,4BACN,SAAS,sCAEX,+BACE,eACFA,gBAAc,iBACd,mCACA;EACE,QAAQ;EACR,MAAM;GACJ,UAAU;GACV,gBAAgB,CACd;IACE,aAAa;IACb,aAAa,YAAY;IACzB,gBAAgB;IACjB,EACD;IACE,aAAa;IACb,aAAa;IACb,gBAAgB;IACjB,CACF;GACF;EACF,CACF;CAED,MAAM,CAAC,EAAE,MAAM,8BAA8B,kCAC3C,eACE,QAAQ,IAAI,4BACZ,uCACA;EACE,QAAQ;EACR,MAAM;GACJ,UAAU;GACV,gBAAgB,CACd;IACE,aAAa;IACb,aAAa,YAAY;IACzB,gBAAgB;IACjB,CACF;GACF;EACF,CACF;CAEH,MAAM,EAAE,oBAAoB,aAAa;CAEzC,MAAM,iBAAiB,YAAY,YAAY;AAC7C,MAAI;AAEF,8BADiB,MAAM,6BAA6B,EACjB,KAAK,SAAS;AACjD,uBAAoB;WACb,OAAO;AACd,WAAQ,MAAM,gCAAgC,MAAM;AACpD,OAAI,OAAO,YAAY,WACrB,iBACE,sHACA;IACE,SAAS;IACT,cAAc;KAAE,UAAU;KAAO,YAAY;KAAU;IACxD,CACF;;IAGJ;EAAC;EAA6B;EAAiB;EAAmB,CAAC;CAEtE,MAAM,WAAW;EAAC,EAAE,UAAU;EAAE,EAAE,UAAU;EAAE,EAAE,cAAc;EAAE,EAAE,QAAQ;EAAC;CAE3E,MAAM,iBAAiB,cAAc;EACnC,MAAM,QAAQ,CACZ;GACE,OAAO;GACP,YAAY;IACV,OAAO,YAAY,wCAAwC;IAC3D,QACE,+BACE,YAAY,wCAAwC,SACjD;IACR;GACF,CACF;AACD,MAAI,aAAa,kBACf,OAAM,KAAK;GACT,OAAO;GACP,OAAO,GAAG,YAAY;GACvB,CAAC;AAEJ,SAAO;IACN,CAAC,aAAa,+BAA+B,CAAC;CAEjD,MAAM,oBAAoB,YAAY,YAAY;AAChD,MAAI,CAAC,mBAAmB,OACtB,OAAM,IAAI,MAAM,4BAA4B;EAE9C,MAAM,WAAW,IAAI,UAAU;AAC/B,qBAAmB,SAAS,SAAS,SAAS,OAAO,SAAS,KAAK,CAAC;AACpE,WAAS,OACP,oBACA,eAAe,4BAChB;AAED,MAAI;AACF,yBAAsB,KAAK;AAC3B,SAAM,UACJA,gBAAc,iBACd,wCAAwC,YAAY,cAAc,UAClE;IACE,QAAQ;IACR,SAAS;KACP,eAAe,YAAY;KAC3B,kBAAkB,eAAe;KAClC;IACD,MAAM;IACP,CACF;AAED,SAAM,gBAAgB;AACtB,yBAAsB,EAAE,CAAC;AACzB,8BAA2B,EAAE,aAAa,OAAO,CAAC;AAElD,mBAAgB,+BAA+B;IAC7C,SAAS;IACT,cAAc;KACZ,UAAU;KACV,YAAY;KACb;IACF,CAAC;WACK,OAAO;AACd,mBACE,iHACA;IACE,SAAS;IACT,cAAc;KACZ,UAAU;KACV,YAAY;KACb;IACF,CACF;AACD,SAAM;YACE;AACR,yBAAsB,MAAM;;IAE7B;EACD;EACA;EACA;EACA;EACA;EACA,YAAY;EACb,CAAC;CAEF,MAAM,qBAAqB,cACnB;EACJ;GACE,MAAM,wBAAwB;GAC9B,kBACE,2BAA2B,EAAE,iBAAiB,OAAO,CAAC;GACxD,OAAO;GACP,UACE,oCAACC;IACc;IACb,sBAAsB;AACpB,gCAA2B,EACzB,iBAAiB,OAClB,CAAC;AACF,yBAAoB;;IAEL;KACjB;GAEL;EACD;GACE,MAAM,wBAAwB;GAC9B,kBAAkB,2BAA2B,EAAE,aAAa,OAAO,CAAC;GACpE,OAAO;GACP,aAAa;GACb,mBAAmB,CAAC,kBAAkB,mBAAmB,UAAU;GACnE,gBAAgB;AACd,uBAAmB,CAChB,WAAW,iBAAiB,CAAC,CAC7B,OAAO,UAAU,QAAQ,MAAM,MAAM,CAAC;;GAE3C,UACE,oCAAC;IACC,iBAAiB;IACD;IACG;IACC;IACG;IACH;IACG;IACV;IACb,qBAAqB;IACrB,wBAAwB;IACN;IACC;IACN;IACG;KAChB;GAEL;EACD;GACE,MAAM,wBAAwB;GAC9B,kBAAkB,2BAA2B,EAAE,OAAO,OAAO,CAAC;GAC9D,OAAO;GACP,aAAa;GACb,gBAAgB;GAChB,iBAAiB;GACjB,UAAU;GACV,UACE,oCAAC;IACC,KAAK;IACL,mBAAmB,aAAa;IAChC,sBAAsB;AACpB,gCAA2B,EAAE,OAAO,OAAO,CAAC;AAC5C,qBAAgB,KAAK;;IAEZ;IACY;KACvB;GAEL;EACF,EACD;EACE,wBAAwB;EACxB,wBAAwB;EACxB,wBAAwB;EACxB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;CAED,MAAM,0BAA0B,cAAc;AAC5C,SAAO,wBACL,6BAA6B,gCAC9B;IACA,CAAC,wBAAwB,CAAC;AAE7B,iBAAgB;AACd,GAAC,YAAY;AACX,OAAI,CAAC,2BACH,iBAAgB;MAEhB;IACH,CAAC,4BAA4B,eAAe,CAAC;AAEhD,iBAAgB;AACd,MAAI,CAAC,4BAA4B;AAC/B,yBAAsB,KAAK;AAC3B,mCAAgC,CAAC,WAAW;AAC1C,0BAAsB,MAAM;KAC5B;;IAEH,CAAC,gCAAgC,2BAA2B,CAAC;AAEhE,QACE,0DACE,oCAAC,SAAI,WAAU,gCACb,oCAAC,SAAI,WAAW,mDACd,oCAAC,SAAI,WAAU,4CAAgD,EAC/D,oCAAC,SAAI,WAAU,+CACb,oCAAC,SAAI,WAAU,6CACZ,eAAe,KAAK,eAAe;AAClC,SACE,oCAACC;GACC,KAAK,WAAW;GAChB,OAAO,WAAW;GAClB,YAAY,WAAW;GACvB,OAAO,WAAW;IAClB;GAEJ,CACE,EACN,oCAAC,SAAI,WAAU,+CACb,oCAAC;EACC,OAAM;EACN,eAAe;AACb,8BAA2B,EAAE,aAAa,MAAM,CAAC;;IAGnD,oCAAC;EACC,WAAW;EACX,WAAU;EACV,MAAK;GACL,EACD,aACY,EACf,oCAAC;EACC,OAAM;EACN,eAAe;AACb,8BAA2B,EAAE,OAAO,MAAM,CAAC;;IAG7C,oCAAC;EACC,WAAW;EACX,WAAU;EACV,MAAK;GACL,EACD,OACY,CACX,EACN,oCAAC,SAAI,WAAU,aACb,oCAACC,gBAAU,CACP,EACN,oCAAC,SAAI,WAAU,qCACb,oCAAC;EACC,OAAO;EACP,WAAW,OAAO,aAAa;AAC7B,kBAAe,SAAS;;EAE1B,SAAS,SAAS,KAAK,aAAa,EAAE,OAAO,SAAS,EAAE;EACxD,aAAa;GACb,CACE,CACF,EACN,oCAAC,SAAI,WAAU,aACb,oCAACA,gBAAU,CACP,CACF,EAEN,oCAAC,SAAI,WAAU,qCACb,oCAAC,aACC,oCAAC;EAAY,OAAO;EAAa,OAAO,gBAAgB;IACrD,0BACC,oCAACC;EACoB;EACnB,yBACE,6BAA6B;EAEtB;EACI;EACS;GACtB,GAEF,oCAACC;EACc;EACJ;GACT,CAEQ,EAEd,oCAAC;EAAY,OAAO;EAAa,OAAO,gBAAgB;IACtD,oCAAC,uBAAoB,eAAe,aAAa,gBAAiB,CACtD,EACd,oCAAC;EACC,OAAO;EACP,OAAO,gBAAgB;IAEvB,oCAAC;EACC,wBAAwB;EACxB,WAAW;GACX,CACU,EACd,oCAAC;EAAY,OAAO;EAAa,OAAO,gBAAgB;IACtD,oCAAC;EACC,mBAAmB,aAAa;EAClB;EACG;EACN;EACX,sBAAsB;GACtB,CACU,CACV,CACF,EACL,eAAe,gBAAgB,WAC9B,oCAAC,SAAI,WAAU,uCACb,oCAACC;EACoB;EACE;EACrB,gBAAgB;EAChB,qBAAqB;GACrB,CACE,CAEJ,EAEL,2BAEC,mBAAmB,KAAK,SAAS;AAC/B,SACE,oCAAC;GACC,KAAK,KAAK;GACV,MAAM,KAAK;GACX,OAAO;GACP,OAAO,KAAK;GACZ,SAAS,KAAK;GACd,aAAa,MAAM;GACnB,mBAAmB,MAAM;GACzB,gBAAgB,MAAM;GACtB,iBAAiB,MAAM;GACvB,UAAU,MAAM;GAChB,OAAM;KAEL,KAAK,SACI;GAEd,CACH;;AAIP,8BAAe;;;;ACvff,MAAM,2BAA2B,UAAU;CACzC,MAAM,EACJ,YACA,iBACA,6BACA,aACA,mBACA,YACA,oBACE;CAEJ,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,MAAM;CAC/D,MAAM,CAAC,2BAA2B,gCAChC,SAAS,MAAM;CACjB,MAAM,CACJ,wCACA,6CACE,SAAS;EACX,aAAa;EACb,iBAAiB;EACjB,OAAO;EACR,CAAC;CACF,MAAM,CAAC,YAAY,iBAAiB,SAAS,MAAM;CACnD,MAAM,CAAC,0BAA0B,+BAC/B,SAAS,MAAM;CACjB,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,MAAM;CAEjE,MAAM,EAAE,uBAAuB,wBAC7B,wBAAwB;CAE1B,MAAM,EACJ,iBACA,4BACA,yBACA,4BACE,qBAAqB,kBAAkB;CAE3C,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,UAAU,OAAO,KAAK;CAC5B,MAAM,gBAAgB,QAAQ;CAC9B,MAAM,iBAAiB,YAAY,SAAS;CAC5C,MAAM,uBAAuB,aAAa;CAE1C,MAAM,0BAA0B;AAC9B,gBAAc,MAAM;;CAGtB,MAAM,wCAAwC;AAC5C,8BAA4B,MAAM;;CAGpC,MAAM,0BAA0B,YAAY,YAAY;AAUtD,OARiB,MAAM,UACrBC,gBAAc,iBACd,kBAAkB,aAAa,cAAc,oBAC7C,EACE,QAAQ,QACT,CACF,GAEa,WAAW,KAAK;AAC5B,mBAAgB,QAAQ,MAAM;AAC9B,oBAAiB;AACjB,yBAAsB,EAAE,2CAA2C,CAAC;QAEpE,qBACE,IAAI,MAAM,EAAE,qDAAqD,CAAC,CACnE;IAEF;EACD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,sCAAsC,YAAY,YAAY;AAClE,MAAI;AACF,gCAA6B,KAAK;AAClC,SAAM,yBAAyB;WACxB,OAAO;AACd,uBAAoB,MAAM;YAClB;AACR,gCAA6B,MAAM;AACnC,sBAAmB;;IAEpB,CAAC,yBAAyB,oBAAoB,CAAC;CAElD,MAAM,uBAAuB,sBAAsB,mBAC/C,MAAM,IAAI,EACV,KAAK;CAET,MAAM,4BAA4B,YAAY,YAAY;AACxD,sBAAoB,KAAK;AACzB,QAAM,QAAQ,SAAS,MAAM,QAAQ;AACrC,sBAAoB,MAAM;AAC1B,kBAAgB,OAAO,MAAM;AAC7B,mBAAiB;IAChB;EAAC;EAAiB;EAAiB;EAAQ,CAAC;CAE/C,MAAM,uBAAuB,YAAY,YAAY;AACnD,sBAAoB,KAAK;AACzB,QAAM,QAAQ,SAAS,MAAM,QAAQ;AACrC,sBAAoB,MAAM;AAC1B,kBAAgB,kBAAkB,MAAM;AACxC,mBAAiB;IAChB;EAAC;EAAiB;EAAiB;EAAQ,CAAC;CAE/C,MAAM,wBAAwB,kBAAkB;AAC9C,MAAI,CAAC,kBACH,2CAA0C,EAAE,gBAAgB,MAAM,CAAC;MAEnE,6BAA4B,KAAK;IAElC,CAAC,kBAAkB,CAAC;CAEvB,MAAM,oCAAoC,kBAAkB;AAC1D,8BAA4B,MAAM;AAClC,4CAA0C,EAAE,gBAAgB,MAAM,CAAC;IAClE,EAAE,CAAC;CAEN,MAAM,gBAAgB,cAAc;AAClC,SAAO,wBACL,6BAA6B,qBAC9B;IACA,CAAC,wBAAwB,CAAC;CAE7B,MAAM,sBAAsB,cAAc;AACxC,MAAI,cACF,QACE,oCAAC;GAAc,QAAQ;GAAe,cAAc,EAAE,aAAa;IAAI;MAGzE,QAAO,oCAACC,2BAA6B,cAAe;IAErD,CAAC,aAAa,cAAc,CAAC;CAEhC,MAAM,sBAAsB,cAAc;AACxC,SAAO,2BAA2B,YAAY;IAC7C,CAAC,4BAA4B,YAAY,CAAC;CAE7C,MAAM,mBAAmB,cAAc;AACrC,SAAO,wBAAwB,YAAY,IAAI;IAC9C;EAAC;EAAyB;EAAa;EAAqB,CAAC;CAEhE,MAAM,gBAAgB,cAAc;AA6GlC,SA5Ga;GACX;IACE,MAAM,WAAW;IACjB,kBAAkB,gBAAgB,OAAO,MAAM;IAC/C,OAAO;IACP,OAAO;IACP,UAAU;IACV,UACE,oCAACC;KACoB;KACnB,yBACE,6BAA6B;KAEtB;MACT;IAEJ,aAAa;IACd;GACD;IACE,MAAM,WAAW;IACjB,kBAAkB,gBAAgB,QAAQ,MAAM;IAChD,OAAO,aAAa,MAAM,mBAAmB;IAC7C,OAAO;IACP,UAAU;IACV,aAAa,CAAC,gBAAgB,aAAa;IAC5C;GACD;IACE,MAAM,WAAW;IACjB,kBAAkB,gBAAgB,QAAQ,MAAM;IAChD,OAAO,oBAAoB,aAAa,MAAM;IAC9C,OAAO;IACP,aAAa;IACb,gBAAgB;AACd,SAAI,cAAc,QAChB,eAAc,QAAQ,sBAAsB;;IAGhD,UACE,oCAACC;KAC8B;KACd;KACF;KACD;KACS;MACrB;IAEL;GACD;IACE,MAAM,WAAW;IACjB,kBAAkB,gBAAgB,UAAU,MAAM;IAClD,OAAO,sBAAsB,WAAW,GAAG;IAC3C,OAAO;IACP,UACE,oCAACC;KACc;KACb,sBAAsB;AACpB,sBAAgB,UAAU,MAAM;;KAEjB;MACjB;IAEL;GACD;IACE,MAAM,WAAW;IACjB,kBAAkB,gBAAgB,QAAQ,MAAM;IAChD,OAAO,QAAQ,WAAW,GAAG;IAC7B,OAAO;IACP,aAAa;IACb,mBAAmB;IACnB,UAAU;IACV,gBAAgB,WAAW;IAC3B,mBAAmB,uBAAuB,CAAC;IAC3C,uBAAuB,cAAc,KAAK;IAC1C,UACE,oCAACC;KACc;KACM;KACE;KACrB,yBAAyB;KACzB,4BACE;KAEe;KACjB,sBAAsB,gBAAgB,QAAQ,MAAM;KAC/B;KACC;MACtB;IAEL;GACD;IACE,MAAM,WAAW;IACjB,kBAAkB,gBAAgB,kBAAkB,MAAM;IAC1D,OAAO,uBAAuB;IAC9B,OAAO;IACP,UAAU;IACV,UACE,oCAACH;KACoB;KACnB,yBACE,6BAA6B;KAEtB;KACI;MACb;IAEJ,aAAa;IACd;GACF;IAEA;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEF,QACE,0DACG,cACC,cAAc,KAAK,SAAS;AAC1B,SACE,oCAAC;GACC,KAAK,KAAK;GACV,MAAM,KAAK;GACX,OAAO;GACP,OAAO,KAAK;GACZ,SAAS,KAAK;GACd,WACE,WAAW,yBAAyB,WAAW;GAEjD,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB,OAAM;GACN,gBAAgB,MAAM;GACtB,iBAAiB,MAAM;GACvB,mBAAmB,MAAM;GACzB,mBAAmB,MAAM;GACzB,UAAU;GACV,SAAQ;KAER,oCAAC,aAAK,KAAK,SAAe,CAChB;GAEd,EACJ,oCAAC;EACC,OAAO,EAAE,oBAAoB;EAC7B,SAAS,kDACP,aAAa,qBAAqB,GACnC;EACD,UAAU,EAAE,UAAU;EACtB,WAAW;EACX,UAAU,EAAE,SAAS;EACrB,WAAW;EACX,MAAM;EACN,aAAa;EACb,SAAS;GACT,EACF,oCAAC;EACC,OAAO,EAAE,kBAAkB;EAC3B,SAAS;EACT,UAAU,EAAE,UAAU;EACtB,WAAW;EACX,UAAU,EAAE,SAAS;EACrB,WAAW;EACX,MAAM;EACN,aAAa;EACb,SAAS;GACT,CACD;;AAIP,sCAAe;;;;AC1Vf,MAAa,sBAAsB,UAAU,EAAE,KAAK;CAClD,MAAM,EAAE,mBAAmB,YAAY,iBAAiB,qBACtD;CAEF,MAAM,CAAC,YAAY,iBAAiB,SAAS,qBAAqB,KAAK;CACvE,MAAM,CAAC,MAAM,WAAW,SAAS,OAAU;CAC3C,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,CAAC,OAAO,YAAY,SAAS,OAAU;CAC7C,MAAM,CAAC,SAAS,cAAc,SAAS,OAAU;CAEjD,MAAM,EAAE,qBAAqB,2BAA2B,qBAAqB;CAE7E,MAAM,kBAAkB,aAAa,aAAa;AAChD,WAAS,OAAU;AACnB,aAAW,MAAM;AACjB,UAAQ,SAAS;IAChB,EAAE,CAAC;AAMN,iBAAgB;AACd,MAAI,mBAAmB;AACrB,iBAAc,kBAAkB;AAChC;;AAGF,MAAI,CAAC,WAAY;AAEjB,aAAW,KAAK;EAEhB,MAAM,gBAAgB,UACpBI,gBAAc,iBACd,6BAA6B,aAC3B,mBAAmB,mBACf,oBAAoB,gBAAgB,oBAAoB,qBACxD,MAEN,EAAE,CACH;AAED,gBACG,MAAM,QAAQ;GACb,MAAM,QAAQ,IAAI,MAAM;AAExB,OAAI,OAAO;AACT,kBAAc,MAAM;AACpB,2BAAuB,GAAG,QAAQ,IAAI,MAAM,CAAC;AAC7C,oBAAgB,IAAI,KAAK;SAEzB,UAAS,yCAAyC;IAEpD,CACD,MAAM,SAAS,CACf,cAAc,WAAW,cAAc,CAAC;IAC1C;EAAC;EAAmB;EAAY;EAAiB;EAAiB,CAAC;AAMtE,iBAAgB;AACd,MAAI,CAAC,WAAY;AAGjB,MAAI,oBAAoB,aAAa;AACnC,mBAAgB,oBAAoB,YAAY;AAChD;;AAGF,aAAW,KAAK;EAEhB,MAAM,eAAe,UACnBA,gBAAc,iBACd,sBAAsB,WAAW,4BACjC,EAAE,CACH;AAED,eACG,MAAM,QAAQ;GACb,MAAM,kBAAkB,IAAI;AAC5B,0BAAuB,GAAG,aAAa,iBAAiB,CAAC;AACzD,mBAAgB,gBAAgB;IAChC,CACD,MAAM,SAAS,CACf,cAAc,WAAW,aAAa,CAAC;IACzC;EACD;EACA;EACA;EACA;EACD,CAAC;AAEF,QAAO;EAAE;EAAM;EAAS;EAAO;EAAS;;;;;AChG1C,MAAa,8BAA8B;CACzC,MAAM,EAAE,WAAW,aAAa;CAChC,MAAM,eAAe,cAAc,IAAI,gBAAgB,OAAO,EAAE,CAAC,OAAO,CAAC;AA+CzE,QA7CoB,cAAc;EAChC,MAAM,yBAAyB,EAAE;AAEjC,eAAa,SAAS,OAAO,QAAQ;AACnC,OAAI,IAAI,WAAW,cAAc,EAAE;IACjC,MAAM,YAAY,IAAI,QAAQ,eAAe,GAAG;IAChD,MAAM,kBAAkB,UAAU,YAAY,IAAI;AAElD,QAAI,oBAAoB,IAAI;KAC1B,MAAM,QAAQ,UAAU,UAAU,GAAG,gBAAgB;KAErD,MAAM,WADQ,UAAU,UAAU,kBAAkB,EAAE,CAC/B,QAAQ,cAAc,GAAG,SAC9C,KAAK,aAAa,CACnB;KAGD,MAAM,EAAE,YAAY,WAAW,gBAC7B,iBAAiB,MAAM;AAEzB,SAAI,uBAAuB,OAEzB,wBAAuB,OAAO,WAAW,KAAK;MAChC;MACZ,MAAM;OACL,YAAY;MACd,CAAC;SAEF,wBAAuB,SAAS;MAClB;MACZ,UAAU;MACV,YAAY,CACV;OACc;OACZ,MAAM;QACL,YAAY;OACd,CACF;MACF;;;IAIP;AACF,SAAO;IACN,CAAC,aAAa,CAAC;;AAKpB,MAAM,oBAAoB,UAAU;AAIlC,KAFE,CAAC,MAAM,KAAK,MAAM,MAAM,CAAC,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,IAAI,EAGxE,QAAO;EACL,YAAY;EACZ,WAAW;EACX,aAAa;EACd;AAGH,KAAI,CAAC,MAAM,MAAM,IAAI,CAAC,MAAM,WAAW,MAAM,CAAC,CAC5C,QAAO;EACL,YAAY;EACZ,WAAW;EACX,aAAa,OAAO,MAAM;EAC3B;AAGH,QAAO;EACL,YAAY;EACZ,WAAW;EACX,aAAa;EACd;;;;;AChDH,MAAM,uBAAuB,UAAU;CACrC,MAAM,EACJ,oBAAoB,IACpB,YAAY,oBAAoB,IAChC,iBACA,kBACA,oBACA,wBACA,gBACE;CAEJ,MAAM,CAAC,gBAAgB,qBAAqB,SAAS;EACnD,gBAAgB;EAChB,gBAAgB;EAChB,iBAAiB;EACjB,iBAAiB;EACjB,uBAAuB;EACvB,gBAAgB;EACjB,CAAC;CACF,MAAM,CAAC,qBAAqB,0BAA0B,SAAS,KAAK;CACpE,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAE5C,MAAM,EACJ,MAAM,iBACN,SAAS,wBACT,OAAO,yBACL,mBAAmB;EACF;EACnB,YAAY;EACK;EACC;EACnB,CAAC;AAEF,sBAAqB,iBAAiB,kBAAkB;CACxD,MAAM,cAAc,uBAAuB;CAE3C,MAAM,mBACJ,YACA,YACA,aACA,QAAQ,QACL;AACH,MAAI,cAAc,MAChB,mBAAkB;GAAE,gBAAgB;GAAmB;GAAO,CAAC;WACtD,cAAc,OACvB,mBAAkB;GAAE,iBAAiB;GAAmB;GAAO,CAAC;WACvD,cAAc,OACvB,mBAAkB;GAAE,iBAAiB;GAAmB;GAAO,CAAC;WACvD,cAAc,aACvB,mBAAkB;GAAE,uBAAuB;GAAmB;GAAO,CAAC;WAC7D,cAAc,SACvB,mBAAkB;GAAE,gBAAgB;GAAmB;GAAO,CAAC;WACtD,cAAc,iBACvB,mBAAkB;GAAE,gBAAgB;GAAmB;GAAO,CAAC;AAEjE,yBAAuB,YAAY;;CAGrC,MAAM,oCAAoC;CAE1C,MAAM,wBAAwB,aAAa,QAAQ;AACjD,aAAW,IAAI;IACd,EAAE,CAAC;CAEN,MAAM,aAAa,cAAc;AAC/B,MAAI,gBAEF,QAD2B,gBAAgB,WAAW,MAAM,IAAI,CACtC,KAAK;AAEjC,SAAO;IACN,CAAC,iBAAiB,kBAAkB,CAAC;AAExC,KAAI,CAAC,gBACH,QACE,oCAAC,SAAI,WAAU,kCACb,oCAAC,oBAAiB,MAAM,KAAM,CAC1B;AAIV,QACE,0DACE,oCAACC;EACC,mBAAmB,iBAAiB;EACnB;EACL;EACY;EACJ;EACI;EACxB,0BAA0B;AACxB,mBAAgB,OAAO,KAAK;;EAE9B,sBAAsB,gBAAgB;AACpC,mBAAgB,QAAQ,MAAM,YAAY;;EAE5C,sBAAsB,gBAAgB;AACpC,mBAAgB,QAAQ,MAAM,YAAY;;EAE5C,4BAA4B,gBAAgB;AAC1C,mBAAgB,cAAc,MAAM,aAAa,IAAK;;EAExD,gCAAgC,gBAAgB;AAC9C,mBAAgB,UAAU,MAAM,YAAY;;EAE9C,qBAAqB,gBAAgB;AACnC,mBAAgB,kBAAkB,MAAM,YAAY;;EAE/B;EACvB,uBAAuB;AACrB,YAAS,mBAAmB;;EAErB;EACT,oBAAoB;EACpB,oBAAoB;GACpB,EAEF,oCAACC;EACC,YAAY;EACK;EACY;EAC7B,aAAa;EACb,mBAAmB,iBAAiB;EACxB;EACZ,uBAAuB;AACrB,YAAS,mBAAmB;;GAE9B,CACD;;AAIP,kCAAe"}
@@ -108,11 +108,11 @@ const UserFormFields = (props) => {
108
108
  }, /* @__PURE__ */ React.createElement(FormControlLabel, {
109
109
  value: "standard",
110
110
  control: /* @__PURE__ */ React.createElement(Radio, null),
111
- label: t("Standard (Create & Password)")
111
+ label: t("Standard (Email & Password)")
112
112
  }), /* @__PURE__ */ React.createElement(FormControlLabel, {
113
113
  value: "invite",
114
114
  control: /* @__PURE__ */ React.createElement(Radio, null),
115
- label: t("Invite User (Send Email Link)")
115
+ label: t("Invite Entra User (Secure Email Invite Link)")
116
116
  }))), /* @__PURE__ */ React.createElement(Field$1, {
117
117
  component: TextField,
118
118
  label: t("First Name"),
@@ -343,5 +343,5 @@ const UserForm = (props) => {
343
343
  var UserForm_default = UserForm;
344
344
 
345
345
  //#endregion
346
- export { UserForm_default as n, isPasswordValid as r, UserForm as t };
347
- //# sourceMappingURL=UserForm-DNgeQvad.js.map
346
+ export { isPasswordValid as i, UserForm_default as n, UserFormFields as r, UserForm as t };
347
+ //# sourceMappingURL=UserForm-CBm_ZIJx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserForm-CBm_ZIJx.js","names":["useStyles","Field","PasswordValidator","Form","UserFormFields"],"sources":["../src/shell/ui/addUser/PasswordValidator.jsx","../src/shell/ui/addUser/UserFormFields.jsx","../src/shell/ui/addUser/UserForm.jsx"],"sourcesContent":["import React, { useMemo } from 'react';\nconst validatePassword = (\n password,\n lengthRestriction = 0,\n upperCaseRestriction = false,\n specialCharacterRestriction = false,\n numberRestriction = false,\n lowerCaseRestriction = false\n) => {\n let issues = [];\n if(!password) return [];\n if (lengthRestriction && password.length < lengthRestriction) {\n issues.push(\n `Password must be at least ${lengthRestriction} characters long.`\n );\n }\n if (upperCaseRestriction && !/[A-Z]/.test(password)) {\n issues.push('Password must contain at least one uppercase letter.');\n }\n if (specialCharacterRestriction && !/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\n issues.push('Password must contain at least one special character.');\n }\n if (numberRestriction && !/\\d/.test(password)) {\n issues.push('Password must contain at least one number.');\n }\n if (lowerCaseRestriction && !/[a-z]/.test(password)) {\n issues.push('Password must contain at least one lowercase letter.');\n }\n return issues;\n};\nexport const isPasswordValid = (\n password,\n lengthRestriction = 0,\n upperCaseRestriction = false,\n specialCharacterRestriction = false,\n numberRestriction = false,\n lowerCaseRestriction = false\n) => {\n return (\n validatePassword(\n password,\n lengthRestriction,\n upperCaseRestriction,\n specialCharacterRestriction,\n numberRestriction,\n lowerCaseRestriction\n ).length === 0\n );\n};\nconst PasswordValidator = ({\n password,\n lengthRestriction,\n upperCaseRestriction,\n specialCharacterRestriction,\n numberRestriction,\n lowerCaseRestriction,\n}) => {\n const issues = useMemo(\n () =>\n validatePassword(\n password,\n lengthRestriction,\n upperCaseRestriction,\n specialCharacterRestriction,\n numberRestriction,\n lowerCaseRestriction\n ),\n [password]\n );\n\n return issues?.length && password?.length ? (\n <div>\n <p style={{ color: 'red' }}>\n {issues.map((issue, index) => (\n <>\n {issue}\n <br />\n </>\n ))}\n </p>\n </div>\n ) : null;\n};\n\nexport default PasswordValidator;\n","import {\n Checkbox,\n FormControlLabel,\n makeStyles,\n TextField,\n RadioGroup,\n Radio,\n InputAdornment,\n IconButton,\n FormControl,\n FormLabel\n} from '@material-ui/core';\nimport React, { useState, useMemo, useCallback, useEffect } from 'react';\nimport { ADUserTypeEnums } from '../../../enums/unitySystemEnums';\nimport { useUser } from '../../../utilities/auth/useUser';\nimport { Field } from '../../../utilities/form/Field';\nimport { Visibility, VisibilityOff } from '@material-ui/icons';\nimport { useForm } from 'react-final-form';\nimport PasswordValidator, { isPasswordValid } from './PasswordValidator';\nimport { useTranslation } from 'react-i18next';\nimport { FluentTextFieldAutoComplete } from '../../../UI/inputs/textField/FluentTextFieldAutoComplete';\n\n\nconst removeWhiteSpace = str => {\n if (!str) {\n return '';\n }\n return str.replace(/\\s/g, '');\n};\n\n\n\nconst useStyles = makeStyles(theme => ({\n field: {\n marginBottom: theme.spacing(2),\n },\n selectors: {\n display: 'flex',\n flexDirection: 'row',\n marginBottom: theme.spacing(1),\n },\n alert: {\n marginTop: theme.spacing(-2),\n marginBottom: theme.spacing(2),\n },\n accountDisabledCheckbox: {\n height: 'auto',\n },\n accountDisabledCheckboxLabel: {\n marginTop: theme.spacing(1),\n },\n creationMethodGroup: {\n marginBottom: theme.spacing(2),\n flexDirection: 'row',\n },\n}));\n\n\nexport const UserFormFields = props => {\n const {\n editedUser,\n rolesData,\n showRolesField = true,\n handlePasswordTypeChange,\n passwordType,\n creationMethod,\n handleCreationMethodChange,\n } = props;\n const classes = useStyles();\n const user = useUser();\n const [showPassword, setShowPassword] = useState(false);\n const form = useForm();\n const { t } = useTranslation();\n\n const roles = useMemo(() => {\n if (!rolesData) {\n return [];\n }\n rolesData.forEach(r => {\n r.label = r.name;\n r.value = r.name;\n });\n return rolesData\n .sort((a, b) => a.label.localeCompare(b.label))\n .sort((a, b) => a.productName.localeCompare(b.productName));\n }, [rolesData]);\n\n\n const handleClickShowPassword = useCallback(() => {\n setShowPassword(!showPassword);\n }, [showPassword]);\n\n useEffect(() => {\n if (editedUser) {\n form.change('givenName', editedUser.givenName);\n form.change('surname', editedUser.surname);\n form.change('jobTitle', editedUser.jobTitle);\n form.change('location', editedUser.location);\n form.change('mobilePhone', editedUser.mobilePhone);\n form.change('officePhone', editedUser.officePhone);\n }\n }, [editedUser, form]);\n\n return (\n <>\n {editedUser && (\n <Field\n component={TextField}\n label={t(\"Unity ID\")}\n id=\"unity-id\"\n udprecordid=\"udpRecord-UserFormFields-unity-id\"\n name=\"unityId\"\n fullWidth\n variant=\"outlined\"\n margin=\"normal\"\n size=\"small\"\n initialValue={\n editedUser?.userId\n }\n disabled={true}\n />\n )}\n\n {!editedUser && (\n <FormControl component=\"fieldset\" fullWidth>\n <FormLabel component=\"legend\">{t(\"Creation Method\")}</FormLabel>\n <RadioGroup\n aria-label=\"creation-method\"\n name=\"creation-method\"\n value={creationMethod}\n onChange={handleCreationMethodChange}\n className={classes.creationMethodGroup}\n >\n <FormControlLabel value=\"standard\" control={<Radio />} label={t(\"Standard (Email & Password)\")} />\n <FormControlLabel value=\"invite\" control={<Radio />} label={t(\"Invite Entra User (Secure Email Invite Link)\")} />\n </RadioGroup>\n </FormControl>\n )}\n\n <Field\n component={TextField}\n label={t(\"First Name\")}\n id=\"first-name\"\n udprecordid=\"udpRecord-UserFormFields-first-name\"\n name=\"givenName\"\n fullWidth\n variant=\"outlined\"\n margin=\"normal\"\n size=\"small\"\n required\n initialValue={editedUser?.givenName}\n disabled={!user.can.CAN_MANAGE_USERS}\n />\n <Field\n component={TextField}\n label={t(\"Last Name\")}\n id=\"last-name\"\n udprecordid=\"udpRecord-UserFormFields-last-name\"\n name=\"surname\"\n fullWidth\n variant=\"outlined\"\n margin=\"normal\"\n size=\"small\"\n required\n initialValue={editedUser?.surname}\n disabled={!user.can.CAN_MANAGE_USERS}\n />\n <Field\n component={TextField}\n label={t(\"Email\")}\n id=\"email\"\n udprecordid=\"udpRecord-UserFormFields-email\"\n name=\"email\"\n fullWidth\n variant=\"outlined\"\n margin=\"normal\"\n size=\"small\"\n required\n initialValue={editedUser?.email}\n disabled={editedUser && !user.can.CAN_MODIFY_EMAIL}\n validate={value => {\n if (\n !/^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/.test(\n value\n ) ||\n 64 < value.split('@')[0].length\n ) {\n return t('Invalid email address');\n }\n }}\n />\n <Field\n component={TextField}\n label={t(\"Title\")}\n id=\"title\"\n udprecordid=\"udpRecord-UserFormFields-title\"\n name=\"jobTitle\"\n fullWidth\n variant=\"outlined\"\n margin=\"normal\"\n size=\"small\"\n initialValue={\n typeof editedUser?.jobTitle === 'string'\n ? editedUser?.jobTitle.trim()\n : null\n }\n disabled={!user.can.CAN_MANAGE_USERS}\n parse={value => value} // makes empty string values get added to form submission object\n />\n <Field\n component={TextField}\n label={t(\"Location\")}\n id=\"location\"\n udprecordid=\"udpRecord-UserFormFields-location\"\n name=\"location\"\n fullWidth\n variant=\"outlined\"\n margin=\"normal\"\n size=\"small\"\n initialValue={\n typeof editedUser?.location === 'string'\n ? editedUser?.location.trim()\n : null\n }\n disabled={!user.can.CAN_MANAGE_USERS}\n parse={value => value}\n />\n <Field\n component={TextField}\n label={t(\"Mobile Phone\")}\n id=\"mobile-phone\"\n udprecordid=\"udpRecord-UserFormFields-mobile-phone\"\n name=\"mobilePhone\"\n fullWidth\n variant=\"outlined\"\n margin=\"normal\"\n size=\"small\"\n initialValue={removeWhiteSpace(editedUser?.mobilePhone)}\n disabled={\n !user.can.CAN_MANAGE_USERS ||\n editedUser?.userType === ADUserTypeEnums.Guest\n }\n parse={value => value}\n />\n <Field\n component={TextField}\n label={t(\"Office Phone\")}\n id=\"office-phone\"\n udprecordid=\"udpRecord-UserFormFields-office-phone\"\n name=\"officePhone\"\n fullWidth\n variant=\"outlined\"\n margin=\"normal\"\n size=\"small\"\n initialValue={removeWhiteSpace(editedUser?.officePhone)}\n disabled={\n !user.can.CAN_MANAGE_USERS ||\n editedUser?.userType === ADUserTypeEnums.Guest\n }\n parse={value => value}\n />\n {showRolesField && (\n <Field\n component={FluentTextFieldAutoComplete}\n label={t(\"Select Role\")}\n id=\"roles\"\n udprecordid=\"udpRecord-UserFormFields-roles\"\n name=\"roles\"\n fullWidth\n options={roles || []}\n textFieldProps={{\n id: 'roles',\n name: 'roles',\n }}\n optionKey={'label'}\n isMultiple={true}\n groupBy={(option) => option.productName}\n required\n />\n )}\n {!editedUser && creationMethod !== 'invite' && (\n <>\n <RadioGroup\n aria-labelledby=\"password-type\"\n name=\"password-type\"\n value={passwordType}\n onChange={handlePasswordTypeChange}\n >\n <FormControlLabel\n value=\"autoGeneratePassword\"\n control={<Radio />}\n label={t(\"Auto-generate password\")}\n udprecordid=\"udpRecord-UserFormFields-auto-generate-password\"\n />\n <FormControlLabel\n value=\"createPassword\"\n control={<Radio />}\n label={t(\"Let me create the password\")}\n udprecordid=\"udpRecord-UserFormFields-create-password\"\n />\n </RadioGroup>\n {passwordType === 'createPassword' && (\n <Field\n component={TextField}\n label={t(\"Password\")}\n id=\"passwordProfile\"\n udprecordid=\"udpRecord-UserFormFields-passwordProfile\"\n name=\"passwordProfile\"\n type={showPassword ? 'text' : 'password'}\n fullWidth\n variant=\"outlined\"\n margin=\"normal\"\n size=\"small\"\n autoComplete=\"new-password\"\n validate={value =>\n !isPasswordValid(value, 8, true, true, true, true) && (\n <PasswordValidator\n password={value}\n numberRestriction\n lowerCaseRestriction\n upperCaseRestriction\n lengthRestriction={8}\n specialCharacterRestriction\n />\n )\n }\n InputProps={{\n // <-- This is where the toggle button is added.\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n aria-label=\"toggle password visibility\"\n onClick={handleClickShowPassword}\n >\n {showPassword ? <Visibility /> : <VisibilityOff />}\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n )}\n </>\n )}\n {!editedUser && creationMethod !== 'invite' && (\n <FormControlLabel\n className={classes.accountDisabledCheckboxLabel}\n label={t('Do not activate account and do not send a welcome email.')}\n control={\n <Field\n component={Checkbox}\n id=\"account-disabled\"\n udprecordid=\"udpRecord-UserFormFields-account-disabled\"\n name={'locked'}\n type=\"checkbox\"\n disabled={!user.can.CAN_MANAGE_USERS}\n classes={classes}\n />\n }\n />\n )}\n </>\n );\n};\nexport default UserFormFields;\n","import { Divider, LinearProgress, makeStyles } from '@material-ui/core';\nimport React, { useCallback, useState } from 'react';\nimport { Form } from '../../../utilities/form/Form';\nimport { FormButtons } from '../../../utilities/form/FormButtons';\nimport { SubmitButton } from '../../../utilities/form/SubmitButton';\nimport { useAxiosGet } from '../../../../src/utilities/useAxiosGet';\nimport { useUser } from '../../../../src/utilities/auth/useUser';\nimport UserFormFields from './UserFormFields';\nimport { useTranslation } from 'react-i18next';\nimport { ConfigService } from '../../../configService';\n\n\nconst useStyles = makeStyles(theme => ({\n divider: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n loadingBar: {\n bottom: theme.spacing(-2),\n marginLeft: theme.spacing(-2),\n marginRight: theme.spacing(-2),\n },\n}));\n\nexport const UserForm = props => {\n const {\n submitUser,\n editedUser,\n creatingUser,\n tenant,\n updateCreatedUser,\n showRolesField = true,\n } = props;\n const classes = useStyles();\n const user = useUser();\n const [passwordType, setPasswordType] = useState('autoGeneratePassword');\n const [creationMethod, setCreationMethod] = useState('standard'); // 'standard' | 'invite'\n const { t } = useTranslation();\n\n\n // GET list of roles\n const [{ data: rolesData }] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `roles?userId=${user.id}&tenantId=${tenant?.tenantId}`,\n {},\n !!!tenant,\n false\n );\n\n const handlePasswordTypeChange = useCallback(event => {\n setPasswordType(event.target.value);\n }, []);\n\n const handleCreationMethodChange = useCallback(event => {\n setCreationMethod(event.target.value);\n }, []);\n\n const handleSubmitUser = useCallback(\n values => {\n if (submitUser) {\n if (creationMethod === 'invite') {\n values.isInvite = true;\n values.passwordProfile = null;\n } else if (passwordType === 'autoGeneratePassword') {\n values.passwordProfile = null;\n }\n\n if (updateCreatedUser && editedUser) {\n updateCreatedUser(values);\n } else {\n submitUser(values);\n }\n }\n },\n [submitUser, passwordType, creationMethod, updateCreatedUser, editedUser]\n );\n\n return (\n <>\n <Form onSubmit={handleSubmitUser}>\n <UserFormFields\n rolesData={rolesData}\n editedUser={editedUser}\n showRolesField={showRolesField}\n handlePasswordTypeChange={handlePasswordTypeChange}\n passwordType={passwordType}\n creationMethod={creationMethod}\n handleCreationMethodChange={handleCreationMethodChange}\n />\n {user.can.CAN_MANAGE_USERS && (\n <>\n <div className={classes.divider}>\n <Divider />\n </div>\n <FormButtons>\n <SubmitButton\n variant=\"contained\"\n color=\"primary\"\n disablePristine={false}\n disabled={creatingUser}\n udprecordid=\"udpRecord-UserFormFields-submit\"\n >\n {editedUser ? t('Update') : (creationMethod === 'invite' ? t('Send Invite') : t('Create'))}\n </SubmitButton>\n </FormButtons>\n </>\n )}\n </Form>\n {creatingUser && (\n <LinearProgress className={classes.loadingBar} color=\"secondary\" />\n )}\n </>\n );\n};\nexport default UserForm;\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { i as useHandleAxiosSnackbar } from "./apiHelpers-WIR8pqy0.js";
3
3
  import { t as apiMutate } from "./useAxiosMutate-DeqKSi5z.js";
4
4
  import { n as SideSheet } from "./SideSheet-CDXVa_Kr.js";
5
5
  import { t as useTenant } from "./useTenant-CGaZEBEJ.js";
6
- import { n as UserForm_default } from "./UserForm-DNgeQvad.js";
6
+ import { n as UserForm_default } from "./UserForm-CBm_ZIJx.js";
7
7
  import React, { useCallback, useState } from "react";
8
8
  import { useSnackbar } from "notistack";
9
9
  import { cloneDeep } from "lodash";
@@ -98,4 +98,4 @@ var UserFormSideSheet_default = UserFormSideSheet;
98
98
 
99
99
  //#endregion
100
100
  export { UserFormSideSheet_default as t };
101
- //# sourceMappingURL=UserFormSideSheet-RyDFg3QI.js.map
101
+ //# sourceMappingURL=UserFormSideSheet-7fHGhAER.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserFormSideSheet-RyDFg3QI.js","names":["UserForm"],"sources":["../src/shell/ui/addUser/UserFormSideSheet.jsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { SideSheet } from '../../../UI/surfaces/SideSheet';\nimport UserForm from './UserForm';\nimport { useSnackbar } from 'notistack';\nimport { apiMutate } from '../../../utilities/useAxiosMutate';\nimport { useTenant } from '../../../utilities/tenant/useTenant';\nimport { useHandleAxiosSnackbar } from '../../../utilities/apiHelpers';\nimport { cloneDeep } from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { ConfigService } from '../../../configService';\n\n\nconst UserFormSideSheet = ({\n open,\n onClose,\n}) => {\n const [loading, setLoading] = useState(false);\n const tenant = useTenant();\n const { t } = useTranslation();\n const { handleErrorSnackbar, handleSuccessSnackbar } = useHandleAxiosSnackbar();\n\n // Helper functions\n const getUserByEmail = useCallback(\n async email => {\n return await apiMutate(\n ConfigService.securityV1ApiUrl,\n `users/email/${email}`,\n { method: 'get' }\n );\n },\n []\n );\n\n const createUser = useCallback(\n async data => {\n return await apiMutate(\n ConfigService.securityV1ApiUrl,\n `users/${tenant?.activeTenant?.tenantId ?? ''}`,\n { method: 'post' },\n data\n );\n },\n [tenant]\n );\n\n const inviteUser = useCallback(\n async data => {\n return await apiMutate(\n ConfigService.securityV1ApiUrl,\n `users/${tenant?.activeTenant?.tenantId ?? ''}/invite`,\n { method: 'post' },\n data\n );\n },\n [tenant]\n );\n\n const addUserToTenant = useCallback(\n async email => {\n return await apiMutate(\n ConfigService.tenantV1ApiUrl,\n `tenants/${tenant?.activeTenant?.tenantId ?? ''}/${email}`,\n { method: 'post' }\n );\n },\n [tenant]\n );\n\n const updateExistingUser = useCallback(\n async data => {\n return await apiMutate(\n ConfigService.securityV1ApiUrl,\n `users/aad/${data.id}`,\n { method: 'patch' },\n data\n );\n },\n []\n );\n\n const fillInValues = (oldValues, newValues) => {\n const invalidFields = [\n 'id', 'displayName', 'mail', 'userType', 'email',\n 'accountEnabled', 'mailNickname', 'identities',\n 'password', 'passwordProfile', 'unityId',\n 'unityDefaultTenantId'\n ];\n for (let field in oldValues) {\n if (!invalidFields.includes(field)) {\n if (!oldValues[field]) {\n oldValues[field] = newValues[field];\n }\n }\n }\n return oldValues;\n };\n\n const handleSubmit = useCallback(\n async values => {\n setLoading(true);\n try {\n if (values.email) {\n values.email = values.email.toLowerCase().trim();\n }\n\n const userExistsResponse = await getUserByEmail(values.email);\n const userExists = userExistsResponse.data;\n\n if (userExists) {\n const existingUser = cloneDeep(userExists);\n const updatedValues = fillInValues(existingUser, values);\n\n // Update existing user and add to tenant\n await updateExistingUser({ data: updatedValues });\n await addUserToTenant(values.email);\n handleSuccessSnackbar(t('User has been updated and added to the tenant'))\n } else {\n // Check if this is an invite flow or standard create\n if (values.isInvite) {\n await inviteUser({ data: values });\n handleSuccessSnackbar(t('User invitation sent successfully'));\n } else {\n // Create a new user\n await createUser({ data: values });\n handleSuccessSnackbar(t('User has been created successfully'));\n }\n }\n\n onClose(); // Close the SideSheet after successful submission\n } catch (error) {\n handleErrorSnackbar(error.message || t('An error occurred, please ensure you are creating a new user'))\n } finally {\n setLoading(false);\n }\n },\n [\n getUserByEmail,\n createUser,\n inviteUser,\n addUserToTenant,\n updateExistingUser,\n handleErrorSnackbar,\n handleSuccessSnackbar,\n onClose,\n t\n ]\n );\n\n return (\n <SideSheet\n open={open}\n onClose={onClose}\n title={t(\"Add User\")}\n width={600} // Adjust the width as needed\n >\n <UserForm\n submitUser={handleSubmit}\n creatingUser={loading}\n tenant={tenant?.activeTenant}\n />\n </SideSheet>\n );\n};\n\nexport default UserFormSideSheet;\n"],"mappings":";;;;;;;;;;;;AAYA,MAAM,qBAAqB,EACzB,MACA,cACI;CACJ,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,SAAS,WAAW;CAC1B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,qBAAqB,0BAA0B,wBAAwB;CAG/E,MAAM,iBAAiB,YACrB,OAAM,UAAS;AACb,SAAO,MAAM,UACX,cAAc,kBACd,eAAe,SACf,EAAE,QAAQ,OAAO,CAClB;IAEH,EAAE,CACH;CAED,MAAM,aAAa,YACjB,OAAM,SAAQ;AACZ,SAAO,MAAM,UACX,cAAc,kBACd,SAAS,QAAQ,cAAc,YAAY,MAC3C,EAAE,QAAQ,QAAQ,EAClB,KACD;IAEH,CAAC,OAAO,CACT;CAED,MAAM,aAAa,YACjB,OAAM,SAAQ;AACZ,SAAO,MAAM,UACX,cAAc,kBACd,SAAS,QAAQ,cAAc,YAAY,GAAG,UAC9C,EAAE,QAAQ,QAAQ,EAClB,KACD;IAEH,CAAC,OAAO,CACT;CAED,MAAM,kBAAkB,YACtB,OAAM,UAAS;AACb,SAAO,MAAM,UACX,cAAc,gBACd,WAAW,QAAQ,cAAc,YAAY,GAAG,GAAG,SACnD,EAAE,QAAQ,QAAQ,CACnB;IAEH,CAAC,OAAO,CACT;CAED,MAAM,qBAAqB,YACzB,OAAM,SAAQ;AACZ,SAAO,MAAM,UACX,cAAc,kBACd,aAAa,KAAK,MAClB,EAAE,QAAQ,SAAS,EACnB,KACD;IAEH,EAAE,CACH;CAED,MAAM,gBAAgB,WAAW,cAAc;EAC7C,MAAM,gBAAgB;GACpB;GAAM;GAAe;GAAQ;GAAY;GACzC;GAAkB;GAAgB;GAClC;GAAY;GAAmB;GAC/B;GACD;AACD,OAAK,IAAI,SAAS,UAChB,KAAI,CAAC,cAAc,SAAS,MAAM,EAChC;OAAI,CAAC,UAAU,OACb,WAAU,SAAS,UAAU;;AAInC,SAAO;;CAGT,MAAM,eAAe,YACnB,OAAM,WAAU;AACd,aAAW,KAAK;AAChB,MAAI;AACF,OAAI,OAAO,MACT,QAAO,QAAQ,OAAO,MAAM,aAAa,CAAC,MAAM;GAIlD,MAAM,cADqB,MAAM,eAAe,OAAO,MAAM,EACvB;AAEtC,OAAI,YAAY;AAKd,UAAM,mBAAmB,EAAE,MAHL,aADD,UAAU,WAAW,EACO,OAAO,EAGR,CAAC;AACjD,UAAM,gBAAgB,OAAO,MAAM;AACnC,0BAAsB,EAAE,gDAAgD,CAAC;cAGrE,OAAO,UAAU;AACnB,UAAM,WAAW,EAAE,MAAM,QAAQ,CAAC;AAClC,0BAAsB,EAAE,oCAAoC,CAAC;UACxD;AAEL,UAAM,WAAW,EAAE,MAAM,QAAQ,CAAC;AAClC,0BAAsB,EAAE,qCAAqC,CAAC;;AAIlE,YAAS;WACF,OAAO;AACd,uBAAoB,MAAM,WAAW,EAAE,+DAA+D,CAAC;YAC/F;AACR,cAAW,MAAM;;IAGrB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,oCAAC;EACO;EACG;EACT,OAAO,EAAE,WAAW;EACpB,OAAO;IAEP,oCAACA;EACC,YAAY;EACZ,cAAc;EACd,QAAQ,QAAQ;GAChB,CACQ;;AAIhB,gCAAe"}
1
+ {"version":3,"file":"UserFormSideSheet-7fHGhAER.js","names":["UserForm"],"sources":["../src/shell/ui/addUser/UserFormSideSheet.jsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { SideSheet } from '../../../UI/surfaces/SideSheet';\nimport UserForm from './UserForm';\nimport { useSnackbar } from 'notistack';\nimport { apiMutate } from '../../../utilities/useAxiosMutate';\nimport { useTenant } from '../../../utilities/tenant/useTenant';\nimport { useHandleAxiosSnackbar } from '../../../utilities/apiHelpers';\nimport { cloneDeep } from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { ConfigService } from '../../../configService';\n\n\nconst UserFormSideSheet = ({\n open,\n onClose,\n}) => {\n const [loading, setLoading] = useState(false);\n const tenant = useTenant();\n const { t } = useTranslation();\n const { handleErrorSnackbar, handleSuccessSnackbar } = useHandleAxiosSnackbar();\n\n // Helper functions\n const getUserByEmail = useCallback(\n async email => {\n return await apiMutate(\n ConfigService.securityV1ApiUrl,\n `users/email/${email}`,\n { method: 'get' }\n );\n },\n []\n );\n\n const createUser = useCallback(\n async data => {\n return await apiMutate(\n ConfigService.securityV1ApiUrl,\n `users/${tenant?.activeTenant?.tenantId ?? ''}`,\n { method: 'post' },\n data\n );\n },\n [tenant]\n );\n\n const inviteUser = useCallback(\n async data => {\n return await apiMutate(\n ConfigService.securityV1ApiUrl,\n `users/${tenant?.activeTenant?.tenantId ?? ''}/invite`,\n { method: 'post' },\n data\n );\n },\n [tenant]\n );\n\n const addUserToTenant = useCallback(\n async email => {\n return await apiMutate(\n ConfigService.tenantV1ApiUrl,\n `tenants/${tenant?.activeTenant?.tenantId ?? ''}/${email}`,\n { method: 'post' }\n );\n },\n [tenant]\n );\n\n const updateExistingUser = useCallback(\n async data => {\n return await apiMutate(\n ConfigService.securityV1ApiUrl,\n `users/aad/${data.id}`,\n { method: 'patch' },\n data\n );\n },\n []\n );\n\n const fillInValues = (oldValues, newValues) => {\n const invalidFields = [\n 'id', 'displayName', 'mail', 'userType', 'email',\n 'accountEnabled', 'mailNickname', 'identities',\n 'password', 'passwordProfile', 'unityId',\n 'unityDefaultTenantId'\n ];\n for (let field in oldValues) {\n if (!invalidFields.includes(field)) {\n if (!oldValues[field]) {\n oldValues[field] = newValues[field];\n }\n }\n }\n return oldValues;\n };\n\n const handleSubmit = useCallback(\n async values => {\n setLoading(true);\n try {\n if (values.email) {\n values.email = values.email.toLowerCase().trim();\n }\n\n const userExistsResponse = await getUserByEmail(values.email);\n const userExists = userExistsResponse.data;\n\n if (userExists) {\n const existingUser = cloneDeep(userExists);\n const updatedValues = fillInValues(existingUser, values);\n\n // Update existing user and add to tenant\n await updateExistingUser({ data: updatedValues });\n await addUserToTenant(values.email);\n handleSuccessSnackbar(t('User has been updated and added to the tenant'))\n } else {\n // Check if this is an invite flow or standard create\n if (values.isInvite) {\n await inviteUser({ data: values });\n handleSuccessSnackbar(t('User invitation sent successfully'));\n } else {\n // Create a new user\n await createUser({ data: values });\n handleSuccessSnackbar(t('User has been created successfully'));\n }\n }\n\n onClose(); // Close the SideSheet after successful submission\n } catch (error) {\n handleErrorSnackbar(error.message || t('An error occurred, please ensure you are creating a new user'))\n } finally {\n setLoading(false);\n }\n },\n [\n getUserByEmail,\n createUser,\n inviteUser,\n addUserToTenant,\n updateExistingUser,\n handleErrorSnackbar,\n handleSuccessSnackbar,\n onClose,\n t\n ]\n );\n\n return (\n <SideSheet\n open={open}\n onClose={onClose}\n title={t(\"Add User\")}\n width={600} // Adjust the width as needed\n >\n <UserForm\n submitUser={handleSubmit}\n creatingUser={loading}\n tenant={tenant?.activeTenant}\n />\n </SideSheet>\n );\n};\n\nexport default UserFormSideSheet;\n"],"mappings":";;;;;;;;;;;;AAYA,MAAM,qBAAqB,EACzB,MACA,cACI;CACJ,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,SAAS,WAAW;CAC1B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,qBAAqB,0BAA0B,wBAAwB;CAG/E,MAAM,iBAAiB,YACrB,OAAM,UAAS;AACb,SAAO,MAAM,UACX,cAAc,kBACd,eAAe,SACf,EAAE,QAAQ,OAAO,CAClB;IAEH,EAAE,CACH;CAED,MAAM,aAAa,YACjB,OAAM,SAAQ;AACZ,SAAO,MAAM,UACX,cAAc,kBACd,SAAS,QAAQ,cAAc,YAAY,MAC3C,EAAE,QAAQ,QAAQ,EAClB,KACD;IAEH,CAAC,OAAO,CACT;CAED,MAAM,aAAa,YACjB,OAAM,SAAQ;AACZ,SAAO,MAAM,UACX,cAAc,kBACd,SAAS,QAAQ,cAAc,YAAY,GAAG,UAC9C,EAAE,QAAQ,QAAQ,EAClB,KACD;IAEH,CAAC,OAAO,CACT;CAED,MAAM,kBAAkB,YACtB,OAAM,UAAS;AACb,SAAO,MAAM,UACX,cAAc,gBACd,WAAW,QAAQ,cAAc,YAAY,GAAG,GAAG,SACnD,EAAE,QAAQ,QAAQ,CACnB;IAEH,CAAC,OAAO,CACT;CAED,MAAM,qBAAqB,YACzB,OAAM,SAAQ;AACZ,SAAO,MAAM,UACX,cAAc,kBACd,aAAa,KAAK,MAClB,EAAE,QAAQ,SAAS,EACnB,KACD;IAEH,EAAE,CACH;CAED,MAAM,gBAAgB,WAAW,cAAc;EAC7C,MAAM,gBAAgB;GACpB;GAAM;GAAe;GAAQ;GAAY;GACzC;GAAkB;GAAgB;GAClC;GAAY;GAAmB;GAC/B;GACD;AACD,OAAK,IAAI,SAAS,UAChB,KAAI,CAAC,cAAc,SAAS,MAAM,EAChC;OAAI,CAAC,UAAU,OACb,WAAU,SAAS,UAAU;;AAInC,SAAO;;CAGT,MAAM,eAAe,YACnB,OAAM,WAAU;AACd,aAAW,KAAK;AAChB,MAAI;AACF,OAAI,OAAO,MACT,QAAO,QAAQ,OAAO,MAAM,aAAa,CAAC,MAAM;GAIlD,MAAM,cADqB,MAAM,eAAe,OAAO,MAAM,EACvB;AAEtC,OAAI,YAAY;AAKd,UAAM,mBAAmB,EAAE,MAHL,aADD,UAAU,WAAW,EACO,OAAO,EAGR,CAAC;AACjD,UAAM,gBAAgB,OAAO,MAAM;AACnC,0BAAsB,EAAE,gDAAgD,CAAC;cAGrE,OAAO,UAAU;AACnB,UAAM,WAAW,EAAE,MAAM,QAAQ,CAAC;AAClC,0BAAsB,EAAE,oCAAoC,CAAC;UACxD;AAEL,UAAM,WAAW,EAAE,MAAM,QAAQ,CAAC;AAClC,0BAAsB,EAAE,qCAAqC,CAAC;;AAIlE,YAAS;WACF,OAAO;AACd,uBAAoB,MAAM,WAAW,EAAE,+DAA+D,CAAC;YAC/F;AACR,cAAW,MAAM;;IAGrB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,oCAAC;EACO;EACG;EACT,OAAO,EAAE,WAAW;EACpB,OAAO;IAEP,oCAACA;EACC,YAAY;EACZ,cAAc;EACd,QAAQ,QAAQ;GAChB,CACQ;;AAIhB,gCAAe"}
@@ -0,0 +1,3 @@
1
+ import { t as UserFormSideSheet_default } from "./UserFormSideSheet-7fHGhAER.js";
2
+
3
+ export { UserFormSideSheet_default as default };