/** * Document Management Component * Main UI for document management in MCP Legal app */ import React, { useState, useEffect } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Box, Button, Card, CardContent, CardHeader, Chip, Dialog, DialogActions, DialogContent, DialogTitle, FormControl, InputLabel, MenuItem, Select, TextField, Typography, Table, TableBody, TableCell, TableHead, TableRow, IconButton, Tooltip, } from '@mui/material'; import { Add as AddIcon, Edit as EditIcon, Delete as DeleteIcon, Visibility as ViewIcon, History as HistoryIcon, Download as DownloadIcon, Share as ShareIcon, } from '@mui/icons-material'; interface Document { id: string; title: string; type: string; status: string; created_at: string; updated_at: string; } interface DocumentManagementProps { matterId?: string; } export function DocumentManagement({ matterId }: DocumentManagementProps) { const [selectedDocument, setSelectedDocument] = useState(null); const [createDialogOpen, setCreateDialogOpen] = useState(false); const [viewDialogOpen, setViewDialogOpen] = useState(false); const [filterType, setFilterType] = useState('all'); const queryClient = useQueryClient(); // Fetch documents const { data: documents, isLoading } = useQuery({ queryKey: ['documents', matterId, filterType], queryFn: async () => { const params = new URLSearchParams(); if (matterId) params.append('matter_id', matterId); if (filterType !== 'all') params.append('type', filterType); const response = await fetch(`/api/documents?${params}`); if (!response.ok) throw new Error('Failed to fetch documents'); const data = await response.json(); return data.documents || []; }, }); // Create document mutation const createDocument = useMutation({ mutationFn: async (doc: Partial) => { const response = await fetch('/api/documents', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(doc), }); if (!response.ok) throw new Error('Failed to create document'); return response.json(); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['documents'] }); setCreateDialogOpen(false); }, }); // Delete document mutation const deleteDocument = useMutation({ mutationFn: async (id: string) => { const response = await fetch(`/api/documents/${id}`, { method: 'DELETE', }); if (!response.ok) throw new Error('Failed to delete document'); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['documents'] }); }, }); const handleCreateDocument = (formData: FormData) => { createDocument.mutate({ title: formData.get('title') as string, type: formData.get('type') as string, content: formData.get('content') as string, matter_id: matterId, }); }; const handleViewDocument = (doc: Document) => { setSelectedDocument(doc); setViewDialogOpen(true); }; const handleDeleteDocument = (id: string) => { if (confirm('Are you sure you want to delete this document?')) { deleteDocument.mutate(id); } }; return ( Documents Filter {isLoading ? ( Loading... ) : ( Title Type Status Created Actions {documents?.map((doc) => ( {doc.title} {new Date(doc.created_at).toLocaleDateString()} handleViewDocument(doc)}> handleDeleteDocument(doc.id)} > ))}
)} {/* Create Document Dialog */} setCreateDialogOpen(false)} maxWidth="md" fullWidth>
{ e.preventDefault(); handleCreateDocument(new FormData(e.currentTarget)); }} > Create New Document Type
{/* View Document Dialog */} setViewDialogOpen(false)} maxWidth="lg" fullWidth> {selectedDocument?.title} {selectedDocument && ( Type: {selectedDocument.type} | Status: {selectedDocument.status} Created: {new Date(selectedDocument.created_at).toLocaleString()} )}
); }