{"version":3,"file":"FileImportMappingWizard.mjs","names":["React","useMemo","useState","useCallback","useEffect","useTranslation","useUser","useAxiosGet","UdpCard","UdpAutocomplete","usePromotedMethodEntity","executeQueryAdHoc","Form","Field","AmbientStepper","apiMutate","useHandleAxiosSnackbar","UdpFileInput","UdpDropdown","UdpText","UdpButton","UdpTextInput","UdpDivider","UdpIcon","handleExcelFileUpload","handleJsonFileUpload","handleTextFileUpload","FileImportConfigCard","getSanitizedName","ConfigService","FileImportMappingWizard","props","$","_c","refetchMappings","setNewFileMappingSidesheetOpen","verifyRequiredFields","t","user","importHeaderData","setImportHeaderData","udpObjectList","setUdpObjectList","selectedDomain","setSelectedDomain","selectedFileType","setSelectedFileType","fileObject","setFileObject","t0","Symbol","for","fileItems","setFileItems","t1","fileImportMappingObject","setFileImportMappingObject","activeStep","setActiveStep","showIndexNumbers","setShowIndexNumbers","errorText","setErrorText","handleErrorSnackbar","handleSuccessSnackbar","executeCreateFileMapping","_temp","data","udpObjectEntity","t2","t3","productV1ApiUrl","allowedFileTypesData","t4","unityBaseSearchMethod","apiMethodId","id","sapUserRes","eagerLoad","pageSize","filterElements","pageList","length","searchUdpObjectData","filterCatalogObjectList","getNameFormattedOptionLabel","_temp2","t5","extension","properties","result","headers","handleFileUpload","t6","t7","t8","mapping","name","values","response","objectInfoSanitizedName","fileImportType","JSON","stringify","catch","res","status","defaultValue","handleCreateNewFieldMapping","t9","objectFieldInfo","values_0","valid","forEach","option_1","option","dataType","endsWith","isPrimaryKey","udpType","Object","entries","some","obj","businessObjectKey","filteredMappings","filter","_temp3","reduce","_temp4","mappedFieldIndexes","keys","map","_temp5","fieldMappings","selectedUdpField","index","udpField","importFileField","headerIndex","prev","_temp6","handleUpdateFieldMapping","t10","values_1","prev_1","properties_0","propKey","value","includesHeader","_temp7","handleUpdateFileProperties","getUdpFieldOptionLabel","_temp8","t11","e","items","target","find","_temp9","file","handleAddFileToUpload","t12","bb0","t13","parse","undefined","formattedFileTypeProperties","marginBottom","t14","t15","t16","t17","t18","t19","t20","e_0","marginTop","_temp0","t21","e_1","float","display","gap","_temp1","_temp10","t22","flexDirection","justifyContent","paddingTop","margin","field","index_0","alignItems","width","flex","textAlign","color","_temp11","t23","_temp12","t24","t25","replace","trim","t26","method","acc","key_0","value_0","key","key_1","parseInt","split","prev_0","prev_2","option_2","item","kind","property","options","propertyName","label","required","prev_3","prev_4","prev_5","prev_6"],"sources":["../../../src/udp/fileImportMapping/FileImportMappingWizard.jsx"],"sourcesContent":["import React, { useMemo, useState, useCallback, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useUser } from '../../utilities/auth/useUser';\nimport { useAxiosGet } from '../../utilities/useAxiosGet';\nimport { UdpCard } from '../../UI/fluent-web-components/UdpCard';\nimport { UdpAutocomplete } from '../../UI/fluent-web-components/UdpAutocomplete';\nimport { usePromotedMethodEntity } from '../../hooks/usePromotedMethodEntity';\nimport { executeQueryAdHoc } from '../utilities/methodUtils';\nimport { Form } from '../../utilities/form';\nimport { Field } from '../../utilities/form';\nimport { AmbientStepper } from '../../UI/inputs/menus/AmbientStepper/AmbientStepper';\nimport { apiMutate } from '../../utilities/useAxiosMutate';\nimport { useHandleAxiosSnackbar } from '../../utilities/apiHelpers';\nimport { UdpFileInput } from '../../UI/fluent-web-components/UdpFileInput';\nimport { UdpDropdown } from '../../UI/fluent-web-components';\nimport { UdpText } from '../../UI/fluent-web-components/UdpText';\nimport { UdpButton } from '../../UI/fluent-web-components/UdpButton';\nimport { UdpTextInput } from '../../UI/fluent-web-components/UdpTextInput';\nimport { UdpDivider } from '../../UI/fluent-web-components/UdpDivider';\nimport { UdpIcon } from '../../UI/fluent-web-components/UdpIcon';\nimport {\n  handleExcelFileUpload,\n  handleJsonFileUpload,\n  handleTextFileUpload\n} from './fileUtils';\nimport { FileImportConfigCard } from './FileImportConfigCard';\nimport { getSanitizedName } from '../../utilities/entities/entityUtilities';\nimport { ConfigService } from '../../configService';\n\nconst FileImportMappingWizard = (props) => {\n  const { refetchMappings, setNewFileMappingSidesheetOpen, verifyRequiredFields } = props;\n  const { t } = useTranslation();\n  const user = useUser();\n  const [importHeaderData, setImportHeaderData] = useState();\n  const [udpObjectList, setUdpObjectList] = useState();\n  const [selectedDomain, setSelectedDomain] = useState();\n  const [selectedFileType, setSelectedFileType] = useState();\n  const [fileObject, setFileObject] = useState();\n  const [fileItems, setFileItems] = useState([]);\n  const [fileImportMappingObject, setFileImportMappingObject] = useState({});\n  const [activeStep, setActiveStep] = useState(0);\n  const [showIndexNumbers, setShowIndexNumbers] = useState(false);\n  const [errorText, setErrorText] = useState('');\n  const { handleErrorSnackbar, handleSuccessSnackbar } =\n    useHandleAxiosSnackbar();\n\n  const executeCreateFileMapping = useCallback(\n    async (data) =>\n      apiMutate(\n        ConfigService.productV1ApiUrl,\n        `UdpFileImportMapping`,\n        {\n          method: 'post'\n        },\n        { data }\n      ),\n    []\n  );\n  const { data: udpObjectEntity } = usePromotedMethodEntity(\n    'UdpObjectInfo',\n    true\n  );\n\n  const [{ data: allowedFileTypesData }, refetchAllowedFileTypes] = useAxiosGet(\n    ConfigService.productV1ApiUrl,\n    `UdpFileImportType`,\n    {},\n    false\n  );\n\n  const searchUdpObjectData = useCallback(async () => {\n    if (udpObjectEntity?.unityBaseSearchMethod?.apiMethodId && user?.id) {\n      const sapUserRes = await executeQueryAdHoc(\n        {\n          data: {\n            eagerLoad: true,\n            pageSize: 200,\n            filterElements: []\n          }\n        },\n        udpObjectEntity?.unityBaseSearchMethod?.apiMethodId\n      );\n      if (sapUserRes?.data?.pageList.length > 0) {\n        setUdpObjectList(sapUserRes?.data?.pageList);\n      }\n    }\n  }, [udpObjectEntity, user]);\n\n  const filterCatalogObjectList = useMemo(() => {\n    return udpObjectList;\n  }, [udpObjectList]);\n\n  const getNameFormattedOptionLabel = (option) => {\n    return option?.name.replace(/([A-Z])/g, ' $1').trim();\n  };\n\n  const getNameOptionLabel = (option) => {\n    return option?.name;\n  };\n\n  const handleFileUpload = async (properties) => {\n    let result;\n    if (\n      selectedFileType.extension === '.csv' ||\n      selectedFileType.extension === '.txt'\n    ) {\n      result = await handleTextFileUpload(fileObject, properties);\n    } else if (selectedFileType.extension === '.xlsx') {\n      result = await handleExcelFileUpload(fileObject, properties);\n    } else if (selectedFileType.extension === '.json') {\n      result = await handleJsonFileUpload(fileObject, properties);\n    }\n    setImportHeaderData(result?.headers);\n  };\n\n  useEffect(() => {\n    searchUdpObjectData();\n  }, [searchUdpObjectData]);\n\n  const handleCreateNewFieldMapping = async (values) => {\n    const response = await executeCreateFileMapping({\n      name: values.name,\n      objectInfoSanitizedName: getSanitizedName(selectedDomain?.name),\n      fileImportType: selectedFileType?.id,\n      mapping: JSON.stringify(fileImportMappingObject?.mapping),\n      properties: JSON.stringify(fileImportMappingObject?.properties)\n    }).catch((res) => {\n      handleErrorSnackbar(res);\n    });\n    if (response?.status === 201) {\n      handleSuccessSnackbar(t('fileImport.snackbar.mappingCreated', { defaultValue: 'Created Mapping' }));\n      refetchMappings();\n      setNewFileMappingSidesheetOpen(false);\n    }\n  };\n\n  const handleUpdateFieldMapping = (values) => {\n    let valid = true;\n    selectedDomain?.objectFieldInfo?.forEach((option) => {\n      if (\n        !option.dataType.endsWith('?') &&\n        !option.isPrimaryKey &&\n        !option.udpType\n      ) {\n        if (\n          !Object.entries(values).some(\n            (obj) => obj[1].businessObjectKey === option.businessObjectKey\n          )\n        ) {\n          if(verifyRequiredFields){\n            valid = false;\n          }\n        }\n      }\n    });\n    if (!valid) {\n      setErrorText(\n        t('fileImport.wizard.requiredFieldsError', {\n          defaultValue: 'All required Udp fields must have a mapping'\n        })\n      );\n      return;\n    }\n    const filteredMappings = Object.entries(values)\n      .filter(([key, value]) => value !== null)\n      .reduce((acc, [key, value]) => {\n        acc[key] = value;\n        return acc;\n      }, {});\n    const mappedFieldIndexes = Object.keys(filteredMappings).map((key) =>\n      parseInt(key.split('udpFieldMapping')[1], 10)\n    );\n    const fieldMappings = Object.values(filteredMappings).map(\n      (selectedUdpField, index) => {\n        return {\n          udpField: selectedUdpField.name,\n          importFileField: !showIndexNumbers\n            ? importHeaderData[mappedFieldIndexes[index]]\n            : null,\n          headerIndex: !showIndexNumbers ? -1 : mappedFieldIndexes[index]\n        };\n      }\n    );\n    setFileImportMappingObject((prev) => {\n      return { ...prev, mapping: fieldMappings };\n    });\n    setActiveStep((prev) => prev + 1);\n  };\n\n  const handleUpdateFileProperties = (values) => {\n    setFileImportMappingObject((prev) => {\n      let properties = {};\n      Object.keys(values).forEach(\n        (propKey) =>\n          (properties[propKey] =\n            'value' in values[propKey]\n              ? values[propKey]?.value\n              : values[propKey])\n      );\n      return { ...prev, properties: properties };\n    });\n    if ('includesHeader' in values && values?.includesHeader.value === false) {\n      setShowIndexNumbers(true);\n    }\n    handleFileUpload(values);\n    setActiveStep((prev) => prev + 1);\n  };\n\n  const getUdpFieldOptionLabel = (option) => {\n    if (\n      !option.dataType.endsWith('?') &&\n      !option.isPrimaryKey &&\n      !option.udpType\n    ) {\n      return `${option.name.replace(/([A-Z])/g, ' $1').trim()}*`; //required field\n    }\n    return `${option.name} - ${option.dataType}`;\n  };\n\n  const handleAddFileToUpload = (e) => {\n    const items = e.target.value;\n    setFileItems(items);\n    setFileObject(items.find(item => item.kind === 'pending')?.file);\n  };\n\n  const formattedFileTypeProperties = useMemo(() => {\n    if (selectedFileType) {\n      return JSON.parse(selectedFileType?.properties);\n    }\n  }, [selectedFileType]);\n\n  return (\n    <>\n      <UdpCard width=\"100%\">\n        <div style={{ marginBottom: 20 }}>\n          <AmbientStepper\n            activeStep={activeStep}\n            steps={[\n              t('fileImport.wizard.steps.file', { defaultValue: 'File' }),\n              t('fileImport.wizard.steps.domain', { defaultValue: 'Domain' }),\n              t('fileImport.wizard.steps.fieldMappings', { defaultValue: 'Field Mappings' }),\n              t('fileImport.wizard.steps.review', { defaultValue: 'Review' })\n            ]}\n            orientation='vertical'\n          />\n        </div>\n        {activeStep === 0 && (\n          <>\n            <UdpDropdown\n              name={'fileImportType'}\n              label={t('fileImport.wizard.fileType', { defaultValue: 'File Type' })}\n              onChange={(e) => setSelectedFileType(e.target.value)}\n              options={allowedFileTypesData || []}\n              optionLabel='name'\n              optionValue=\"id\"\n              value={selectedFileType}\n              required\n            />\n            {selectedFileType && (\n              <div style={{ marginTop: 5 }}>\n                <UdpFileInput\n                  value={fileItems}\n                  onChange={handleAddFileToUpload}\n                  accept=\".csv,.txt,.xlsx,.json\"\n                  maxFiles={1}\n                />\n              </div>\n            )}\n            <Form id='fileProperties' onSubmit={handleUpdateFileProperties}>\n              {formattedFileTypeProperties?.map((property) =>\n                property?.options ? (\n                  <Field\n                    key={property.propertyName}\n                    component={UdpDropdown}\n                    multiple={false}\n                    name={property.propertyName}\n                    label={property.label}\n                    options={property.options}\n                    optionLabel='name'\n                    optionValue=\"value\"\n                    required={property?.required}\n                  />\n                ) : (\n                  <Field\n                    key={property.propertyName}\n                    component={UdpTextInput}\n                    name={property.propertyName}\n                    label={property.label}\n                    required={property?.required}\n                  />\n                )\n              )}\n\n                <UdpButton\n                  appearance='secondary'\n                  type='submit'\n                  form='fileProperties'\n                  disabled={!fileObject}\n                >\n                  {t('common.next', { defaultValue: 'Next' })}\n                </UdpButton>\n            </Form>\n          </>\n        )}\n        {activeStep === 1 && (\n          <>\n            <UdpAutocomplete\n              name={'domain'}\n              label={t('fileImport.wizard.domain', { defaultValue: 'Domain' })}\n              onChange={(e) => setSelectedDomain(e.target.value)}\n              options={filterCatalogObjectList}\n              optionLabel={getNameFormattedOptionLabel}\n              optionValue=\"id\"\n              value={selectedDomain}\n              required\n            />\n            <div\n              style={{ float: 'right', display: 'flex', gap: 8, marginTop: 8 }}\n            >\n              <UdpButton\n                onClick={() => setActiveStep((prev) => prev - 1)}\n                disabled={activeStep === 0}\n              >\n                {t('fileImport.wizard.prev', { defaultValue: 'Prev' })}\n              </UdpButton>\n              <UdpButton\n                appearance='secondary'\n                onClick={() => setActiveStep((prev) => prev + 1)}\n                disabled={!selectedDomain}\n              >\n                {t('common.next', { defaultValue: 'Next' })}\n              </UdpButton>\n            </div>\n          </>\n        )}\n        {activeStep === 2 && (\n          <>\n            <div\n              style={{\n                display: 'flex',\n                flexDirection: 'row',\n                justifyContent: 'space-between',\n                paddingTop: 20\n              }}\n            >\n              <UdpText variant='caption1Strong'>\n                {showIndexNumbers\n                  ? t('fileImport.wizard.columnIndexes', { defaultValue: \"Column index's\" })\n                  : t('fileImport.wizard.fileHeaders', { defaultValue: 'File Headers' })}\n              </UdpText>\n              <UdpText variant='caption1Strong'>\n                {t('fileImport.wizard.udpFields', { defaultValue: 'UDP Fields' })}\n              </UdpText>\n            </div>\n            <UdpDivider style={{ margin: '5px 0px' }} />\n            <Form id='fieldMappings' onSubmit={handleUpdateFieldMapping}>\n              {importHeaderData?.map((field, index) => (\n                <div key={index}>\n                  <div\n                    style={{\n                      display: 'flex',\n                      flexDirection: 'row',\n                      alignItems: 'center',\n                      gap: 10\n                    }}\n                  >\n                    <UdpText style={{ width: '40%' }}>\n                      {showIndexNumbers\n                        ? t('fileImport.wizard.indexLabel', {\n                            defaultValue: 'index {{index}}',\n                            index\n                          })\n                        : field}\n                    </UdpText>\n                    <UdpIcon style={{ width: '10%' }} name='arrow-right' />\n                    <div style={{ flex: 2 }}>\n                      <Field\n                        component={UdpDropdown}\n                        multiple={false}\n                        name={`udpFieldMapping${index}`}\n                        options={selectedDomain?.objectFieldInfo}\n                        optionLabel={getUdpFieldOptionLabel}\n                        optionValue=\"businessObjectKey\"\n                        includeErrorPadding={false}\n                        clearable={true}\n                      />\n                    </div>\n                  </div>\n                  <UdpDivider style={{ margin: '5px 0px' }} />\n                </div>\n              ))}\n              <div style={{ paddingTop: 20, textAlign: 'right', color: 'red' }}>\n                {errorText}\n              </div>\n              <div\n                style={{\n                  display: 'flex',\n                  justifyContent: 'flex-start',\n                  gap: 8,\n                  paddingTop: 16\n                }}\n              >\n                <UdpButton\n                  onClick={() => setActiveStep((prev) => prev - 1)}\n                  disabled={activeStep === 0}\n                >\n                  {t('fileImport.wizard.prev', { defaultValue: 'Prev' })}\n                </UdpButton>\n                <UdpButton\n                  appearance='secondary'\n                  type='submit'\n                  form='fieldMappings'\n                >\n                  {t('common.next', { defaultValue: 'Next' })}\n                </UdpButton>\n              </div>\n            </Form>\n          </>\n        )}\n        {activeStep === 3 && (\n          <Form id='createMapping' onSubmit={handleCreateNewFieldMapping}>\n            <Field\n              component={UdpTextInput}\n              name={`name`}\n              label={t('fileImport.wizard.mappingName', { defaultValue: 'Mapping Name' })}\n            />\n            <div\n              style={{\n                display: 'flex',\n                justifyContent: 'flex-start',\n                gap: 8,\n                paddingTop: 16\n              }}\n            >\n              <UdpButton\n                onClick={() => setActiveStep((prev) => prev - 1)}\n                disabled={activeStep === 0}\n              >\n                {t('fileImport.wizard.prev', { defaultValue: 'Prev' })}\n              </UdpButton>\n              <UdpButton\n                appearance='primary'\n                type='submit'\n                form='createMapping'\n              >\n                {t('fileImport.wizard.createMapping', { defaultValue: 'Create Mapping' })}\n              </UdpButton>\n            </div>\n          </Form>\n        )}\n      </UdpCard>\n      {fileImportMappingObject?.mapping &&<div style={{ marginTop: 10 }}>\n        <FileImportConfigCard\n          fileMappingRecord={{\n            mapping: fileImportMappingObject?.mapping,\n            properties: fileImportMappingObject?.properties\n          }}\n          domain={selectedDomain?.name.replace(/([A-Z])/g, ' $1').trim()}\n        />\n      </div>}\n    </>\n  );\n};\n\nexport default FileImportMappingWizard;\n"],"mappings":"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"}