{"version":3,"file":"TransactionAttachmentPdfStitcher.mjs","names":["React","useState","useEffect","useMemo","useCallback","useTranslation","ClientSideUdpGrid","EmptyStateDisplay","LinearProgress","SideSheet","FluentTextField","FluentButton","LayoutUnit","Typography","apiMutate","useAxiosMutate","ConfigService","PDFViewer","useHandleAxiosSnackbar","ErrorIcon","ALLOWED_EXTENSIONS","TransactionAttachmentPdfStitcher","props","transactionAttachments","onDownload","onPreview","onCancel","stitchLoading","orderedRows","onSelectionChanged","onRowOrderChanged","stitchedFileName","onFileNameChange","fileNameError","tableHeight","hidePreviewButton","hideDownloadButton","defaultPreviewSideSheet","transactionTypeId","transactionAttachmentTypes","disableFileName","onActionClick","actionButtonLabel","disableActionButton","t","orderedSelection","setOrderedSelection","sourceGridApi","setSourceGridApi","orderGridApi","setOrderGridApi","previewPdfOpen","setPreviewPdfOpen","previewPdfLoading","setPreviewPdfLoading","previewPdfError","setPreviewPdfError","previewPdfBlob","setPreviewPdfBlob","downloadingPdf","setDownloadingPdf","handleErrorSnackbar","data","fetchedTransactionAttachmentTypes","fetchTransactionAttachmentTypes","productV1ApiUrl","method","pageSize","filterElements","searchField","searchValue","searchOperator","getAll","resolvedTransactionAttachmentTypes","pageList","executeGetStitchedPdf","fileName","responseType","catch","error","errorMessage","response","Blob","text","message","defaultValue","handleOnPreviewPdfClose","handleRowOrderChanged","newOrder","handleSelectionChanged","selected","prevOrdered","selectedIds","Set","map","item","transactionAttachmentId","id","nextOrdered","filter","has","prevIds","newItems","finalSelection","filteredAttachments","ext","extension","toLowerCase","replace","includes","handleGridApiCallback","api","handleOrderGridApiCallback","getColumnDefs","type","field","headerName","tooltipField","sortable","rowDrag","filterParams","values","params","taType","transactionAttachmentTypeId","success","valueFormatter","find","value","name","selectAttachmentsGridOptions","rowDragManaged","animateRows","suppressMoveWhenRowDragging","getRowId","toString","event","getSelectedRows","rowSelection","mode","documentOrderGridOptions","onRowDragEnd","forEachNode","node","push","headerHeight","handleDownload","blob","url","URL","createObjectURL","a","document","createElement","href","download","trim","endsWith","click","revokeObjectURL","handlePreview","request","selectionIds","isActuallySelected","isSelected","setSelected","height","paddingBottom","display","justifyContent","paddingTop","length"],"sources":["../../../../../../src/udp/pages/UdpTransactionsPage/components/transactionAttachment/TransactionAttachmentPdfStitcher.jsx"],"sourcesContent":["import React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ClientSideUdpGrid } from '../../../../../UI/templates/newGrid';\nimport {\n  EmptyStateDisplay,\n  LinearProgress,\n  SideSheet\n} from '../../../../../UI';\nimport { FluentTextField } from '../../../../../UI/inputs/textField';\nimport { FluentButton } from '../../../../../UI/inputs/buttons';\nimport { LayoutUnit } from '../../../../../layout';\nimport { Typography } from '@material-ui/core';\nimport {\n  apiMutate,\n  useAxiosMutate\n} from '../../../../../utilities/useAxiosMutate';\nimport { ConfigService } from '../../../../../configService';\nimport { PDFViewer } from '../../../../../UI/fileViewer/pdfViewer';\nimport { useHandleAxiosSnackbar } from '../../../../../utilities';\nimport { ErrorIcon } from '@fluentui/react-icons';\n\nconst ALLOWED_EXTENSIONS = [\n  'pdf',\n  'jpg',\n  'jpeg',\n  'png',\n  'gif',\n  'bmp',\n  'tif',\n  'tiff'\n];\n\nexport const TransactionAttachmentPdfStitcher = (props) => {\n  const {\n    transactionAttachments = [],\n    onDownload,\n    onPreview,\n    onCancel,\n    stitchLoading,\n    orderedRows,\n    onSelectionChanged,\n    onRowOrderChanged,\n    stitchedFileName,\n    onFileNameChange,\n    fileNameError,\n    tableHeight = 'calc(100vh - 700px)',\n    hidePreviewButton = false,\n    hideDownloadButton = false,\n    defaultPreviewSideSheet = true,\n    transactionTypeId,\n    transactionAttachmentTypes,\n    disableFileName = false,\n    onActionClick,\n    actionButtonLabel = '',\n    disableActionButton = false\n  } = props;\n  const { t } = useTranslation();\n  const [orderedSelection, setOrderedSelection] = useState(orderedRows || []);\n  const [sourceGridApi, setSourceGridApi] = useState(null);\n  const [orderGridApi, setOrderGridApi] = useState(null);\n  const [previewPdfOpen, setPreviewPdfOpen] = useState(false);\n  const [previewPdfLoading, setPreviewPdfLoading] = useState(false);\n  const [previewPdfError, setPreviewPdfError] = useState(null);\n  const [previewPdfBlob, setPreviewPdfBlob] = useState(null);\n  const [downloadingPdf, setDownloadingPdf] = useState(false);\n\n  const { handleErrorSnackbar } = useHandleAxiosSnackbar();\n\n  const [\n    { data: fetchedTransactionAttachmentTypes },\n    fetchTransactionAttachmentTypes\n  ] = useAxiosMutate(\n    ConfigService.productV1ApiUrl,\n    `UdpTransactionAttachmentType/search`,\n    {\n      method: 'post',\n      data: {\n        pageSize: 50,\n        filterElements: [\n          {\n            searchField: 'TransactionTypeId',\n            searchValue: transactionTypeId,\n            searchOperator: '='\n          }\n        ],\n        getAll: true\n      }\n    }\n  );\n\n  const resolvedTransactionAttachmentTypes =\n    transactionAttachmentTypes ?? fetchedTransactionAttachmentTypes?.pageList;\n\n  const executeGetStitchedPdf = useCallback(async () => {\n    return await apiMutate(\n      ConfigService.productV1ApiUrl,\n      `UdpTransactionAttachment/stitchAttachmentsIntoPdf`,\n      {\n        method: 'POST',\n        data: {\n          fileName: stitchedFileName,\n          transactionAttachments: orderedSelection\n        },\n        responseType: 'blob'\n      }\n    ).catch(async (error) => {\n      let errorMessage = '';\n      if (error.response && error.response.data instanceof Blob) {\n        // Convert the blob back to a string\n        errorMessage = await error.response.data.text();\n      } else {\n        errorMessage = error.message;\n      }\n      handleErrorSnackbar(\n        error,\n        t('transactions.attachments.generatePdfError', {\n          defaultValue: 'Failed to generate PDF {{errorMessage}}',\n          errorMessage: errorMessage ? `: ${errorMessage}` : ''\n        })\n      );\n      setPreviewPdfError(errorMessage);\n    });\n  }, [stitchedFileName, orderedSelection, handleErrorSnackbar, t]);\n\n  const handleOnPreviewPdfClose = useCallback(() => {\n    setPreviewPdfOpen(false);\n    setPreviewPdfBlob(null);\n    setPreviewPdfError(null);\n  }, []);\n\n  const handleRowOrderChanged = useCallback(\n    (newOrder) => {\n      if (onRowOrderChanged) {\n        onRowOrderChanged(newOrder);\n      }\n      if (onSelectionChanged) {\n        onSelectionChanged(newOrder);\n      }\n      setOrderedSelection(newOrder);\n    },\n    [onRowOrderChanged, onSelectionChanged]\n  );\n\n  const handleSelectionChanged = useCallback(\n    (selected) => {\n      setOrderedSelection((prevOrdered) => {\n        const selectedIds = new Set(\n          selected.map((item) => item.transactionAttachmentId || item.id)\n        );\n\n        // Filter previous order to keep only items that are still selected\n        const nextOrdered = prevOrdered.filter((item) =>\n          selectedIds.has(item.transactionAttachmentId || item.id)\n        );\n\n        const prevIds = new Set(\n          prevOrdered.map((item) => item.transactionAttachmentId || item.id)\n        );\n\n        const newItems = selected.filter(\n          (item) => !prevIds.has(item.transactionAttachmentId || item.id)\n        );\n\n        const finalSelection = [...nextOrdered, ...newItems];\n\n        if (onSelectionChanged) {\n          onSelectionChanged(finalSelection);\n        }\n\n        return finalSelection;\n      });\n    },\n    [onSelectionChanged]\n  );\n\n  const filteredAttachments = useMemo(() => {\n    return transactionAttachments.filter((item) => {\n      const ext = item.extension\n        ? item.extension.toLowerCase().replace('.', '')\n        : '';\n      return ALLOWED_EXTENSIONS.includes(ext);\n    });\n  }, [transactionAttachments]);\n\n  const handleGridApiCallback = useCallback((api) => {\n    setSourceGridApi(api);\n  }, []);\n\n  const handleOrderGridApiCallback = useCallback((api) => {\n    setOrderGridApi(api);\n  }, []);\n\n  const getColumnDefs = useCallback(\n    (type) => {\n      return [\n        {\n          field: 'fileName',\n          headerName: t('transactions.attachments.fileName', {\n            defaultValue: 'File Name'\n          }),\n          tooltipField: 'fileName',\n          sortable: false,\n          rowDrag: type === 'select' ? false : true\n        },\n        ...((transactionTypeId || transactionAttachmentTypes) &&\n        type === 'select'\n          ? [\n              {\n                headerName: t('transactions.attachments.type', {\n                  defaultValue: 'Type'\n                }),\n                field: 'transactionAttachmentTypeId',\n                filter: 'agSetColumnFilter',\n                filterParams: {\n                  values: (params) => {\n                    const values =\n                      resolvedTransactionAttachmentTypes?.map(\n                        (taType) => taType.transactionAttachmentTypeId\n                      ) || [];\n                    params.success(values);\n                  },\n                  valueFormatter: (params) => {\n                    const type = resolvedTransactionAttachmentTypes?.find(\n                      (taType) =>\n                        taType.transactionAttachmentTypeId === params.value\n                    );\n                    return type ? type.name : params.value;\n                  }\n                },\n                valueFormatter: (params) => {\n                  const type = resolvedTransactionAttachmentTypes?.find(\n                    (taType) =>\n                      taType.transactionAttachmentTypeId ===\n                      params?.data?.transactionAttachmentTypeId\n                  );\n                  return type\n                    ? type.name\n                    : params?.data?.transactionAttachmentTypeId;\n                }\n              }\n            ]\n          : [])\n      ];\n    },\n    [\n      t,\n      resolvedTransactionAttachmentTypes,\n      transactionTypeId,\n      transactionAttachmentTypes\n    ]\n  );\n\n  const selectAttachmentsGridOptions = useMemo(\n    () => ({\n      rowDragManaged: true,\n      animateRows: true,\n      suppressMoveWhenRowDragging: false,\n      getRowId: (params) =>\n        params.data.transactionAttachmentId?.toString() ||\n        params.data.id?.toString(),\n      onSelectionChanged: (event) => {\n        handleSelectionChanged(event.api.getSelectedRows());\n      },\n      rowSelection: {\n        mode: 'multiRow'\n      }\n    }),\n    [handleSelectionChanged]\n  );\n\n  const documentOrderGridOptions = useMemo(\n    () => ({\n      rowDragManaged: true,\n      animateRows: true,\n      suppressMoveWhenRowDragging: false,\n      getRowId: (params) =>\n        params.data.transactionAttachmentId?.toString() ||\n        params.data.id?.toString(),\n      onRowDragEnd: (event) => {\n        const newOrder = [];\n        event.api.forEachNode((node) => {\n          newOrder.push(node.data);\n        });\n        handleRowOrderChanged(newOrder); // This now calls setOrderedSelection\n      },\n      onSelectionChanged: (event) => {\n        handleSelectionChanged(event.api.getSelectedRows());\n      },\n      headerHeight: 0\n    }),\n    [handleRowOrderChanged, handleSelectionChanged]\n  );\n\n  const handleDownload = useCallback(async () => {\n    setDownloadingPdf(true);\n    try {\n      const response = onDownload\n        ? await onDownload(orderedSelection)\n        : await executeGetStitchedPdf();\n\n      if (response) {\n        const blob = response.data;\n\n        const url = URL.createObjectURL(blob);\n        const a = document.createElement('a');\n        a.href = url;\n        a.download = `${\n          stitchedFileName.trim().toLowerCase().endsWith('.pdf')\n            ? stitchedFileName\n            : `${stitchedFileName || 'merged_files'}.pdf`\n        }`;\n        a.click();\n        URL.revokeObjectURL(url);\n      }\n    } finally {\n      setDownloadingPdf(false);\n    }\n  }, [onDownload, orderedSelection, stitchedFileName, executeGetStitchedPdf]);\n\n  const handlePreview = useCallback(async () => {\n    // 1. Early return or simple execution if we aren't using the default UI\n    if (onPreview && !defaultPreviewSideSheet) {\n      return await onPreview(orderedSelection);\n    }\n\n    // 2. Setup UI state for the default SideSheet\n    setPreviewPdfOpen(true);\n    setPreviewPdfLoading(true);\n\n    try {\n      // 3. Determine which data source to use\n      const request = onPreview\n        ? onPreview(orderedSelection)\n        : executeGetStitchedPdf();\n\n      const response = await request;\n      const blob = response?.data;\n\n      if (blob instanceof Blob) {\n        setPreviewPdfBlob(blob);\n      }\n    } finally {\n      setPreviewPdfLoading(false);\n    }\n  }, [\n    onPreview,\n    orderedSelection,\n    executeGetStitchedPdf,\n    defaultPreviewSideSheet\n  ]);\n\n  useEffect(() => {\n    if (!transactionAttachmentTypes && transactionTypeId) {\n      fetchTransactionAttachmentTypes().catch(() => {});\n    }\n  }, [\n    transactionAttachmentTypes,\n    fetchTransactionAttachmentTypes,\n    transactionTypeId\n  ]);\n\n  useEffect(() => {\n    // Syncs the selection state of the top grid based on the orderedSelection state\n    if (sourceGridApi) {\n      const selectionIds = new Set(\n        orderedSelection.map((item) => item.transactionAttachmentId || item.id)\n      );\n      sourceGridApi.forEachNode((node) => {\n        const isActuallySelected = selectionIds.has(\n          node.data.transactionAttachmentId || node.data.id\n        );\n        if (node.isSelected() !== isActuallySelected) {\n          node.setSelected(isActuallySelected, false, true);\n        }\n      });\n    }\n  }, [sourceGridApi, orderedSelection]);\n\n  return (\n    <div style={{ height: '100%' }}>\n      {(stitchLoading || downloadingPdf) && <LinearProgress />}\n      <div style={{ paddingBottom: 8 }}>\n        <FluentTextField\n          label={t('transactions.attachments.fileName', {\n            defaultValue: 'File Name'\n          })}\n          value={stitchedFileName}\n          onChange={onFileNameChange}\n          error={!!fileNameError}\n          helperText={fileNameError}\n          fullWidth\n          variant='outlined'\n          disabled={disableFileName}\n        />\n      </div>\n      <Typography>\n        {t('transactions.attachments.selectAttachments', {\n          defaultValue: 'Select Attachments (Optional)'\n        })}\n      </Typography>\n      <LayoutUnit unit='nudge' />\n      <ClientSideUdpGrid\n        columnDefs={getColumnDefs('select')}\n        rowData={filteredAttachments || []}\n        gridOptions={selectAttachmentsGridOptions}\n        gridApiCallback={handleGridApiCallback}\n        gridHeight={tableHeight}\n      />\n      <LayoutUnit unit='nudge' />\n      <Typography>\n        {t('transactions.attachments.documentOrder', {\n          defaultValue: 'Document Order'\n        })}\n      </Typography>\n      <LayoutUnit unit='nudge' />\n      <ClientSideUdpGrid\n        columnDefs={getColumnDefs('order')}\n        rowData={orderedSelection}\n        gridOptions={documentOrderGridOptions}\n        gridApiCallback={handleOrderGridApiCallback}\n        gridHeight={tableHeight}\n      />\n      <div\n        style={{\n          display: 'flex',\n          justifyContent: 'flex-start',\n          paddingTop: '8px'\n        }}\n      >\n        {hidePreviewButton ? null : (\n          <FluentButton\n            color='primary'\n            disabled={!orderedSelection?.length}\n            onClick={handlePreview}\n          >\n            {t('common.preview', { defaultValue: 'Preview' })}\n          </FluentButton>\n        )}\n        {hideDownloadButton ? null : (\n          <FluentButton\n            color='primary'\n            disabled={!orderedSelection?.length || downloadingPdf}\n            onClick={handleDownload}\n          >\n            {t('common.download', { defaultValue: 'Download' })}\n          </FluentButton>\n        )}\n        {onActionClick && (\n          <FluentButton\n            color='primary'\n            disabled={disableActionButton}\n            onClick={onActionClick}\n          >\n            {actionButtonLabel\n              ? t(actionButtonLabel)\n              : t('transactions.attachments.performAction', {\n                  defaultValue: 'Perform Action'\n                })}\n          </FluentButton>\n        )}\n      </div>\n\n      <SideSheet\n        open={previewPdfOpen}\n        title={t('transactions.attachments.pdfPreview', {\n          defaultValue: 'PDF Preview'\n        })}\n        onClose={handleOnPreviewPdfClose}\n        width={660}\n        progress={previewPdfLoading}\n        variant='indeterminate'\n        color='primary'\n      >\n        {previewPdfError ? (\n          <EmptyStateDisplay\n            icon={ErrorIcon}\n            primaryText={t('transactions.attachments.previewLoadError', {\n              defaultValue: 'Error loading PDF preview'\n            })}\n            secondaryText={\n              previewPdfError ||\n              t('transactions.attachments.previewGenerateError', {\n                defaultValue:\n                  'An error occurred while generating the PDF preview.'\n              })\n            }\n          />\n        ) : (\n          <PDFViewer\n            blobPDF={previewPdfBlob}\n            closePDF={handleOnPreviewPdfClose}\n            onClickDownload={handleDownload}\n          />\n        )}\n      </SideSheet>\n    </div>\n  );\n};\n"],"mappings":"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"}