From 8644dcafff743238d23e60eeaa08b231711d3f9d Mon Sep 17 00:00:00 2001 From: Kevin Burnett <18027+burnettk@users.noreply.github.com> Date: Thu, 6 Feb 2025 08:39:35 -0800 Subject: [PATCH] download working (#2230) Co-authored-by: burnettk --- .../src/components/ProcessModelFileList.tsx | 44 ++++++++++++++++--- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/spiffworkflow-frontend/src/components/ProcessModelFileList.tsx b/spiffworkflow-frontend/src/components/ProcessModelFileList.tsx index 1260a89ed..d351765d7 100644 --- a/spiffworkflow-frontend/src/components/ProcessModelFileList.tsx +++ b/spiffworkflow-frontend/src/components/ProcessModelFileList.tsx @@ -15,6 +15,8 @@ import { PureAbility } from '@casl/ability'; import ButtonWithConfirmation from './ButtonWithConfirmation'; import ProcessModelTestRun from './ProcessModelTestRun'; import { ProcessFile } from '../interfaces'; +import HttpService from '../services/HttpService'; +import useAPIError from '../hooks/UseApiError'; interface ProcessModelFileListProps { processModel: any; @@ -35,6 +37,7 @@ export default function ProcessModelFileList({ onSetPrimaryFile, isTestCaseFile, }: ProcessModelFileListProps) { + const { addError, removeError } = useAPIError(); const profileModelFileEditUrl = (processModelFile: ProcessFile) => { if (processModel) { if (processModelFile.name.match(/\.(dmn|bpmn)$/)) { @@ -47,6 +50,40 @@ export default function ProcessModelFileList({ return null; }; + const handleProcessModelFileResult = (processModelFile: ProcessFile) => { + if ( + !('file_contents' in processModelFile) || + processModelFile.file_contents === undefined + ) { + addError({ + message: `Could not file file contents for file: ${processModelFile.name}`, + }); + return; + } + let contentType = 'application/xml'; + if (processModelFile.type === 'json') { + contentType = 'application/json'; + } + const element = document.createElement('a'); + const file = new Blob([processModelFile.file_contents], { + type: contentType, + }); + const downloadFileName = processModelFile.name; + element.href = URL.createObjectURL(file); + element.download = downloadFileName; + document.body.appendChild(element); + element.click(); + }; + + const downloadFile = (fileName: string) => { + removeError(); + const processModelPath = `process-models/${modifiedProcessModelId}`; + HttpService.makeCallToBackend({ + path: `/${processModelPath}/files/${fileName}`, + successCallback: handleProcessModelFileResult, + }); + }; + const renderButtonElements = ( processModelFile: ProcessFile, isPrimaryBpmnFile: boolean, @@ -80,12 +117,7 @@ export default function ProcessModelFileList({ iconDescription="Download File" hasIconOnly size="lg" - onClick={() => - window.open( - `/${targetUris.processModelFilePath}/${processModelFile.name}`, - '_blank', - ) - } + onClick={() => downloadFile(processModelFile.name)} /> , );