diff --git a/ui/src/pages/tablo.tsx b/ui/src/pages/tablo.tsx index 6940bd8..2404b10 100644 --- a/ui/src/pages/tablo.tsx +++ b/ui/src/pages/tablo.tsx @@ -37,6 +37,9 @@ export const TabloPage = () => { const [editingFolderId, setEditingFolderId] = useState(null); const [editingFolderName, setEditingFolderName] = useState(""); + // Folder modal state + const [openFolderId, setOpenFolderId] = useState(null); + // Sample tablo data - in a real app this would come from an API const [tablos, setTablos] = useState([ { id: 1, name: "Projet Alpha", color: "bg-blue-500" }, @@ -248,11 +251,7 @@ export const TabloPage = () => { }; const toggleFolder = (folderId: string) => { - setFolders( - folders.map((folder) => - folder.id === folderId ? { ...folder, isOpen: !folder.isOpen } : folder - ) - ); + setOpenFolderId(openFolderId === folderId ? null : folderId); }; const removeTabloFromFolder = (folderId: string, tabloId: number) => { @@ -385,31 +384,36 @@ export const TabloPage = () => { {/* Contextual Menu */} {hoveredTablo === tablo.id && (
- {!inFolder && - menuItems.map((item, index) => ( - - ))} - {inFolder && folderId && ( + {/* Regular menu items - always show */} + {menuItems.map((item, index) => ( + ))} + + {/* Additional option for tablos in folders */} + {inFolder && folderId && ( + <> +
+ + )}
)} @@ -445,113 +449,68 @@ export const TabloPage = () => { {isDragOver && dragOverPosition === "after" && (
)} - {!folder.isOpen ? ( - // Closed folder view -
toggleFolder(folder.id)} - > - {/* Mini preview of tablos in folder */} -
- {folder.tablos.slice(0, 4).map((tablo, index) => ( -
- ))} -
-
-
📁
- {editingFolderId === folder.id ? ( - setEditingFolderName(e.target.value)} - onBlur={saveEditingFolder} - onKeyDown={(e) => { - if (e.key === "Enter") { - saveEditingFolder(); - } else if (e.key === "Escape") { - cancelEditingFolder(); - } - }} - className="bg-white dark:bg-gray-600 text-gray-900 dark:text-white text-sm font-semibold px-2 py-1 rounded border-none outline-none focus:ring-2 focus:ring-blue-400 text-center" - autoFocus - onClick={(e) => e.stopPropagation()} - /> - ) : ( -

{ - e.stopPropagation(); - startEditingFolder(folder.id, folder.name); - }} - > - {folder.name} -

- )} -

- {folder.tablos.length} tablo - {folder.tablos.length !== 1 ? "s" : ""} -

-
+ {/* Folder view - always shows as closed since modal handles open state */} +
toggleFolder(folder.id)} + > + {/* Mini preview of tablos in folder */} +
+ {folder.tablos.slice(0, 4).map((tablo, index) => ( +
+ ))}
- ) : ( - // Open folder view -
-
- {editingFolderId === folder.id ? ( - setEditingFolderName(e.target.value)} - onBlur={saveEditingFolder} - onKeyDown={(e) => { - if (e.key === "Enter") { - saveEditingFolder(); - } else if (e.key === "Escape") { - cancelEditingFolder(); - } - }} - className="bg-white dark:bg-gray-700 text-gray-900 dark:text-white text-lg font-semibold px-3 py-1 rounded border border-gray-300 dark:border-gray-600 outline-none focus:ring-2 focus:ring-blue-400 focus:border-blue-400 flex-1 mr-2" - autoFocus - /> - ) : ( -

- startEditingFolder(folder.id, folder.name) + +
+
📁
+ {editingFolderId === folder.id ? ( + setEditingFolderName(e.target.value)} + onBlur={saveEditingFolder} + onKeyDown={(e) => { + if (e.key === "Enter") { + saveEditingFolder(); + } else if (e.key === "Escape") { + cancelEditingFolder(); } - > - {folder.name} -

- )} - -
- -
- {folder.tablos.map((tablo) => - renderTablo(tablo, true, folder.id) - )} -
+ {folder.name} + + )} +

+ {folder.tablos.length} tablo + {folder.tablos.length !== 1 ? "s" : ""} +

- )} +
); }; @@ -677,6 +636,85 @@ export const TabloPage = () => {
)} + + {/* Folder Modal */} + {openFolderId && ( +
+
+ {(() => { + const currentFolder = folders.find((f) => f.id === openFolderId); + if (!currentFolder) return null; + + return ( + <> + {/* Header */} +
+ {editingFolderId === openFolderId ? ( + setEditingFolderName(e.target.value)} + onBlur={saveEditingFolder} + onKeyDown={(e) => { + if (e.key === "Enter") { + saveEditingFolder(); + } else if (e.key === "Escape") { + cancelEditingFolder(); + } + }} + className="bg-white dark:bg-gray-700 text-gray-900 dark:text-white text-2xl font-bold px-3 py-1 rounded border border-gray-300 dark:border-gray-600 outline-none focus:ring-2 focus:ring-blue-400 focus:border-blue-400 flex-1 mr-4" + autoFocus + /> + ) : ( +

+ startEditingFolder(openFolderId, currentFolder.name) + } + > + 📁 {currentFolder.name} +

+ )} +
+ + {currentFolder.tablos.length} tablo + {currentFolder.tablos.length !== 1 ? "s" : ""} + + +
+
+ + {/* Content */} +
+ {currentFolder.tablos.length === 0 ? ( +
+
📂
+

+ Ce dossier est vide +

+

+ Glissez des tablos ici pour les organiser +

+
+ ) : ( +
+ {currentFolder.tablos.map((tablo) => + renderTablo(tablo, true, openFolderId) + )} +
+ )} +
+ + ); + })()} +
+
+ )}
); };