@@ -48,7 +48,6 @@ import {
|
|||||||
DialogTitle,
|
DialogTitle,
|
||||||
DialogTrigger,
|
DialogTrigger,
|
||||||
} from "@/components/ui/dialog";
|
} from "@/components/ui/dialog";
|
||||||
import { Label } from "@/components/ui/label";
|
|
||||||
import {
|
import {
|
||||||
Popover,
|
Popover,
|
||||||
PopoverContent,
|
PopoverContent,
|
||||||
@@ -218,6 +217,7 @@ const uploadEvidenceMutation = graphql`
|
|||||||
evidenceEdge @appendEdge(connections: $connections) {
|
evidenceEdge @appendEdge(connections: $connections) {
|
||||||
node {
|
node {
|
||||||
id
|
id
|
||||||
|
filename
|
||||||
fileUrl
|
fileUrl
|
||||||
mimeType
|
mimeType
|
||||||
size
|
size
|
||||||
@@ -450,13 +450,11 @@ function ControlOverviewPageContent({
|
|||||||
name: string;
|
name: string;
|
||||||
} | null>(null);
|
} | null>(null);
|
||||||
|
|
||||||
const [isUploadEvidenceOpen, setIsUploadEvidenceOpen] = useState(false);
|
|
||||||
const [taskForEvidence, setTaskForEvidence] = useState<{
|
const [taskForEvidence, setTaskForEvidence] = useState<{
|
||||||
id: string;
|
id: string;
|
||||||
name: string;
|
name: string;
|
||||||
} | null>(null);
|
} | null>(null);
|
||||||
const [evidenceName, setEvidenceName] = useState("");
|
const hiddenFileInputRef = useRef<HTMLInputElement>(null);
|
||||||
const fileInputRef = useRef<HTMLInputElement>(null);
|
|
||||||
|
|
||||||
const [draggedOverTaskId, setDraggedOverTaskId] = useState<string | null>(
|
const [draggedOverTaskId, setDraggedOverTaskId] = useState<string | null>(
|
||||||
null
|
null
|
||||||
@@ -702,15 +700,24 @@ function ControlOverviewPageContent({
|
|||||||
|
|
||||||
const handleUploadEvidence = (taskId: string, taskName: string) => {
|
const handleUploadEvidence = (taskId: string, taskName: string) => {
|
||||||
setTaskForEvidence({ id: taskId, name: taskName });
|
setTaskForEvidence({ id: taskId, name: taskName });
|
||||||
setIsUploadEvidenceOpen(true);
|
// Instead of opening a modal, directly trigger the file input click
|
||||||
|
if (hiddenFileInputRef.current) {
|
||||||
|
hiddenFileInputRef.current.click();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const confirmUploadEvidence = (event: React.FormEvent) => {
|
const handleFileSelected = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
event.preventDefault();
|
if (!e.target.files || e.target.files.length === 0 || !taskForEvidence)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!taskForEvidence || !fileInputRef.current?.files?.[0]) return;
|
const file = e.target.files[0];
|
||||||
|
|
||||||
const file = fileInputRef.current.files[0];
|
// Show toast for upload started
|
||||||
|
toast({
|
||||||
|
title: "Upload started",
|
||||||
|
description: `Uploading ${file.name}...`,
|
||||||
|
variant: "default",
|
||||||
|
});
|
||||||
|
|
||||||
// Get the evidence connection ID for this task
|
// Get the evidence connection ID for this task
|
||||||
const evidenceConnectionId = getEvidenceConnectionId(taskForEvidence.id);
|
const evidenceConnectionId = getEvidenceConnectionId(taskForEvidence.id);
|
||||||
@@ -719,7 +726,7 @@ function ControlOverviewPageContent({
|
|||||||
variables: {
|
variables: {
|
||||||
input: {
|
input: {
|
||||||
taskId: taskForEvidence.id,
|
taskId: taskForEvidence.id,
|
||||||
name: evidenceName || file.name,
|
name: file.name,
|
||||||
file: null,
|
file: null,
|
||||||
},
|
},
|
||||||
connections: evidenceConnectionId ? [evidenceConnectionId] : [],
|
connections: evidenceConnectionId ? [evidenceConnectionId] : [],
|
||||||
@@ -733,11 +740,10 @@ function ControlOverviewPageContent({
|
|||||||
description: "Evidence has been uploaded successfully.",
|
description: "Evidence has been uploaded successfully.",
|
||||||
variant: "default",
|
variant: "default",
|
||||||
});
|
});
|
||||||
setIsUploadEvidenceOpen(false);
|
|
||||||
setTaskForEvidence(null);
|
setTaskForEvidence(null);
|
||||||
setEvidenceName("");
|
// Reset the file input
|
||||||
if (fileInputRef.current) {
|
if (hiddenFileInputRef.current) {
|
||||||
fileInputRef.current.value = "";
|
hiddenFileInputRef.current.value = "";
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onError: (error) => {
|
onError: (error) => {
|
||||||
@@ -1625,6 +1631,15 @@ function ControlOverviewPageContent({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Hidden file input for direct uploads */}
|
||||||
|
<input
|
||||||
|
type="file"
|
||||||
|
ref={hiddenFileInputRef}
|
||||||
|
onChange={handleFileSelected}
|
||||||
|
style={{ display: "none" }}
|
||||||
|
accept="image/*,.pdf,.doc,.docx,.xls,.xlsx,.txt"
|
||||||
|
/>
|
||||||
|
|
||||||
{/* Delete Task Confirmation Dialog */}
|
{/* Delete Task Confirmation Dialog */}
|
||||||
<Dialog open={isDeleteTaskOpen} onOpenChange={setIsDeleteTaskOpen}>
|
<Dialog open={isDeleteTaskOpen} onOpenChange={setIsDeleteTaskOpen}>
|
||||||
<DialogContent>
|
<DialogContent>
|
||||||
@@ -1649,71 +1664,6 @@ function ControlOverviewPageContent({
|
|||||||
</DialogContent>
|
</DialogContent>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
|
|
||||||
{/* Upload Evidence Dialog */}
|
|
||||||
<Dialog
|
|
||||||
open={isUploadEvidenceOpen}
|
|
||||||
onOpenChange={setIsUploadEvidenceOpen}
|
|
||||||
>
|
|
||||||
<DialogContent className="sm:max-w-md">
|
|
||||||
<DialogHeader>
|
|
||||||
<DialogTitle>Upload Evidence</DialogTitle>
|
|
||||||
<DialogDescription>
|
|
||||||
Upload evidence for the task "{taskForEvidence?.name}
|
|
||||||
".
|
|
||||||
</DialogDescription>
|
|
||||||
</DialogHeader>
|
|
||||||
<form onSubmit={confirmUploadEvidence}>
|
|
||||||
<div className="space-y-6 py-4">
|
|
||||||
<div className="space-y-2">
|
|
||||||
<Label htmlFor="evidence-name">
|
|
||||||
Evidence Name (Optional)
|
|
||||||
</Label>
|
|
||||||
<Input
|
|
||||||
id="evidence-name"
|
|
||||||
placeholder="Enter a name for this evidence"
|
|
||||||
value={evidenceName}
|
|
||||||
onChange={(e) => setEvidenceName(e.target.value)}
|
|
||||||
className="w-full"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="space-y-3">
|
|
||||||
<Label htmlFor="evidence-file">File</Label>
|
|
||||||
<div className="border-2 border-dashed border-gray-300 rounded-lg p-6 transition-colors hover:border-blue-400 bg-gray-50">
|
|
||||||
<div className="flex flex-col items-center justify-center gap-3">
|
|
||||||
<Upload className="w-10 h-10 text-blue-500" />
|
|
||||||
<div className="text-center">
|
|
||||||
<p className="text-sm font-medium text-gray-700">
|
|
||||||
Drag and drop your file here, or click to browse
|
|
||||||
</p>
|
|
||||||
<p className="text-xs text-gray-500 mt-1">
|
|
||||||
Supported file types: PDF, images, documents
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<Input
|
|
||||||
id="evidence-file"
|
|
||||||
type="file"
|
|
||||||
ref={fileInputRef}
|
|
||||||
required
|
|
||||||
className="w-full opacity-0 absolute inset-0 cursor-pointer"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<DialogFooter>
|
|
||||||
<Button
|
|
||||||
variant="outline"
|
|
||||||
type="button"
|
|
||||||
onClick={() => setIsUploadEvidenceOpen(false)}
|
|
||||||
>
|
|
||||||
Cancel
|
|
||||||
</Button>
|
|
||||||
<Button type="submit">Upload</Button>
|
|
||||||
</DialogFooter>
|
|
||||||
</form>
|
|
||||||
</DialogContent>
|
|
||||||
</Dialog>
|
|
||||||
|
|
||||||
{/* Add the Preview Modal */}
|
{/* Add the Preview Modal */}
|
||||||
<Dialog open={isPreviewModalOpen} onOpenChange={setIsPreviewModalOpen}>
|
<Dialog open={isPreviewModalOpen} onOpenChange={setIsPreviewModalOpen}>
|
||||||
<DialogContent className="sm:max-w-4xl">
|
<DialogContent className="sm:max-w-4xl">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @generated SignedSource<<f1cdd20d14ca9fefe868019e5aa43741>>
|
* @generated SignedSource<<313084c3c2422d51df42fe4d6b848d49>>
|
||||||
* @lightSyntaxTransform
|
* @lightSyntaxTransform
|
||||||
* @nogrep
|
* @nogrep
|
||||||
*/
|
*/
|
||||||
@@ -25,6 +25,7 @@ export type ControlOverviewPageUploadEvidenceMutation$data = {
|
|||||||
readonly node: {
|
readonly node: {
|
||||||
readonly createdAt: string;
|
readonly createdAt: string;
|
||||||
readonly fileUrl: string;
|
readonly fileUrl: string;
|
||||||
|
readonly filename: string;
|
||||||
readonly id: string;
|
readonly id: string;
|
||||||
readonly mimeType: string;
|
readonly mimeType: string;
|
||||||
readonly size: number;
|
readonly size: number;
|
||||||
@@ -79,6 +80,13 @@ v3 = {
|
|||||||
"name": "id",
|
"name": "id",
|
||||||
"storageKey": null
|
"storageKey": null
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"alias": null,
|
||||||
|
"args": null,
|
||||||
|
"kind": "ScalarField",
|
||||||
|
"name": "filename",
|
||||||
|
"storageKey": null
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"alias": null,
|
"alias": null,
|
||||||
"args": null,
|
"args": null,
|
||||||
@@ -186,16 +194,16 @@ return {
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
"cacheID": "76c2ba38a9ba243840027c997b01b51b",
|
"cacheID": "5edaf64bde176530d9952e3e8aeb15af",
|
||||||
"id": null,
|
"id": null,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"name": "ControlOverviewPageUploadEvidenceMutation",
|
"name": "ControlOverviewPageUploadEvidenceMutation",
|
||||||
"operationKind": "mutation",
|
"operationKind": "mutation",
|
||||||
"text": "mutation ControlOverviewPageUploadEvidenceMutation(\n $input: UploadEvidenceInput!\n) {\n uploadEvidence(input: $input) {\n evidenceEdge {\n node {\n id\n fileUrl\n mimeType\n size\n state\n createdAt\n }\n }\n }\n}\n"
|
"text": "mutation ControlOverviewPageUploadEvidenceMutation(\n $input: UploadEvidenceInput!\n) {\n uploadEvidence(input: $input) {\n evidenceEdge {\n node {\n id\n filename\n fileUrl\n mimeType\n size\n state\n createdAt\n }\n }\n }\n}\n"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
(node as any).hash = "b43bb6fc3d2a70fd8f81ccfb2532f067";
|
(node as any).hash = "51f35fe735a747ddaeb0f0cfa298f7e2";
|
||||||
|
|
||||||
export default node;
|
export default node;
|
||||||
|
|||||||
Reference in New Issue
Block a user