From 625343dadadbdec51c07e559c5320434abfd41ff Mon Sep 17 00:00:00 2001 From: Bryan Frimin Date: Sat, 3 May 2025 17:54:29 -0700 Subject: [PATCH] Create file for link Signed-off-by: Bryan Frimin --- .../organizations/measures/MeasureView.tsx | 314 +++++++++++++----- 1 file changed, 224 insertions(+), 90 deletions(-) diff --git a/apps/console/src/pages/organizations/measures/MeasureView.tsx b/apps/console/src/pages/organizations/measures/MeasureView.tsx index 5bddd5023..5b6696b13 100644 --- a/apps/console/src/pages/organizations/measures/MeasureView.tsx +++ b/apps/console/src/pages/organizations/measures/MeasureView.tsx @@ -1096,8 +1096,6 @@ function MeasureViewContent({ }; const handleLinkEvidenceSubmit = () => { - if (!taskForEvidence) return; - // Validate form if (!linkEvidenceName.trim()) { toast({ @@ -1117,40 +1115,71 @@ function MeasureViewContent({ return; } - // Get the evidence connection ID for this task - const evidenceConnectionId = getEvidenceConnectionId(taskForEvidence.id); + try { + console.log("Creating URI file with URL:", linkEvidenceUrl.trim()); + + // Create a URI file with the link + const linkContent = linkEvidenceUrl.trim(); + const fileName = `${linkEvidenceName.trim()}.uri`; + const file = new File([linkContent], fileName, { type: "text/uri-list" }); + + console.log("File created:", file.name, file.type, file.size); - // Use a default description if none is provided - const description = - linkEvidenceDescription.trim() || `Link to ${linkEvidenceUrl}`; + // Show toast for add started + toast({ + title: "Adding link evidence", + description: `Adding ${fileName}...`, + variant: "default", + }); - // Use requestEvidence instead of createEvidence - requestEvidence({ - variables: { - input: { - taskId: taskForEvidence.id, - name: linkEvidenceName, - type: "LINK", - description: description, + // Use the measure evidence connection ID + const evidenceConnectionId = getMeasureEvidenceConnectionId(); + console.log("Evidence connection ID:", evidenceConnectionId); + + // Upload the URI file as evidence + uploadMeasureEvidence({ + variables: { + input: { + measureId: measureId, + file: null, + }, + connections: evidenceConnectionId ? [evidenceConnectionId] : [], }, - connections: evidenceConnectionId ? [evidenceConnectionId] : [], - }, - onCompleted: () => { - setTaskForEvidence(null); - setEvidenceDialogOpen(false); - // Reset form fields - setLinkEvidenceName(""); - setLinkEvidenceUrl(""); - setLinkEvidenceDescription(""); - }, - onError: (error) => { - toast({ - title: "Error adding link evidence", - description: error.message, - variant: "destructive", - }); - }, - }); + uploadables: { + "input.file": file, + }, + onCompleted: (response) => { + console.log("Upload completed:", response); + setTaskForEvidence(null); + setEvidenceDialogOpen(false); + // Reset form fields + setLinkEvidenceName(""); + setLinkEvidenceUrl(""); + setLinkEvidenceDescription(""); + + toast({ + title: "Link evidence added", + description: "Link evidence has been added successfully.", + variant: "default", + }); + }, + onError: (error) => { + console.error("Error uploading URI file:", error); + toast({ + title: "Error adding link evidence", + description: error.message || "Unknown error occurred", + variant: "destructive", + }); + }, + }); + } catch (error) { + console.error("Error in handleLinkEvidenceSubmit:", error); + toast({ + title: "Error creating URI file", + description: error instanceof Error ? error.message : "Unknown error occurred", + variant: "destructive", + }); + } }; const handleDragOver = (e: DragEvent, taskId: string) => { @@ -1245,7 +1274,7 @@ function MeasureViewContent({ // Function to get file icon based on mime type and evidence type const getFileIcon = (mimeType: string, evidenceType: string) => { - if (evidenceType === "LINK") { + if (evidenceType === "LINK" || mimeType === "text/uri-list" || mimeType === "text/uri") { return ; } else if (mimeType.startsWith("image/")) { return ; @@ -1260,6 +1289,20 @@ function MeasureViewContent({ } }; + // Function to get URL from URI file + const getUrlFromUriFile = async (fileUrl: string): Promise => { + try { + const response = await fetch(fileUrl); + const text = await response.text(); + // URI files typically have the URL on the first line + const firstLine = text.trim().split('\n')[0]; + return firstLine || null; + } catch (error) { + console.error("Error extracting URL from URI file:", error); + return null; + } + }; + // Simplified preview handler that opens the modal and sets the evidence const handlePreviewEvidence = (evidence: { id: string; @@ -1285,6 +1328,20 @@ function MeasureViewContent({ if (!prev) return null; return { ...prev, fileUrl: data.node!.fileUrl }; }); + + // If it's a URI file, fetch and extract the URL + if (evidence.mimeType === "text/uri-list" || evidence.mimeType === "text/uri") { + getUrlFromUriFile(data.node!.fileUrl!) + .then((url) => { + if (url) { + window.open(url, "_blank"); + setIsPreviewModalOpen(false); + } + }) + .catch((error) => { + console.error("Error handling URI file:", error); + }); + } } else { throw new Error("File URL not available in response"); } @@ -1379,7 +1436,14 @@ function MeasureViewContent({ }; const handleFulfillEvidenceWithLink = () => { - if (!evidenceToFulfill) return; + if (!evidenceToFulfill) { + toast({ + title: "Error", + description: "No evidence to fulfill", + variant: "destructive", + }); + return; + } // Validate URL if (!linkEvidenceUrl.trim()) { @@ -1391,44 +1455,83 @@ function MeasureViewContent({ return; } - // Get connection ID for the parent task - const task = tasks.find((task) => - task.evidences?.edges.some( - (edge) => edge?.node?.id === evidenceToFulfill.id - ) - ); + try { + console.log("Creating URI file to fulfill evidence:", evidenceToFulfill.id); + + // Create a URI file with the link + const linkContent = linkEvidenceUrl.trim(); + // Use provided name or fallback to the original filename + const baseName = linkEvidenceName.trim() + ? linkEvidenceName.trim() + : evidenceToFulfill.filename.replace(/\.[^/.]+$/, ""); + const fileName = `${baseName}.uri`; + const file = new File([linkContent], fileName, { type: "text/uri-list" }); + + console.log("File created:", file.name, file.type, file.size); - const evidenceConnectionId = task?.id - ? getEvidenceConnectionId(task.id) - : null; + // Get connection ID for the parent task + const task = tasks.find((task) => + task.evidences?.edges.some( + (edge) => edge?.node?.id === evidenceToFulfill.id + ) + ); - fulfillEvidence({ - variables: { - input: { - evidenceId: evidenceToFulfill.id, - url: linkEvidenceUrl, + const evidenceConnectionId = task?.id + ? getEvidenceConnectionId(task.id) + : getMeasureEvidenceConnectionId(); + + console.log("Using connection ID:", evidenceConnectionId); + console.log("Task found:", task?.id); + + // Show toast for upload started + toast({ + title: "Fulfilling evidence with link", + description: `Creating link file for ${fileName}...`, + variant: "default", + }); + + // Upload the URI file to fulfill the evidence + fulfillEvidence({ + variables: { + input: { + evidenceId: evidenceToFulfill.id, + file: null, + }, + connections: evidenceConnectionId ? [evidenceConnectionId] : [], }, - connections: evidenceConnectionId ? [evidenceConnectionId] : [], - }, - onCompleted: () => { - setFulfillEvidenceDialogOpen(false); - setEvidenceToFulfill(null); - setLinkEvidenceUrl(""); - setLinkEvidenceDescription(""); - toast({ - title: "Evidence updated", - description: "Evidence has been fulfilled with link successfully.", - variant: "default", - }); - }, - onError: (error) => { - toast({ - title: "Error updating evidence", - description: error.message, - variant: "destructive", - }); - }, - }); + uploadables: { + "input.file": file, + }, + onCompleted: (response) => { + console.log("Evidence fulfilled successfully:", response); + setFulfillEvidenceDialogOpen(false); + setEvidenceToFulfill(null); + setLinkEvidenceName(""); + setLinkEvidenceUrl(""); + setLinkEvidenceDescription(""); + toast({ + title: "Evidence fulfilled", + description: "Evidence has been fulfilled with link successfully.", + variant: "default", + }); + }, + onError: (error) => { + console.error("Error fulfilling evidence:", error); + toast({ + title: "Error fulfilling evidence", + description: error.message || "Unknown error occurred", + variant: "destructive", + }); + }, + }); + } catch (error) { + console.error("Error in handleFulfillEvidenceWithLink:", error); + toast({ + title: "Error creating URI file", + description: error instanceof Error ? error.message : "Unknown error occurred", + variant: "destructive", + }); + } }; const confirmDeleteEvidence = () => { @@ -2222,10 +2325,15 @@ function MeasureViewContent({ - {evidence.type === "FILE" ? "Document" : "Link"} + {evidence.type === "FILE" ? + (evidence.mimeType === "text/uri-list" || evidence.mimeType === "text/uri" ? + "Link" : "Document") : + "Link"} - {evidence.type === "FILE" ? formatFileSize(evidence.size) : "-"} + {evidence.type === "FILE" && + !(evidence.mimeType === "text/uri-list" || evidence.mimeType === "text/uri") ? + formatFileSize(evidence.size) : "-"} {formatDate(evidence.createdAt)} @@ -2247,7 +2355,15 @@ function MeasureViewContent({ ) : evidence.type === "FILE" ? ( <> - {evidence.mimeType.startsWith("image/") ? ( + {evidence.mimeType === "text/uri-list" || evidence.mimeType === "text/uri" ? ( + + ) : evidence.mimeType.startsWith("image/") ? ( {activeTab === "link" && ( - + )} @@ -2670,27 +2800,31 @@ function MeasureViewContent({
- + setLinkEvidenceName(e.target.value)} + placeholder="Link name (optional)" + type="text" + /> +

+ Optional - will use evidence name if not provided +

+
+ +
+ + setLinkEvidenceUrl(e.target.value)} placeholder="https://example.com" type="url" /> -
- -
- -