'use client'; import { useState } from "react"; import { styled } from '@mui/material/styles'; import { Button, CircularProgress, Box, Chip, IconButton, Typography, Stack, TextField, InputAdornment, Tooltip, } from "@mui/material"; import { DataGrid, GridColDef, Toolbar, QuickFilter, QuickFilterControl, QuickFilterClear, } from "@mui/x-data-grid"; import SyncIcon from "@mui/icons-material/Sync"; import RefreshIcon from "@mui/icons-material/Refresh"; import FolderIcon from "@mui/icons-material/Folder"; import InsertDriveFileIcon from "@mui/icons-material/InsertDriveFile"; import DeleteIcon from "@mui/icons-material/Delete"; import EditIcon from "@mui/icons-material/Edit"; import SearchIcon from '@mui/icons-material/Search'; import CancelIcon from '@mui/icons-material/Cancel'; import DownloadIcon from '@mui/icons-material/Download'; import OpenInNewIcon from '@mui/icons-material/OpenInNew'; import { syncOneDrive } from "./sync-actions"; import { deleteFileNodeAction } from "./actions"; import { useRouter } from "next/navigation"; // --- 1. Styled Component for Search Placement --- const StyledQuickFilter = styled(QuickFilter)({ marginLeft: 'auto', // Pushes the search box to the right side of the toolbar }); // --- 2. Custom Toolbar Component --- function CustomToolbar() { return ( Library {/* The 'expanded' prop ensures the search input is always visible by default */} ( ), endAdornment: other.value ? ( ) : null, // Ensure other props are spread correctly ...other.slotProps?.input, }, ...other.slotProps, }} /> )} /> ); } // --- 3. Main Dashboard View --- interface DashboardViewProps { initialFiles: any[]; user?: { id?: string; role?: string; }; } export default function DashboardView({ initialFiles, user }: DashboardViewProps) { const [loading, setLoading] = useState(false); const [isRefreshing, setIsRefreshing] = useState(false); const router = useRouter(); const isAdmin = user?.role === "ADMIN"; const [lastSynced, setLastSynced] = useState(new Date()); // Defaults to 'Just now' on load const getVirtualPath = (parentId: string | null): string => { if (!parentId) return "WebCalibre"; const parent = initialFiles.find((f) => f.id === parentId); if (!parent) return "WebCalibre"; const prefix = parent.parentId ? `${getVirtualPath(parent.parentId)} / ` : ""; return `${prefix}${parent.name}`; }; const handleSync = async () => { setLoading(true); try { await syncOneDrive(); setLastSynced(new Date()); // Update the time router.refresh(); } catch (error) { console.error("Sync failed:", error); } finally { setLoading(false); } }; const handleRefresh = () => { setIsRefreshing(true); router.refresh(); setTimeout(() => setIsRefreshing(false), 800); }; const handleDelete = async (id: string, name: string) => { if (!confirm(`Are you sure you want to delete "${name}"?`)) return; try { await deleteFileNodeAction(id); router.refresh(); } catch (error: any) { alert(error.message || "Failed to delete file"); } }; const columns: GridColDef[] = [ { field: "name", headerName: "Name", flex: 1.5, minWidth: 250, renderCell: (params) => ( {params.row.isFolder ? : } {params.value} ) }, { field: "parentId", headerName: "Location", flex: 1, renderCell: (params) => }, { field: "description", headerName: "Description", flex: 1 }, { field: "type", headerName: "Type", width: 120, valueGetter: (value, row) => row.metadata?.type || (row.isFolder ? "Folder" : "File"), renderCell: (params) => ( {params.value} ) }, { field: "size", headerName: "Size", width: 100, renderCell: (params) => params.row.isFolder ? "--" : `${(Number(params.value) / 1024 / 1024).toFixed(2)} MB` }, { field: "metadata_search", headerName: "Search Metadata", width: 0, valueGetter: (value, row) => row.metadata ? JSON.stringify(row.metadata) : "" }, { field: "actions", headerName: "Actions", width: 180, align: 'right', renderCell: (params) => { const isOwner = params.row.ownerId === user?.id; const isFolder = params.row.isFolder; return ( {!isFolder && ( <> window.open(`/api/download?id=${params.row.id}&mode=inline`, '_blank')}> window.location.href = `/api/download?id=${params.row.id}&mode=attachment`}> )} {(isAdmin || isOwner) && ( <> router.push(`/update/${params.row.id}`)}> handleDelete(params.row.id, params.row.name)}> )} ); } } ]; return ( {lastSynced && ( Last synced: {lastSynced.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })} )} ); }