{"version":3,"file":"UdpTransactionAttachmentUploader.mjs","names":["React","useCallback","useMemo","useState","apiMutate","Box","AmbientCard","DragDropFileUpload","LinearProgress","List","ListItem","IconButton","ConfigService","DownloadIcon","ChromeCloseIcon","DeleteIcon","useTranslation","useHandleAxiosSnackbar","Divider","AttachmentAction","FluentDialog","FluentIconButton","UdpDropdown","UdpSpinner","removeDuplicateFiles","incomingFiles","existingFiles","uniqueFiles","duplicateFiles","forEach","newFile","exists","some","existingFile","name","fileName","push","UdpTransactionAttachmentUploader","allowedExtensions","MAX_FILE_SIZE_MB","filePreview","setFilePreview","currentAttachments","setCurrentAttachments","attachmentTypes","defaultAttachmentTypeCode","attachmentProgress","previousAttachments","setPreviousAttachments","onUploadAttachments","attachmentDialogOpen","setAttachmentDialogOpen","attachmentToDelete","setAttachmentToDelete","attachmentToDeleteIndex","setAttachmentToDeleteIndex","attachmentAction","setAttachmentAction","None","updatingAttachmentIds","setUpdatingAttachmentIds","Set","deletingAttachment","setDeletingAttachment","handleErrorSnackbar","handleSuccessSnackbar","t","selectTypeLabel","defaultValue","defaultAttachmentType","types","pageList","find","type","code","isDefault","findAttachmentType","transactionAttachmentTypeId","initiateAttachmentAction","action","file","index","handleAttachmentDeleteClick","Delete","handleAttachmentRemoveClick","Remove","handleCloseAttachmentDialog","removeAttachmentFromList","attachments","setAttachments","prev","filter","item","i","deleteAttachment","filePayload","isDeleted","productV1ApiUrl","transactionAttachmentId","method","data","error","console","handleDownloadFile","response","url","link","document","createElement","href","download","body","appendChild","click","removeChild","e","uploadEntries","entries","files","map","entry","markUploading","uploading","has","uploaded","uploadedFiles","handleAddFiles","Array","from","validFiles","invalidFiles","ext","split","pop","toLowerCase","sizeInMB","size","includes","maxSize","allExistingFiles","attachment","length","newEntries","attachmentType","errors","join","duplicateNames","f","fileNames","handleAttachmentTypeChange","markAttachmentUpdating","attachmentId","updating","next","add","delete","handlePreviousAttachmentTypeChange","renderCurrentAttachments","target","value","renderPreviousAttachments","isUpdating","renderConfirmationContent","isDeleteAction","undefined"],"sources":["../../../../../../src/udp/pages/UdpTransactionsPage/components/transactionAttachment/UdpTransactionAttachmentUploader.jsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from 'react';\nimport { apiMutate } from '../../../../../utilities';\nimport { Box } from '../../../../../UI';\nimport { AmbientCard } from '../../../../../UI/surfaces/cards/AmbientCard';\nimport { DragDropFileUpload } from '../../../../../uploader/DragDropFileUpload';\nimport { LinearProgress } from '../../../../../UI';\nimport { List, ListItem, IconButton } from '@material-ui/core';\nimport { ConfigService } from '../../../../../configService/index';\nimport {\n  DownloadIcon,\n  ChromeCloseIcon,\n  DeleteIcon\n} from '@fluentui/react-icons';\nimport { useTranslation } from 'react-i18next';\nimport { useHandleAxiosSnackbar } from '../../../../../utilities';\nimport { Divider } from '@material-ui/core';\nimport { AttachmentAction } from '../../../../../uploader/enums/systemEnums';\nimport { FluentDialog } from '../../../../../UI';\nimport { FluentIconButton } from '../../../../../UI/inputs/buttons';\nimport './UdpTransactionAttachmentUploader.css';\nimport {\n  UdpDropdown,\n  UdpSpinner\n} from '../../../../../UI/fluent-web-components';\n\nconst removeDuplicateFiles = (incomingFiles, existingFiles) => {\n  const uniqueFiles = [];\n  const duplicateFiles = [];\n\n  incomingFiles.forEach((newFile) => {\n    const exists = existingFiles.some(\n      (existingFile) =>\n        existingFile.name === newFile.name ||\n        existingFile.fileName === newFile.name\n    );\n\n    if (exists) {\n      duplicateFiles.push(newFile);\n    } else {\n      uniqueFiles.push(newFile);\n    }\n  });\n\n  return { uniqueFiles, duplicateFiles };\n};\n\nexport const UdpTransactionAttachmentUploader = ({\n  allowedExtensions,\n  MAX_FILE_SIZE_MB,\n  filePreview,\n  setFilePreview,\n  currentAttachments,\n  setCurrentAttachments,\n  attachmentTypes,\n  defaultAttachmentTypeCode,\n  attachmentProgress,\n  previousAttachments,\n  setPreviousAttachments,\n  onUploadAttachments\n}) => {\n  const [attachmentDialogOpen, setAttachmentDialogOpen] = useState(false);\n  const [attachmentToDelete, setAttachmentToDelete] = useState(null);\n  const [attachmentToDeleteIndex, setAttachmentToDeleteIndex] = useState(0);\n  const [attachmentAction, setAttachmentAction] = useState(\n    AttachmentAction.None\n  );\n  // Keyed by transactionAttachmentId: one index cannot describe two rows\n  // saving at once.\n  const [updatingAttachmentIds, setUpdatingAttachmentIds] = useState(\n    () => new Set()\n  );\n  const [deletingAttachment, setDeletingAttachment] = useState(false);\n\n  const { handleErrorSnackbar, handleSuccessSnackbar } =\n    useHandleAxiosSnackbar();\n  const { t } = useTranslation();\n\n  const selectTypeLabel = t('uploader.attachments.selectType', {\n    defaultValue: 'Select Attachment Type'\n  });\n\n  // Preferred by code when the host mapped one for this status, else the\n  // type flagged as default.\n  const defaultAttachmentType = useMemo(() => {\n    const types = attachmentTypes?.pageList ?? [];\n    return (\n      (defaultAttachmentTypeCode &&\n        types.find((type) => type.code === defaultAttachmentTypeCode)) ||\n      types.find((type) => type.isDefault) ||\n      null\n    );\n  }, [attachmentTypes, defaultAttachmentTypeCode]);\n\n  const findAttachmentType = useCallback(\n    (transactionAttachmentTypeId) =>\n      attachmentTypes?.pageList?.find(\n        (type) => type.transactionAttachmentTypeId === transactionAttachmentTypeId\n      ) ?? null,\n    [attachmentTypes]\n  );\n\n  const initiateAttachmentAction = useCallback((action, file, index) => {\n    setAttachmentAction(action);\n    setAttachmentToDelete(file);\n    setAttachmentToDeleteIndex(index);\n    setAttachmentDialogOpen(true);\n  }, []);\n\n  const handleAttachmentDeleteClick = useCallback(\n    (file, index) => {\n      initiateAttachmentAction(AttachmentAction.Delete, file, index);\n    },\n    [initiateAttachmentAction]\n  );\n\n  const handleAttachmentRemoveClick = useCallback(\n    (file, index) => {\n      initiateAttachmentAction(AttachmentAction.Remove, file, index);\n    },\n    [initiateAttachmentAction]\n  );\n\n  const handleCloseAttachmentDialog = useCallback(() => {\n    setAttachmentAction(AttachmentAction.None);\n    setAttachmentToDelete({});\n    setAttachmentDialogOpen(false);\n  }, []);\n\n  const removeAttachmentFromList = useCallback(\n    (attachments, setAttachments) => {\n      setAttachments((prev) =>\n        prev.filter((item, i) => i !== attachmentToDeleteIndex)\n      );\n      handleSuccessSnackbar(\n        t('uploader.attachments.removedSuccess', {\n          defaultValue: 'Attachment Removed Successfully'\n        })\n      );\n      handleCloseAttachmentDialog();\n    },\n    [\n      attachmentToDeleteIndex,\n      handleSuccessSnackbar,\n      handleCloseAttachmentDialog,\n      t\n    ]\n  );\n\n  const deleteAttachment = useCallback(async () => {\n    try {\n      setDeletingAttachment(true);\n      const filePayload = { ...attachmentToDelete, isDeleted: true };\n\n      await apiMutate(\n        ConfigService.productV1ApiUrl,\n        `UdpTransactionAttachment/${attachmentToDelete.transactionAttachmentId}`,\n        {\n          method: 'put',\n          data: filePayload\n        }\n      );\n      removeAttachmentFromList(previousAttachments, setPreviousAttachments);\n    } catch (error) {\n      handleErrorSnackbar(\n        t('uploader.attachments.deleteFailedTitle', {\n          defaultValue: 'Failed to delete attachment'\n        }),\n        t('uploader.attachments.deleteFailedMessage', {\n          defaultValue:\n            'We encountered a system error while trying to delete the file. Please try again.'\n        })\n      );\n      console.error(error);\n    } finally {\n      setDeletingAttachment(false);\n      setAttachmentDialogOpen(false);\n    }\n  }, [\n    attachmentToDelete,\n    removeAttachmentFromList,\n    previousAttachments,\n    setPreviousAttachments,\n    handleErrorSnackbar,\n    t\n  ]);\n\n  const handleDownloadFile = useCallback(async (file) => {\n    try {\n      const response = await apiMutate(\n        ConfigService.productV1ApiUrl,\n        `UdpTransactionAttachment/${file.transactionAttachmentId}/udpDriveFile/download`,\n        {}\n      );\n      const url = response.data.link;\n      const link = document.createElement('a');\n      link.href = url;\n      link.download = file.fileName ?? file.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  // With an onUploadAttachments handler (an existing transaction), staged\n  // entries upload as soon as they have a type. Failed entries stay staged.\n  const uploadEntries = useCallback(\n    async (entries) => {\n      const files = new Set(entries.map((entry) => entry.file));\n      const markUploading = (uploading) =>\n        setCurrentAttachments((prev) =>\n          prev.map((entry) =>\n            files.has(entry.file) ? { ...entry, uploading } : entry\n          )\n        );\n      markUploading(true);\n      try {\n        const { uploaded = [] } = (await onUploadAttachments(entries)) ?? {};\n        // Files whose group failed stay staged, but stop showing a spinner.\n        const uploadedFiles = new Set(uploaded);\n        setCurrentAttachments((prev) =>\n          prev\n            .filter((entry) => !uploadedFiles.has(entry.file))\n            .map((entry) =>\n              files.has(entry.file) ? { ...entry, uploading: false } : entry\n            )\n        );\n      } catch {\n        markUploading(false);\n      }\n    },\n    [onUploadAttachments, setCurrentAttachments]\n  );\n\n  const handleAddFiles = useCallback(\n    async (files) => {\n      const incomingFiles = Array.from(files);\n      const validFiles = [];\n      const invalidFiles = [];\n\n      incomingFiles.forEach((file) => {\n        const ext = file.name.split('.').pop().toLowerCase();\n        const sizeInMB = file.size / (1024 * 1024);\n\n        if (!allowedExtensions.includes(ext)) {\n          invalidFiles.push(\n            t('uploader.attachments.invalidFileType', {\n              defaultValue: '{{fileName}} (Invalid file type)',\n              fileName: file.name\n            })\n          );\n        } else if (sizeInMB > MAX_FILE_SIZE_MB) {\n          invalidFiles.push(\n            t('uploader.attachments.fileExceedsSize', {\n              defaultValue: '{{fileName}} (Exceeds {{maxSize}} MB)',\n              fileName: file.name,\n              maxSize: MAX_FILE_SIZE_MB\n            })\n          );\n        } else {\n          validFiles.push(file);\n        }\n      });\n\n      const allExistingFiles = [\n        ...previousAttachments,\n        ...currentAttachments.map((attachment) => attachment.file)\n      ];\n      const { uniqueFiles, duplicateFiles } = removeDuplicateFiles(\n        validFiles,\n        allExistingFiles\n      );\n\n      if (uniqueFiles.length > 0) {\n        const newEntries = uniqueFiles.map((file) => ({\n          file,\n          attachmentType: defaultAttachmentType\n        }));\n        setCurrentAttachments((prev) => [...prev, ...newEntries]);\n        if (onUploadAttachments && defaultAttachmentType) {\n          uploadEntries(newEntries);\n        }\n      }\n\n      if (invalidFiles.length > 0) {\n        handleErrorSnackbar(\n          t('uploader.attachments.filesNotAddedTitle', {\n            defaultValue: 'Files not added'\n          }),\n          t('uploader.attachments.filesNotAddedMessage', {\n            defaultValue: 'The following files had errors:\\n{{errors}}',\n            errors: invalidFiles.join('\\n')\n          })\n        );\n        setFilePreview(true);\n      }\n\n      if (duplicateFiles.length > 0) {\n        const duplicateNames = duplicateFiles.map((f) => f.name).join(', ');\n        handleErrorSnackbar(\n          t('uploader.attachments.duplicatesSkippedTitle', {\n            defaultValue: 'Duplicates skipped'\n          }),\n          t('uploader.attachments.duplicatesSkippedMessage', {\n            defaultValue:\n              'The following files already exist and were not added: {{fileNames}}',\n            fileNames: duplicateNames\n          })\n        );\n      }\n    },\n    [\n      allowedExtensions,\n      MAX_FILE_SIZE_MB,\n      previousAttachments,\n      currentAttachments,\n      setCurrentAttachments,\n      defaultAttachmentType,\n      onUploadAttachments,\n      uploadEntries,\n      handleErrorSnackbar,\n      setFilePreview,\n      t\n    ]\n  );\n\n  const handleAttachmentTypeChange = useCallback(\n    (index, attachmentType) => {\n      const entry = { ...currentAttachments[index], attachmentType };\n      setCurrentAttachments((prev) =>\n        prev.map((attachment, i) => (i === index ? entry : attachment))\n      );\n      if (onUploadAttachments && attachmentType) {\n        uploadEntries([entry]);\n      }\n    },\n    [\n      currentAttachments,\n      setCurrentAttachments,\n      onUploadAttachments,\n      uploadEntries\n    ]\n  );\n\n  const markAttachmentUpdating = useCallback((attachmentId, updating) => {\n    setUpdatingAttachmentIds((prev) => {\n      const next = new Set(prev);\n      if (updating) {\n        next.add(attachmentId);\n      } else {\n        next.delete(attachmentId);\n      }\n      return next;\n    });\n  }, []);\n\n  const handlePreviousAttachmentTypeChange = useCallback(\n    async (attachment, attachmentType) => {\n      if (!attachmentType) return;\n      const { transactionAttachmentId } = attachment;\n      const { transactionAttachmentTypeId } = attachmentType;\n      try {\n        markAttachmentUpdating(transactionAttachmentId, true);\n        await apiMutate(\n          ConfigService.productV1ApiUrl,\n          `UdpTransactionAttachment/${attachment.transactionAttachmentId}`,\n          {\n            method: 'put',\n            data: { ...attachment, transactionAttachmentTypeId }\n          }\n        );\n        setPreviousAttachments((prev) =>\n          prev.map((item) =>\n            item.transactionAttachmentId === transactionAttachmentId\n              ? { ...item, transactionAttachmentTypeId }\n              : item\n          )\n        );\n        handleSuccessSnackbar(\n          t('uploader.attachments.typeUpdated', {\n            defaultValue: 'Attachment type updated'\n          })\n        );\n      } catch (error) {\n        handleErrorSnackbar(\n          t('uploader.attachments.typeUpdateFailedTitle', {\n            defaultValue: 'Failed to update attachment type'\n          }),\n          t('uploader.attachments.typeUpdateFailedMessage', {\n            defaultValue:\n              'We encountered a system error while trying to update the attachment type. Please try again.'\n          })\n        );\n        console.error(error);\n      } finally {\n        markAttachmentUpdating(transactionAttachmentId, false);\n      }\n    },\n    [\n      markAttachmentUpdating,\n      setPreviousAttachments,\n      handleSuccessSnackbar,\n      handleErrorSnackbar,\n      t\n    ]\n  );\n\n  const renderCurrentAttachments = () => {\n    return currentAttachments.map(({ file, attachmentType, uploading }, index) => (\n      <React.Fragment key={index}>\n        {index > 0 && <Divider component='li' />}\n        <ListItem className='list-separator-item attachment-row'>\n          <Box className='attachment-row-name' title={file.name}>\n            {file.name}\n          </Box>\n          <Box className='attachment-row-type'>\n            <UdpDropdown\n              placeholder={selectTypeLabel}\n              options={attachmentTypes?.pageList ?? []}\n              optionLabel='name'\n              optionValue='transactionAttachmentTypeId'\n              value={attachmentType}\n              onChange={(e) => handleAttachmentTypeChange(index, e.target.value)}\n              controlSize='small'\n              includeErrorPadding={false}\n              disabled={uploading}\n              required\n            />\n          </Box>\n          <Box className='attachment-row-actions'>\n            {uploading ? (\n              <UdpSpinner size='tiny' />\n            ) : (\n              <IconButton\n                size='small'\n                aria-label={t('common.remove', { defaultValue: 'Remove' })}\n                onClick={() => handleAttachmentRemoveClick(file, index)}\n              >\n                <DeleteIcon />\n              </IconButton>\n            )}\n          </Box>\n        </ListItem>\n      </React.Fragment>\n    ));\n  };\n\n  const renderPreviousAttachments = () => {\n    return previousAttachments.map((file, index) => {\n      const isUpdating = updatingAttachmentIds.has(file.transactionAttachmentId);\n      return (\n        <React.Fragment key={index}>\n          {index > 0 && <Divider component='li' />}\n          <ListItem className='attachment-row'>\n            <Box className='attachment-row-name' title={file.fileName}>\n              {file.fileName ?? file.name}\n            </Box>\n            <Box className='attachment-row-type'>\n              <UdpDropdown\n                placeholder={selectTypeLabel}\n                options={attachmentTypes?.pageList ?? []}\n                optionLabel='name'\n                optionValue='transactionAttachmentTypeId'\n                value={findAttachmentType(file.transactionAttachmentTypeId)}\n                onChange={(e) =>\n                  handlePreviousAttachmentTypeChange(file, e.target.value)\n                }\n                controlSize='small'\n                includeErrorPadding={false}\n                disabled={isUpdating}\n              />\n            </Box>\n            <Box className='attachment-row-actions'>\n              {isUpdating ? (\n                <UdpSpinner size='tiny' />\n              ) : (\n                <>\n                  <IconButton\n                    size='small'\n                    aria-label={t('common.delete', { defaultValue: 'Delete' })}\n                    onClick={() => handleAttachmentDeleteClick(file, index)}\n                  >\n                    <DeleteIcon />\n                  </IconButton>\n                  <IconButton\n                    size='small'\n                    aria-label={t('common.download', {\n                      defaultValue: 'Download'\n                    })}\n                    onClick={() => handleDownloadFile(file)}\n                  >\n                    <DownloadIcon />\n                  </IconButton>\n                </>\n              )}\n            </Box>\n          </ListItem>\n        </React.Fragment>\n      );\n    });\n  };\n\n  const renderConfirmationContent = () => {\n    const isDeleteAction = attachmentAction === AttachmentAction.Delete;\n    const fileName = attachmentToDelete?.fileName ?? attachmentToDelete?.name;\n\n    return (\n      <>\n        <p className={'deleteSubTitle'}>\n          {isDeleteAction\n            ? t('uploader.attachments.confirmDelete', {\n                defaultValue:\n                  'Are you sure you want to delete this attachment -'\n              })\n            : t('uploader.attachments.confirmRemove', {\n                defaultValue:\n                  'Are you sure you want to remove this attachment -'\n              })}{' '}\n          <strong>{`\"${fileName}\"`}</strong>?\n        </p>\n        {isDeleteAction && (\n          <p>\n            {t('uploader.attachments.cannotBeUndone', {\n              defaultValue: 'This action cannot be undone.'\n            })}\n          </p>\n        )}\n      </>\n    );\n  };\n\n  return (\n    <>\n      <div className='card-wrapper'>\n        {attachmentProgress && (\n          <div className='linear-progress'>\n            <LinearProgress />\n          </div>\n        )}\n        <AmbientCard\n          fullWidth={true}\n          title={t('uploader.attachments.addNewTitle', {\n            defaultValue: 'Add New Attachments'\n          })}\n          variant='secondary'\n          subtitle={t('uploader.attachments.addNewSubtitle', {\n            defaultValue: 'These files will be included with the submittal(s)'\n          })}\n        >\n          <DragDropFileUpload\n            title={t('uploader.attachments.dragDropTitle', {\n              defaultValue: 'Drag and drop files here or click to browse'\n            })}\n            handleUploadFile={handleAddFiles}\n            hideSelectFileButton={false}\n            hideFilePreview={!filePreview}\n            minHeight='200px'\n            maxHeight='400px'\n            multiple={true}\n          />\n        </AmbientCard>\n        {currentAttachments?.length > 0 && (\n          <AmbientCard\n            fullWidth={true}\n            title={t('uploader.attachments.currentTitle', {\n              defaultValue: 'Attachments to Upload'\n            })}\n            subtitle={\n              onUploadAttachments\n                ? t('uploader.attachments.toUploadSubtitleEdit', {\n                    defaultValue:\n                      'Choose an attachment type to upload each file'\n                  })\n                : t('uploader.attachments.toUploadSubtitleCreate', {\n                    defaultValue:\n                      'These files upload when the transaction is created'\n                  })\n            }\n          >\n            <List>{renderCurrentAttachments()}</List>\n          </AmbientCard>\n        )}\n        {previousAttachments.length > 0 && (\n          <AmbientCard\n            fullWidth={true}\n            title={t('uploader.attachments.previousTitle', {\n              defaultValue: 'Attachments'\n            })}\n          >\n            <List>{renderPreviousAttachments()}</List>\n          </AmbientCard>\n        )}\n      </div>\n\n      <FluentDialog\n        title={\n          <div className={'deleteTitle'}>\n            <span>\n              {attachmentAction === AttachmentAction.Delete\n                ? t('uploader.attachments.deleteDialogTitle', {\n                    defaultValue: 'Delete Attachment'\n                  })\n                : t('uploader.attachments.removeDialogTitle', {\n                    defaultValue: 'Remove Attachment'\n                  })}\n            </span>\n            <FluentIconButton\n              aria-label={t('common.close', { defaultValue: 'Close' })}\n              icon={ChromeCloseIcon}\n              onClick={handleCloseAttachmentDialog}\n            />\n          </div>\n        }\n        message={renderConfirmationContent()}\n        labelOne={\n          attachmentAction === AttachmentAction.Delete\n            ? t('common.delete', { defaultValue: 'Delete' })\n            : t('common.remove', { defaultValue: 'Remove' })\n        }\n        actionOne={\n          attachmentAction === AttachmentAction.Delete\n            ? deleteAttachment\n            : () =>\n                removeAttachmentFromList(\n                  currentAttachments,\n                  setCurrentAttachments\n                )\n        }\n        labelTwo={t('common.cancel', { defaultValue: 'Cancel' })}\n        actionTwo={handleCloseAttachmentDialog}\n        disableOne={deletingAttachment}\n        disableTwo={deletingAttachment}\n        progress={deletingAttachment}\n        open={attachmentDialogOpen}\n        handleClose={deletingAttachment ? undefined : handleCloseAttachmentDialog}\n        fullWidth\n      />\n    </>\n  );\n};\n"],"mappings":"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"}