{"version":3,"file":"js/5b7397c9c358d40f79a6.chunk.js","mappings":"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","sources":["webpack:///./features/file-attachments/config.ts","webpack:///./features/file-attachments/types/FileUploadStatus.ts","webpack:///./features/file-attachments/hooks/useFileAttachments.ts","webpack:///./features/file-attachments/components/FileAttachments.tsx","webpack:///./features/file-attachments/components/FileAttachmentButton.tsx","webpack:///./features/file-attachments/services/companyFileStorageService.ts","webpack:///./features/file-attachments/services/fileStorageService.ts","webpack:///./features/file-attachments/utils/createReceivablesAttachmentCallbacks.ts","webpack:///./features/file-attachments/utils/createBillAttachmentCallbacks.ts","webpack:///./features/file-attachments/components/FileAttachmentCard.tsx","webpack:///./features/file-attachments/components/FileAttachmentCards.tsx"],"sourcesContent":["export const DEFAULT_VALID_FILE_EXTENSIONS: ReadonlyArray = [\n '.pdf',\n 'image/jpeg',\n 'image/png',\n];\nexport const DEFAULT_MAX_UPLOADS_COUNT = 5;\n","export enum FileUploadStatus {\n Uploading = 'Uploading',\n Uploaded = 'Uploaded',\n}\n","import React, { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport { useConfirm } from 'material-ui-confirm';\nimport prettyBytes from 'pretty-bytes';\n\nimport { FILE_STORAGE } from '@/config/env';\nimport { ApiErrorResponse } from '@/features/api';\n\nimport { FileAttachment } from '../types/FileAttachment';\nimport { FileAttachmentCallbacks } from '../types/FileAttachmentCallbacks';\nimport { FileUploadStatus } from '../types/FileUploadStatus';\nimport { OcrFileViewModel } from '../types/OcrFileViewModel';\nimport { UploadedFileViewModel } from '../types/UploadedFileViewModel';\n\ntype UseFileAttachmentsProps = {\n /** Callbacks for fetching and viewing attachments. */\n callbacks: FileAttachmentCallbacks;\n /** Extensions/MIME types that are accepted for upload. If empty, all files are accepted. */\n validFileExtensions: ReadonlyArray;\n /** Whether to allow file uploads. */\n allowFileUpload: boolean;\n /** Maximum number of uploaded files permitted. */\n maxUploadsCount: number;\n /** Previously uploaded files to display. */\n uploadedFilesInitialValue: Array;\n /** OCR file to display. */\n ocrFile: OcrFileViewModel;\n /**\n * When `true`, attachments will be fetched on component mount. Specify `false` when you want to\n * prevent that for lazy-loading, e.g. until a menu is opened, or while an entity is created on\n * the server (like a payment request).\n */\n shouldFetchAttachments: boolean;\n /** Callback to notify when an arbitrary field has changed. */\n onFieldChanged: (fieldName: string, fieldValue: unknown) => void;\n};\n\n/**\n * Hook which underpins attachment upload components.\n */\nconst useFileAttachments = ({\n allowFileUpload,\n callbacks,\n maxUploadsCount,\n ocrFile,\n shouldFetchAttachments,\n uploadedFilesInitialValue,\n validFileExtensions,\n onFieldChanged,\n}: UseFileAttachmentsProps) => {\n const instanceId = useId();\n\n const intl = useIntl();\n const confirm = useConfirm();\n\n const {\n data: attachments,\n error: attachmentsError,\n isFetching: attachmentsIsLoading,\n refetch: refetchAttachments,\n isSuccess: attachmentsIsSuccess,\n } = useQuery({\n queryKey: ['attachments', instanceId],\n queryFn: () => callbacks.getAttachments(),\n enabled: shouldFetchAttachments,\n });\n\n const prettyMaxFileSize = useMemo(\n () => prettyBytes(FILE_STORAGE.MAX_UPLOAD_SIZE_BYTES, { locale: intl.locale }),\n [intl.locale]\n );\n const fileInputRef = useRef(null);\n const [uploadedFiles, setUploadedFiles] = useState>(\n uploadedFilesInitialValue ?? []\n );\n\n const {\n mutate: uploadAttachments,\n isLoading: uploadAttachmentsIsLoading,\n isSuccess: uploadAttachmentsIsSuccess,\n } = useMutation({\n mutationFn: (fileList: FileList) => callbacks.filesSelected(fileList),\n onMutate: () => {\n // Notify the callback that upload started\n if (callbacks.fileUploadStatusChanged) {\n callbacks.fileUploadStatusChanged(FileUploadStatus.Uploading);\n }\n },\n onSettled: () => {\n // Notify the callback that upload finished\n if (callbacks.fileUploadStatusChanged) {\n callbacks.fileUploadStatusChanged(FileUploadStatus.Uploaded);\n }\n },\n onSuccess: (uploadedFile) => {\n setUploadedFiles((prev) => {\n const next = [...prev, uploadedFile];\n callbacks.filesUploaded?.(next);\n return next;\n });\n },\n onError: (error: ApiErrorResponse) => {\n // Console error is used for historical reasons\n // eslint-disable-next-line no-console\n console.error('Upload error:', error);\n\n confirm({\n title: intl.formatMessage({ defaultMessage: 'Error uploading file' }),\n description: error?.type\n ? intl.formatMessage(\n {\n defaultMessage:\n 'There was an error uploading this file: {errorType}. Please try again later.',\n },\n { errorType: error.type }\n )\n : intl.formatMessage({\n defaultMessage:\n 'There was an unexpected error uploading this file. Please try again later.',\n }),\n hideCancelButton: true,\n });\n },\n });\n\n const { mutate: deleteAttachment, isLoading: deleteAttachmentIsLoading } = useMutation({\n mutationFn: (uploadedFile: UploadedFileViewModel) => {\n /*\n `fileDeleted` returns a boolean, so we need to update state here, instead of in `onSuccess`.\n\n Unfortunately, that means if there's a failure, the state will be out of sync with the server;\n however, current business rules allow for that in order to allow the user to continue making a\n payment without being stuck with an attachment they can't remove.\n */\n setUploadedFiles((prev) => {\n const next = prev.filter(\n (file) => file.companyFileStorageFileId !== uploadedFile.companyFileStorageFileId\n );\n callbacks.filesUploaded?.(next);\n return next;\n });\n\n return callbacks.fileDeleted(uploadedFile);\n },\n onError: (error: ApiErrorResponse) => {\n // Console error is used for historical reasons\n // eslint-disable-next-line no-console\n console.error('delete error:', error);\n\n // At the moment we will silently fail if file could not be removed from the server\n },\n });\n\n useEffect(() => {\n if (attachmentsIsSuccess || uploadAttachmentsIsSuccess) {\n onFieldChanged?.('hasAttachment', attachments?.length > 0 || uploadedFiles.length > 0);\n }\n }, [\n attachments,\n uploadedFiles,\n onFieldChanged,\n attachmentsIsSuccess,\n uploadAttachmentsIsSuccess,\n ]);\n\n const handleAttachmentUpload = (event: React.ChangeEvent) => {\n const fileList = event.target.files;\n\n if (fileList.length < 1) {\n return;\n }\n\n if (fileList[0].size > FILE_STORAGE.MAX_UPLOAD_SIZE_BYTES) {\n // Reset file input\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n\n confirm({\n title: intl.formatMessage({ defaultMessage: 'Upload size limit exceeded!' }),\n description: intl.formatMessage(\n { defaultMessage: 'Please upload attachments that are less than {maxUploadSize} each.' },\n { maxUploadSize: prettyMaxFileSize }\n ),\n hideCancelButton: true,\n });\n\n return;\n }\n\n uploadAttachments(fileList);\n };\n\n const handleConfirmUpload = useCallback(() => {\n callbacks.confirmUploadCallback(uploadedFiles);\n\n // Clear the list of uploaded files\n setUploadedFiles([]);\n }, [callbacks, uploadedFiles]);\n\n const handleViewUploadedFile = useCallback(\n (file: UploadedFileViewModel) => {\n callbacks.viewUploadedFile(file);\n },\n [callbacks]\n );\n\n const handleViewAttachment = useCallback(\n (attachment: FileAttachment) => {\n callbacks.viewAttachment(attachment);\n },\n [callbacks]\n );\n\n const handleViewOcrAttachment = useCallback(\n (documentFileId: string) => {\n callbacks.viewOcrAttachment(documentFileId);\n },\n [callbacks]\n );\n\n /** File types accepted by the `file` input */\n const validFileTypes = useMemo(\n () => (validFileExtensions ? validFileExtensions.join(',') : undefined),\n [validFileExtensions]\n );\n\n const isMaxFilesUploaded = uploadedFiles.length >= maxUploadsCount;\n\n const displayConfirmButton = callbacks.confirmUploadCallback != null && uploadedFiles.length > 0;\n\n const hasAttachmentsToDisplay = useMemo(\n () =>\n ocrFile != null ||\n attachments?.length > 0 ||\n allowFileUpload ||\n (!allowFileUpload && uploadedFiles?.length > 0),\n [ocrFile, attachments, allowFileUpload, uploadedFiles]\n );\n\n return {\n attachments,\n attachmentsError,\n attachmentsIsLoading,\n attachmentsIsSuccess,\n refetchAttachments,\n prettyMaxFileSize,\n fileInputRef,\n uploadedFiles,\n isUploadingAttachments: uploadAttachmentsIsLoading,\n deleteAttachment,\n deleteAttachmentIsLoading,\n handleAttachmentUpload,\n handleConfirmUpload,\n handleViewUploadedFile,\n handleViewAttachment,\n handleViewOcrAttachment,\n isMaxFilesUploaded,\n validFileTypes,\n displayConfirmButton,\n hasAttachmentsToDisplay,\n };\n};\n\nexport { useFileAttachments, UseFileAttachmentsProps };\n","import React, { FC, useId } from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\nimport AddIcon from '@mui/icons-material/Add';\nimport AttachmentIcon from '@mui/icons-material/Attachment';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport DownloadingIcon from '@mui/icons-material/Downloading';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport FilePresentOutlinedIcon from '@mui/icons-material/FilePresentOutlined';\nimport FileUploadIcon from '@mui/icons-material/FileUpload';\nimport InfoIcon from '@mui/icons-material/Info';\nimport UploadFileOutlinedIcon from '@mui/icons-material/UploadFileOutlined';\nimport {\n ButtonProps,\n Divider,\n IconButton,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n} from '@mui/material';\nimport { bindMenu, bindTrigger, usePopupState } from 'material-ui-popup-state/hooks';\n\nimport Tooltip from '@/components/Tooltip';\nimport {\n DEFAULT_MAX_UPLOADS_COUNT,\n DEFAULT_VALID_FILE_EXTENSIONS,\n} from '@/features/file-attachments/config';\nimport { useFileAttachments } from '@/features/file-attachments/hooks/useFileAttachments';\n\nimport { FileAttachmentCallbacks } from '../types/FileAttachmentCallbacks';\nimport { OcrFileViewModel } from '../types/OcrFileViewModel';\nimport { UploadedFileViewModel } from '../types/UploadedFileViewModel';\n\ntype CustomLabelProps = ButtonProps & {\n hasAttachments: boolean;\n};\n\ninterface Props {\n /** Whether there are attachments to display */\n hasAttachments: boolean;\n /** Callbacks for fetching and viewing attachments */\n callbacks: FileAttachmentCallbacks;\n /**\n * Optional array of accepted extensions without periods; e.g., `['pdf','image/jpeg', 'image/gif']`.\n * If not specified then all files can be uploaded.\n *\n * @see {@link DEFAULT_VALID_FILE_EXTENSIONS} for defaults\n */\n validFileExtensions?: Array;\n /** Whether to allow file uploads */\n allowFileUpload?: boolean;\n /** @see {@link DEFAULT_MAX_UPLOADS_COUNT} for default */\n maxUploadsCount?: number;\n /** Previously uploaded files to display */\n uploadedFiles?: Array;\n /** OCR file to display */\n ocrFile?: OcrFileViewModel;\n /** Custom label component to use for triggering the menu (instead of the default icon button) */\n CustomLabel?: React.FC;\n /**\n * Fetch the attachments when loading this fragment?\n * True by default where a payment or receivable ID is available\n * False on cases where a payment or receivable is about to be created (no ID)\n */\n shouldFetchOnLoad?: boolean;\n /** Callback to notify when an arbitrary field has changed */\n onFieldChanged?: (fieldName: string, fieldValue: unknown) => void;\n}\n\n/**\n * A component to display and upload file attachments.\n */\nconst FileAttachments: FC = ({\n allowFileUpload = true,\n callbacks,\n hasAttachments,\n maxUploadsCount = DEFAULT_MAX_UPLOADS_COUNT,\n ocrFile,\n shouldFetchOnLoad = true,\n uploadedFiles: previouslyUploadedFiles = [],\n validFileExtensions = DEFAULT_VALID_FILE_EXTENSIONS,\n onFieldChanged,\n CustomLabel = null,\n}) => {\n const menuId = useId();\n const menuState = usePopupState({ variant: 'popover', popupId: menuId });\n const shouldFetchAttachments = menuState.isOpen && shouldFetchOnLoad;\n\n const {\n attachments,\n attachmentsError,\n attachmentsIsLoading: isFetchingAttachments,\n refetchAttachments,\n attachmentsIsSuccess: hasFetchedAttachments,\n prettyMaxFileSize,\n fileInputRef,\n uploadedFiles,\n isUploadingAttachments,\n deleteAttachment,\n handleAttachmentUpload,\n handleConfirmUpload,\n handleViewUploadedFile,\n handleViewAttachment,\n handleViewOcrAttachment,\n isMaxFilesUploaded,\n validFileTypes,\n displayConfirmButton,\n hasAttachmentsToDisplay,\n } = useFileAttachments({\n allowFileUpload,\n callbacks,\n maxUploadsCount,\n ocrFile,\n shouldFetchAttachments,\n uploadedFilesInitialValue: previouslyUploadedFiles,\n validFileExtensions,\n onFieldChanged,\n });\n\n const intl = useIntl();\n\n /** We don't want to render the component if there are no attachments nor ability to upload */\n const shouldDisableComponent =\n !hasAttachments && !allowFileUpload && !ocrFile && !(previouslyUploadedFiles?.length > 0);\n if (shouldDisableComponent) {\n return null;\n }\n\n const getConfirmUploadButton = () =>\n displayConfirmButton ? (\n \n \n \n \n \n ) : null;\n\n const getOptions = () => {\n if (isFetchingAttachments) {\n return (\n \n \n \n \n \n \n \n \n );\n }\n\n if (attachmentsError) {\n return (\n refetchAttachments()} key=\"fetch-error\">\n \n \n \n \n \n \n \n );\n }\n\n if (hasFetchedAttachments) {\n if (!hasAttachmentsToDisplay) {\n return (\n \n \n \n \n \n \n \n \n );\n }\n\n return [\n ocrFile && (\n handleViewOcrAttachment(ocrFile.documentFileId)}\n key={ocrFile.documentFileId}\n >\n \n \n \n {ocrFile.fileName}\n \n ),\n Array.isArray(attachments)\n ? attachments.map((attachment, index) => (\n handleViewAttachment(attachment)}\n >\n \n \n \n {attachment.name}\n \n ))\n : null,\n !allowFileUpload &&\n uploadedFiles\n .filter((file) => Boolean(file.companyFileStorageFileId))\n .map((file) => (\n handleViewUploadedFile(file)}\n >\n \n \n \n {file.fileName}\n \n )),\n ].filter(Boolean);\n }\n\n return null;\n };\n\n const getUploadOptions = () => {\n if (!allowFileUpload) {\n return null;\n }\n\n const getDivider = () =>\n // Only show divider if there are bill attachments (to provide some separation)\n attachments?.length > 0 ? : null;\n\n const getUploadButton = () => {\n // Limit number of allowed uploads\n if (isMaxFilesUploaded) {\n return [\n \n \n \n \n \n \n \n ,\n ,\n getConfirmUploadButton(),\n ].filter(Boolean);\n }\n\n if (isUploadingAttachments) {\n return (\n \n \n \n \n \n \n \n \n );\n }\n\n return [\n \n \n \n \n \n \n \n \n ,\n getConfirmUploadButton(),\n ].filter(Boolean);\n };\n\n const dispatchAccountingSoftwareMenuItemClick = (uploadedFile: UploadedFileViewModel) => {\n // View Accounting Software attachment\n const attachment = {\n name: uploadedFile.fileName,\n contentType: uploadedFile.contentType,\n url: uploadedFile.url,\n };\n handleViewAttachment(attachment);\n };\n\n const getUploadedFiles = () => {\n if (uploadedFiles.length === 0) {\n return null;\n }\n\n const menuItems = uploadedFiles.map((file) =>\n file.companyFileStorageFileId ? (\n handleViewUploadedFile(file)}\n key={file.companyFileStorageFileId}\n data-testid=\"uploaded-file-menu-item\"\n >\n \n \n \n {file.fileName}\n\n \n {\n // Prevent selection of the attachment\n event.stopPropagation();\n\n deleteAttachment(file);\n }}\n sx={{ ml: 1 }}\n >\n \n \n \n \n ) : (\n dispatchAccountingSoftwareMenuItemClick(file)}\n >\n \n \n \n {file.fileName}\n \n )\n );\n\n return [menuItems, ];\n };\n\n return [getDivider(), getUploadedFiles(), getUploadButton()];\n };\n\n return (\n <>\n \n {CustomLabel ? (\n \n ) : (\n \n \n \n )}\n \n \n {getOptions()}\n {getUploadOptions()}\n \n \n );\n};\n\nexport type { Props as FileAttachmentsProps };\nexport { FileAttachments, DEFAULT_MAX_UPLOADS_COUNT };\n","import * as React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\ninterface Props {\n 'aria-controls': string;\n 'aria-haspopup': boolean;\n 'aria-label': string;\n hasAttachments: boolean;\n onClick: (event: React.MouseEvent) => void;\n}\n\nconst FileAttachmentsButton = (props: Props): React.JSX.Element => {\n const {\n 'aria-controls': ariaControls,\n 'aria-haspopup': ariaHaspopup,\n 'aria-label': ariaLabel,\n hasAttachments,\n onClick,\n } = props;\n\n return (\n \n {hasAttachments ? (\n \n ) : (\n \n )}\n \n );\n};\n\nexport default FileAttachmentsButton;\n","import * as system from 'durandal/system';\n\nimport * as companyService from '@/legacy/services/company';\nimport { SessionTimeoutService } from '@/legacy/services/sessionTimeout';\nimport * as userService from '@/legacy/services/user';\nimport * as plootoUtils from '@/legacy/utils/plooto';\n\nimport type { FileStorageDownloadLinkViewModel } from '../types/FileStorageDownloadLinkViewModel';\n\nconst API_PREFIX = 'v1';\n\nexport class CompanyFileStorageService {\n public generateDownloadFileAttachmentLink(companyFileStorageFileId: string) {\n const companyId = companyService.Instance.CompanyId();\n return system\n .defer((dfd) => {\n userService.Instance.AuthorizedGet(\n `${\n import.meta.env.APP_URLS_API_URL\n }/${API_PREFIX}/companies/${companyId}/fileStorage/${companyFileStorageFileId}`\n )\n .then((data) => {\n if (plootoUtils.IsNullOrUndefined(data) || data.error === true) {\n // The only error that can occur during link generation is that the user is no longer logged in (or session token expired)\n if (data.type === 'invalid.authentication') {\n SessionTimeoutService.showTimeout();\n }\n\n dfd.reject(data);\n return;\n }\n\n dfd.resolve(data);\n })\n .fail((error) => console.error(error));\n })\n .promise();\n }\n}\n\nexport const Instance = new CompanyFileStorageService();\n","import * as system from 'durandal/system';\n\nimport { FILE_STORAGE } from '@/config/env';\nimport { ApiService } from '@/features/api';\nimport { Instance as companyService } from '@/legacy/services/company';\nimport * as userService from '@/legacy/services/user';\n\nimport { FileStorageDownloadLinkViewModel } from '../types/FileStorageDownloadLinkViewModel';\nimport { UploadedFileViewModel } from '../types/UploadedFileViewModel';\n\ninterface PopupParameters {\n location: number;\n width: number;\n height: number;\n left?: number;\n top?: number;\n}\n\nexport class FileStorageService {\n private userService: userService.UserService;\n\n constructor() {\n this.userService = userService.Instance;\n }\n\n public upload(attachment: FileList): Promise {\n const companyId = companyService.CompanyId();\n const formData = new FormData();\n formData.append('fileName', attachment[0].name);\n formData.append('file', attachment[0]);\n formData.append('companyId', companyId);\n\n const url = `${FILE_STORAGE.API_BASE_URL}/${FILE_STORAGE.API_VERSION}/upload`;\n return ApiService.post(url, { body: formData });\n }\n\n public delete(uniqueFileId: string): Promise {\n const companyId = companyService.CompanyId();\n const url = `${FILE_STORAGE.API_BASE_URL}/${FILE_STORAGE.API_VERSION}/${companyId}/${uniqueFileId}`;\n return ApiService.remove(url);\n }\n\n public viewFileStorageFile(viewModel: FileStorageDownloadLinkViewModel) {\n return system\n .defer((dfd) => {\n // default parameter values\n const popupHeight = 650;\n const popupWidth = 800;\n const popupCentered = true;\n\n // default parameters\n const parameters: PopupParameters = {\n location: 1,\n width: popupWidth,\n height: popupHeight,\n };\n\n // center pop-up if needed\n if (popupCentered) {\n parameters.left = (window.screen.width - popupWidth) / 2;\n parameters.top = (window.screen.height - popupHeight) / 2;\n }\n\n const features = $.map(parameters, (value, name) => `${name}=${value}`).join(',');\n\n // open pop-up without URL first to ensure that pop-up blocker wouldn't prevent it after our delay\n const popup = window.open('', '', features);\n\n if (popup.document) {\n popup.document.write(\n 'Connecting...'\n );\n }\n\n popup.location.href = `${FILE_STORAGE.API_BASE_URL}/${FILE_STORAGE.API_VERSION}/${viewModel.companyId}/${viewModel.companyFileStorageFileId}/${viewModel.downloadId}`;\n })\n .promise();\n }\n}\nexport const Instance = new FileStorageService();\n","import { isNil } from 'lodash-es';\n\nimport { AccountingSoftwareBillAttachmentDetails } from '@/features/accounting-software';\nimport { Instance as companyAccountingSoftwareService } from '@/features/accounting-software/services/companyAccountingSoftware';\nimport { NewPaymentRequest } from '@/legacy/services/company/paymentRequest';\n\nimport { Instance as CompanyFileStorageService } from '../services/companyFileStorageService';\nimport { Instance as fileStorageService } from '../services/fileStorageService';\nimport { FileAttachmentCallbacks } from '../types/FileAttachmentCallbacks';\nimport { UploadedFileViewModel } from '../types/UploadedFileViewModel';\n\n/**\n * Creates callbacks for receivables attachables.\n */\nfunction createBillAttachmentCallbacks(\n newPaymentRequest: NewPaymentRequest\n): FileAttachmentCallbacks {\n /**\n * Called when a bill was selected with attachments in accounting software.\n *\n * Also groups all of the logic for attachments and uploads in a single place/\n */\n function getAttachments() {\n return companyAccountingSoftwareService.getPaymentRequestAttachments(\n newPaymentRequest.billId()\n );\n }\n\n /**\n * This will be called in react FileAttachmentsFragment when clicking on an accounting software\n * bill.\n */\n function viewAttachment(attachment: AccountingSoftwareBillAttachmentDetails): void {\n const accountingSoftware = companyAccountingSoftwareService.softwarePackage;\n if (isNil(accountingSoftware)) {\n return;\n }\n\n accountingSoftware.GetBillAttachment(attachment);\n }\n\n /**\n * This will be called in react FileAttachmentsFragment when clicking on file attachment viewing\n */\n async function viewUploadedFile(uploadedFile: UploadedFileViewModel): Promise {\n const fileStorageDownloadLinkViewModel =\n await CompanyFileStorageService.generateDownloadFileAttachmentLink(\n uploadedFile.companyFileStorageFileId\n );\n\n await fileStorageService.viewFileStorageFile(fileStorageDownloadLinkViewModel);\n }\n\n /**\n * This will be called in react FileAttachmentsFragment when clicking on the delete button for an\n * payable attachment.\n */\n async function fileDeleted(uploadedFile: UploadedFileViewModel): Promise {\n return fileStorageService.delete(uploadedFile.companyFileStorageFileId);\n }\n\n /**\n * This is called in react FileAttachmentsFragment when user selected some files to upload.\n * If this throws the FileAttachmentsFragment.tsx QueryFilesSelected will catch and show\n * error modal.\n */\n async function filesSelected(fileList: FileList): Promise {\n return fileStorageService.upload(fileList);\n }\n\n async function filesUploaded(uploadedFiles: Array): Promise {\n /**\n * @todo Find a way to do this immutably.\n */\n // eslint-disable-next-line no-param-reassign\n newPaymentRequest.uploadedFiles = uploadedFiles;\n }\n\n return {\n getAttachments,\n viewAttachment,\n fileDeleted,\n filesSelected,\n viewUploadedFile,\n filesUploaded,\n };\n}\n\nexport default createBillAttachmentCallbacks;\n","import { isNil } from 'lodash-es';\n\nimport { AccountingSoftwareBillAttachmentDetails } from '@/features/accounting-software';\nimport { Instance as companyAccountingSoftwareService } from '@/features/accounting-software/services/companyAccountingSoftware';\nimport DocumentService from '@/legacy/features/companies/documents/services/document';\nimport * as paymentService from '@/legacy/services/company/payment';\n\nimport { Instance as companyFileStorageService } from '../services/companyFileStorageService';\nimport { Instance as fileStorageService } from '../services/fileStorageService';\nimport { FileAttachmentCallbacks } from '../types/FileAttachmentCallbacks';\nimport { FileUploadStatus } from '../types/FileUploadStatus';\nimport { UploadedFileViewModel } from '../types/UploadedFileViewModel';\n\n/**\n * Keep track of how many attachments are in progress of uploading.\n * We can use this to ensure user can't continue if files are still being uploaded for a new payment.\n **/\nlet filesUploadingCount = 0;\n\nexport const hasFilesUploading = () => filesUploadingCount > 0;\n\n/**\n * Creates all the callbacks in one place to avoid adding these functions as methods to payments/addMultiple.ts\n **/\nexport const createBillAttachmentCallbacks = (\n newPayment: paymentService.NewPayment\n): FileAttachmentCallbacks => {\n /**\n * This will be called in react FileAttachmentsFragment when a bill was selected with attachments in accounting software.\n * Also groups all of the logic for attachments and uploads in a single place\n */\n const getAttachments = () =>\n companyAccountingSoftwareService.getAttachmentsForBillId(newPayment.billId);\n\n /**\n * This will be called in react FileAttachmentsFragment when clicking on an accounting software bill\n */\n const viewAttachment = (attachment: AccountingSoftwareBillAttachmentDetails) => {\n const accountingSoftware = companyAccountingSoftwareService.softwarePackage;\n if (isNil(accountingSoftware)) {\n return;\n }\n\n accountingSoftware.GetBillAttachment(attachment);\n };\n\n /**\n * This will be called in react FileAttachmentsFragment when clicking on an accounting software bill published from Document Tab\n */\n const viewOcrAttachment = async (documentFileId: string) => {\n const link = await DocumentService.createDocumentPreviewLink(documentFileId);\n window.open(link);\n };\n\n /**\n * This will be called in react FileAttachmentsFragment when clicking on file attachment viewing\n */\n const viewUploadedFile = async (uploadedFile: UploadedFileViewModel) => {\n const fileStorageDownloadLinkViewModel =\n await companyFileStorageService.generateDownloadFileAttachmentLink(\n uploadedFile.companyFileStorageFileId\n );\n await fileStorageService.viewFileStorageFile(fileStorageDownloadLinkViewModel);\n };\n\n /**\n * This will be called in react FileAttachmentsFragment when clicking on the delete button for an payable attachment\n */\n const fileDeleted = async (uploadedFile: UploadedFileViewModel) =>\n fileStorageService.delete(uploadedFile.companyFileStorageFileId);\n\n /**\n * This is called in react FileAttachmentsFragment when user selected some files to upload\n */\n const filesSelected = async (fileList: FileList) =>\n // If this throws the FileAttachmentsFragment.tsx QueryFilesSelected will catch and show error modal\n fileStorageService.upload(fileList);\n\n const filesUploaded = async (uploadedFiles: Array) => {\n newPayment.uploadedFiles = uploadedFiles;\n };\n\n const fileUploadStatusChanged = (newFileUploadStatus: FileUploadStatus) => {\n filesUploadingCount += newFileUploadStatus === FileUploadStatus.Uploading ? 1 : -1;\n };\n\n return {\n getAttachments,\n viewAttachment,\n viewOcrAttachment,\n\n fileDeleted,\n filesSelected,\n viewUploadedFile,\n filesUploaded,\n\n fileUploadStatusChanged,\n };\n};\n","import {\n ChangeEvent,\n DragEvent,\n InputHTMLAttributes,\n MutableRefObject,\n useCallback,\n useId,\n useState,\n} from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\nimport { Error, FilePresent, UploadFile } from '@mui/icons-material';\nimport {\n Box,\n Button,\n Card,\n CardActionArea,\n CardActions,\n CardContent,\n Skeleton,\n Stack,\n Theme,\n Typography,\n} from '@mui/material';\nimport { lighten } from '@mui/system/colorManipulator';\n\nimport LoadingButton from '@/components/LoadingButton';\n\nconst CardSx = {\n flexGrow: { xs: 1, sm: 0 },\n flexBasis: 160,\n} as const;\n\nconst CardContentSx = {\n px: 2,\n pt: 1,\n pb: 0,\n '&:last-child': {\n pb: 1,\n },\n} as const;\n\nconst FriendlyUploadCardAnimation = {\n '@keyframes FileAttachmentUpload-wiggle': {\n '0%': {\n transform: 'scale(1.05) rotate(-1deg)',\n },\n '50%': {\n transform: 'scale(1.05) rotate(1deg)',\n },\n '100%': {\n transform: 'scale(1.05) rotate(-1deg)',\n },\n },\n '&.dragging': {\n animation: 'FileAttachmentUpload-wiggle 500ms infinite ease',\n bgcolor: (theme: Theme) => lighten(theme.palette.success.light, 0.9),\n borderColor: 'success.main',\n },\n};\n\nexport type FileAttachmentCardProps = {\n name: string;\n onView: () => void;\n onDelete?: () => void;\n};\n\nexport const FileAttachmentCard = ({ name, onView, onDelete }: FileAttachmentCardProps) => {\n const labelId = useId();\n const { formatMessage } = useIntl();\n return (\n \n \n \n \n \n \n \n \n {name}\n \n \n \n \n \n \n \n \n );\n};\n\nexport const FileAttachmentCardPlaceholder = () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n);\n\nexport type FileAttachmentCardErrorProps = { refetch: () => void };\n\nexport const FileAttachmentCardError = ({ refetch }: FileAttachmentCardErrorProps) => {\n const { formatMessage } = useIntl();\n return (\n \n lighten(theme.palette.error.light, 0.9)}\n >\n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport type FileAttachmentUploadProps = {\n fileInputRef: MutableRefObject;\n validFileTypes: InputHTMLAttributes['accept'];\n handleAttachmentUpload: (event: ChangeEvent) => void;\n isMaxFilesUploaded: boolean;\n isUploadingAttachments: boolean;\n maxUploadsCount: number;\n prettyMaxFileSize: string;\n};\n\nexport const FileAttachmentUpload = ({\n fileInputRef,\n validFileTypes,\n handleAttachmentUpload,\n isMaxFilesUploaded,\n isUploadingAttachments,\n maxUploadsCount,\n prettyMaxFileSize,\n}: FileAttachmentUploadProps) => {\n const [dragCounter, setDragCounter] = useState(0);\n const onDragEnter = useCallback(() => setDragCounter((prev) => prev + 1), []);\n const onDragLeave = useCallback(() => setDragCounter((prev) => prev - 1), []);\n const onDragOver = useCallback((event: DragEvent) => {\n event.preventDefault();\n // This how the DragDrop API works.\n // eslint-disable-next-line no-param-reassign\n event.dataTransfer.dropEffect = 'copy';\n }, []);\n const onDrop = useCallback(\n (event: DragEvent) => {\n event.preventDefault();\n setDragCounter(0);\n const fakeEvent = {\n target: { files: event.dataTransfer.files },\n } as ChangeEvent;\n handleAttachmentUpload(fakeEvent);\n },\n [handleAttachmentUpload]\n );\n const onClickChooseFile = useCallback(() => fileInputRef.current?.click(), [fileInputRef]);\n return (\n lighten(theme.palette.primary.light, 0.9),\n ...CardSx,\n ...FriendlyUploadCardAnimation,\n }}\n className={dragCounter > 0 ? 'dragging' : undefined}\n onDragEnter={onDragEnter}\n onDragLeave={onDragLeave}\n onDragOver={onDragOver}\n onDrop={onDrop}\n >\n \n \n \n \n \n \n \n \n \n {isMaxFilesUploaded ? (\n \n ) : (\n \n )}\n \n \n \n \n );\n};\n","import { FormattedMessage } from 'react-intl';\nimport { Box, Button, Typography } from '@mui/material';\nimport { Stack } from '@mui/system';\nimport { times } from 'lodash-es';\n\nimport {\n DEFAULT_MAX_UPLOADS_COUNT,\n DEFAULT_VALID_FILE_EXTENSIONS,\n} from '@/features/file-attachments/config';\n\nimport { useFileAttachments, UseFileAttachmentsProps } from '../hooks/useFileAttachments';\n\nimport {\n FileAttachmentCard,\n FileAttachmentCardError,\n FileAttachmentCardPlaceholder,\n FileAttachmentUpload,\n} from './FileAttachmentCard';\n\nexport type FileAttachmentCardsProps = {\n /** Component to use for the section heading text. */\n HeadingComponent: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n} & Pick<\n Partial,\n | 'validFileExtensions'\n | 'allowFileUpload'\n | 'maxUploadsCount'\n | 'ocrFile'\n | 'uploadedFilesInitialValue'\n | 'onFieldChanged'\n> &\n Pick;\n\nexport const FileAttachmentCards = ({\n HeadingComponent,\n allowFileUpload = true,\n callbacks,\n maxUploadsCount = DEFAULT_MAX_UPLOADS_COUNT,\n ocrFile,\n uploadedFilesInitialValue = [],\n validFileExtensions = DEFAULT_VALID_FILE_EXTENSIONS,\n onFieldChanged,\n}: FileAttachmentCardsProps) => {\n const {\n attachments,\n attachmentsError,\n attachmentsIsLoading,\n refetchAttachments,\n prettyMaxFileSize,\n fileInputRef,\n uploadedFiles,\n isUploadingAttachments,\n deleteAttachment,\n handleAttachmentUpload,\n handleConfirmUpload,\n handleViewUploadedFile,\n handleViewAttachment,\n handleViewOcrAttachment,\n isMaxFilesUploaded,\n validFileTypes,\n displayConfirmButton,\n } = useFileAttachments({\n allowFileUpload,\n callbacks,\n maxUploadsCount,\n ocrFile,\n shouldFetchAttachments: true,\n uploadedFilesInitialValue,\n validFileExtensions,\n onFieldChanged,\n });\n\n function renderListItems() {\n if (attachmentsIsLoading) {\n return times(2, (key) => );\n }\n\n if (attachmentsError) {\n return ;\n }\n\n return (\n <>\n {ocrFile && (\n handleViewOcrAttachment(ocrFile.documentFileId)}\n name={ocrFile.fileName}\n />\n )}\n {attachments?.map((attachment) => (\n handleViewAttachment(attachment)}\n />\n ))}\n {uploadedFiles?.map((file) => (\n handleViewUploadedFile(file)\n : () =>\n handleViewAttachment({\n name: file.fileName,\n contentType: file.contentType,\n url: file.url,\n })\n }\n onDelete={file.companyFileStorageFileId ? () => deleteAttachment(file) : undefined}\n />\n ))}\n {allowFileUpload && (\n \n )}\n \n );\n }\n\n const hasNoListItems =\n !attachmentsIsLoading &&\n !attachmentsError &&\n ocrFile == null &&\n !attachments?.length &&\n !uploadedFiles?.length &&\n !allowFileUpload;\n\n return (\n \n \n \n \n \n {renderListItems()}\n \n {/* Temporary empty message until design thinks of something to put here. */}\n {hasNoListItems && (\n \n \n \n )}\n {displayConfirmButton && (\n \n )}\n \n );\n};\n\nexport type FileAttachmentCardsPlaceholderProps = Pick<\n FileAttachmentCardsProps,\n 'HeadingComponent'\n>;\n\nexport const FileAttachmentCardsPlaceholder = ({\n HeadingComponent,\n}: FileAttachmentCardsPlaceholderProps) => (\n \n \n \n \n \n {times(2, (key) => (\n \n ))}\n \n \n);\n"],"names":["DEFAULT_VALID_FILE_EXTENSIONS","DEFAULT_MAX_UPLOADS_COUNT","FileUploadStatus","useFileAttachments","allowFileUpload","callbacks","maxUploadsCount","ocrFile","shouldFetchAttachments","uploadedFilesInitialValue","validFileExtensions","onFieldChanged","instanceId","useId","intl","useIntl","confirm","useConfirm","data","attachments","error","attachmentsError","isFetching","attachmentsIsLoading","refetch","refetchAttachments","isSuccess","attachmentsIsSuccess","useQuery","queryKey","queryFn","getAttachments","enabled","prettyMaxFileSize","useMemo","prettyBytes","FILE_STORAGE","MAX_UPLOAD_SIZE_BYTES","locale","fileInputRef","useRef","uploadedFiles","setUploadedFiles","useState","mutate","uploadAttachments","isLoading","uploadAttachmentsIsLoading","uploadAttachmentsIsSuccess","useMutation","mutationFn","fileList","filesSelected","onMutate","fileUploadStatusChanged","Uploading","onSettled","Uploaded","onSuccess","uploadedFile","prev","next","filesUploaded","onError","console","title","formatMessage","id","defaultMessage","description","type","errorType","hideCancelButton","deleteAttachment","deleteAttachmentIsLoading","filter","file","companyFileStorageFileId","fileDeleted","useEffect","length","handleAttachmentUpload","event","target","files","size","current","value","maxUploadSize","handleConfirmUpload","useCallback","confirmUploadCallback","handleViewUploadedFile","viewUploadedFile","handleViewAttachment","attachment","viewAttachment","handleViewOcrAttachment","documentFileId","viewOcrAttachment","validFileTypes","join","undefined","isMaxFilesUploaded","displayConfirmButton","hasAttachmentsToDisplay","isUploadingAttachments","FileAttachments","hasAttachments","shouldFetchOnLoad","previouslyUploadedFiles","CustomLabel","menuId","menuState","usePopupState","variant","popupId","isOpen","isFetchingAttachments","hasFetchedAttachments","getConfirmUploadButton","_jsx","_MenuItem","dense","onClick","children","_ListItemText","sx","color","textAlign","FormattedMessage","getOptions","_jsxs","disabled","_ListItemIcon","DownloadingIcon","fontSize","ErrorIcon","FilePresentOutlinedIcon","fileName","Array","isArray","map","index","name","Boolean","UploadFileOutlinedIcon","InfoIcon","getUploadOptions","getDivider","_Divider","getUploadButton","values","max","FileUploadIcon","component","AddIcon","maxFileSize","ref","accept","onChange","style","display","dispatchAccountingSoftwareMenuItemClick","contentType","url","getUploadedFiles","Tooltip","_IconButton","stopPropagation","ml","DeleteIcon","_Fragment","placement","bindTrigger","AttachmentIcon","_Menu","menu","mt","bindMenu","props","ariaControls","ariaHaspopup","ariaLabel","className","API_PREFIX","CompanyFileStorageService","generateDownloadFileAttachmentLink","companyId","companyService","CompanyId","system","dfd","userService","AuthorizedGet","Object","create","globalThis","import_meta_env","APP_URLS_API_URL","then","plootoUtils","SessionTimeoutService","showTimeout","reject","resolve","fail","promise","Instance","FileStorageService","constructor","upload","formData","FormData","append","API_BASE_URL","API_VERSION","ApiService","post","body","delete","uniqueFileId","remove","viewFileStorageFile","viewModel","parameters","location","width","popupWidth","height","popupHeight","left","window","screen","top","features","$","popup","open","document","write","href","downloadId","createBillAttachmentCallbacks","newPaymentRequest","companyAccountingSoftwareService","getPaymentRequestAttachments","billId","accountingSoftware","softwarePackage","_isNil","GetBillAttachment","fileStorageDownloadLinkViewModel","fileStorageService","filesUploadingCount","hasFilesUploading","newPayment","getAttachmentsForBillId","link","DocumentService","createDocumentPreviewLink","companyFileStorageService","newFileUploadStatus","CardSx","flexGrow","xs","sm","flexBasis","CardContentSx","px","pt","pb","FriendlyUploadCardAnimation","transform","animation","bgcolor","theme","lighten","palette","success","light","borderColor","FileAttachmentCard","onView","onDelete","labelId","_Card","_CardActionArea","_Box","alignItems","justifyContent","_FilePresent","_CardContent","_Typography","noWrap","_CardActions","p","_Button","FileAttachmentCardPlaceholder","_Skeleton","FileAttachmentCardError","_Error","FileAttachmentUpload","dragCounter","setDragCounter","onDragEnter","onDragLeave","onDragOver","preventDefault","dataTransfer","dropEffect","onDrop","fakeEvent","onClickChooseFile","click","borderStyle","borderRadius","primary","_Stack","gap","_UploadFile","LoadingButton","loading","FileAttachmentCards","HeadingComponent","renderListItems","_times","key","hasNoListItems","gutterBottom","Stack","direction","flexWrap","FileAttachmentCardsPlaceholder"],"sourceRoot":""}