import { useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Plus, X, Star, Pencil, Check, Undo, Redo, Upload, Download, FileJson, FlaskConical } from "lucide-react"; import { cn } from "@/lib/utils"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownMenuSeparator, DropdownMenuLabel } from "@/components/ui/dropdown-menu"; import { ExperimentTemplate } from "@/data/experimentTemplates"; export interface Workspace { id: string; name: string; canvasData: string | null; isFavorite?: boolean; history?: string[]; historyIndex?: number; } interface WorkspaceManagerProps { workspaces: Workspace[]; activeWorkspaceId: string; onWorkspaceChange: (id: string) => void; onWorkspaceAdd: () => void; onWorkspaceDelete: (id: string) => void; onWorkspaceRename: (id: string, name: string) => void; onWorkspaceFavorite: (id: string) => void; onUndo?: () => void; onRedo?: () => void; canUndo?: boolean; canRedo?: boolean; onImport?: () => void; onExport?: () => void; onLoadTemplate?: (templateId: string) => void; templates?: ExperimentTemplate[]; } const WorkspaceManager = ({ workspaces, activeWorkspaceId, onWorkspaceChange, onWorkspaceAdd, onWorkspaceDelete, onWorkspaceRename, onWorkspaceFavorite, onUndo, onRedo, canUndo = false, canRedo = false, onImport, onExport, onLoadTemplate, templates = [], }: WorkspaceManagerProps) => { const [editingId, setEditingId] = useState(null); const [editingName, setEditingName] = useState(""); // Sort workspaces: favorites first, then by order const sortedWorkspaces = [...workspaces].sort((a, b) => { if (a.isFavorite && !b.isFavorite) return -1; if (!a.isFavorite && b.isFavorite) return 1; return 0; }); const handleStartEditing = (e: React.MouseEvent, workspace: Workspace) => { e.stopPropagation(); setEditingId(workspace.id); setEditingName(workspace.name); }; const handleFinishEditing = () => { if (editingId && editingName.trim()) { onWorkspaceRename(editingId, editingName.trim()); } setEditingId(null); setEditingName(""); }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") { handleFinishEditing(); } else if (e.key === "Escape") { setEditingId(null); setEditingName(""); } }; return (
{/* Undo/Redo buttons */}
{sortedWorkspaces.map((workspace) => (
onWorkspaceChange(workspace.id)} > {/* Favorite button */} {/* Name or input for editing */} {editingId === workspace.id ? (
e.stopPropagation()}> setEditingName(e.target.value)} onKeyDown={handleKeyDown} onBlur={handleFinishEditing} className="h-6 w-32 text-sm px-2" autoFocus />
) : ( <> {workspace.name} {/* Edit button */} )} {/* Delete button */} {workspaces.length > 1 && editingId !== workspace.id && ( )}
))}
{/* Action buttons */}
{/* Templates dropdown */} {templates.length > 0 && onLoadTemplate && ( Modèles d'expériences {templates.map((template) => ( onLoadTemplate(template.id)} className="flex flex-col items-start" > {template.name} {template.description} ))} )} {/* Import/Export buttons */} {onImport && ( Importer JSON )} {onExport && ( Exporter JSON )}
); }; export default WorkspaceManager;