From 3fcd164fd838dad07492728947f52a192c20efd1 Mon Sep 17 00:00:00 2001 From: Sandro Date: Mon, 26 Oct 2026 07:19:55 +0100 Subject: [PATCH] fix(workspace): center floating file explorer dialog on mobile --- .../src/features/workspace/WorkspaceView.tsx | 589 +++++++++--------- 1 file changed, 299 insertions(+), 290 deletions(-) diff --git a/frontend/src/features/workspace/WorkspaceView.tsx b/frontend/src/features/workspace/WorkspaceView.tsx index 25d2196..0127323 100644 --- a/frontend/src/features/workspace/WorkspaceView.tsx +++ b/frontend/src/features/workspace/WorkspaceView.tsx @@ -3189,6 +3189,278 @@ export const WorkspaceView: React.FC = ({ const isEmpty = docs.length === 0 && allFolderPaths.length === 0; + const renderExplorerBody = () => ( + <> +
+
+ + setSearchQuery(e.target.value)} + placeholder="Dateien durchsuchen…" + className="w-full h-9 sm:h-7 pl-8 sm:pl-7 pr-2 input-field text-sm sm:text-xs" + /> +
+ +
+ + + +
+
+ + {isCreatingFolder && newFolderParent === null && ( +
+ + setNewFolderName(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter') handleConfirmCreateFolder(); + if (e.key === 'Escape') setIsCreatingFolder(false); + }} + placeholder="Neuer Ordnername…" + className="flex-1 h-8 sm:h-6 px-2 sm:px-1.5 input-field text-xs" + /> + + +
+ )} + + {/* Empty workspace state */} + {isEmpty ? ( +
+ +

Noch keine Notizen

+

+ Erstelle eine neue Datei oder lege Ordner an, um deine Dokumente übersichtlich zu strukturieren. +

+
+ + +
+
+ ) : ( +
+ {/* Drag target for Root when dragging a note or a folder */} + {(draggingDocId || draggingFolderPath) && ( +
{ + e.preventDefault(); + e.stopPropagation(); + setDragOverFolder('__root__'); + }} + onDragLeave={(e) => { + e.preventDefault(); + if (dragOverFolder === '__root__') setDragOverFolder(null); + }} + onDrop={(e) => { + e.preventDefault(); + e.stopPropagation(); + const droppedFolder = + e.dataTransfer.getData('application/mindsift-folder-path') || + draggingFolderPath; + setDragOverFolder(null); + setDraggingDocId(null); + setDraggingFolderPath(null); + + if (droppedFolder) { + handleMoveFolder(droppedFolder, ''); + } else { + handleDropDocToFolder('', e); + } + }} + className={`mx-2 my-1.5 p-2 border-2 border-dashed rounded-btn text-center text-xs transition-colors ${ + dragOverFolder === '__root__' + ? 'border-accent bg-accent/20 text-main font-semibold' + : 'border-border text-muted bg-canvas' + }`} + > + {draggingFolderPath + ? '📁 Ordner in Hauptverzeichnis verschieben' + : '📁 In Hauptverzeichnis verschieben (ohne Ordner)'} +
+ )} + + {/* Angepinnte Notizen (Favorites) - Collapsible */} + {pinnedDocs.length > 0 && !searchQuery && ( +
+ + {!isPinnedCollapsed && ( +
+ {pinnedDocs.map((doc) => { + const isSelected = selectedDoc?.id === doc.id && workspaceMode === 'editor'; + return ( +
{ + e.stopPropagation(); + e.dataTransfer.setData('application/mindsift-doc-id', doc.id); + e.dataTransfer.setData('text/plain', doc.id); + setDraggingDocId(doc.id); + }} + onDragEnd={() => setDraggingDocId(null)} + onClick={() => { + setSelectedDoc(doc); + setZoomedBlockId(null); + setWorkspaceMode('editor'); + setShowMobileFileDrawer(false); + }} + className={`group flex items-center justify-between px-2 py-2.5 sm:py-1.5 rounded-btn transition-colors cursor-pointer text-sm sm:text-xs ${ + isSelected + ? 'bg-panel-elevated border-l-2 border-accent text-main font-medium' + : 'text-muted hover:text-main hover:bg-canvas/50' + }`} + title="Angepinnte Notiz öffnen" + > +
+ {doc.icon || '📄'} + {doc.title || 'Unbenannt'} +
+ +
+ ); + })} +
+ )} +
+ )} + + {/* Themen & Hashtags (Collapsible) - directly under Pinned Notes */} + {workspaceTags.length > 0 && !searchQuery && ( +
+ + {!isTagsCollapsed && ( +
+ {workspaceTags.map((wt) => ( + + ))} +
+ )} +
+ )} + + {rootTree.map(renderFolder)} + {rootDocs.map((doc) => renderDocItem(doc, 0))} + + {filteredDocs.length === 0 && searchQuery && ( +
+ Keine Dateien gefunden für "{searchQuery}" +
+ )} +
+ )} + + ); + return (
@@ -3269,308 +3541,45 @@ export const WorkspaceView: React.FC = ({ {/* ===================================================================== */} {workspaceMode === 'editor' && (
- {/* Mobile Backdrop for File Tree Slide-Over Drawer */} + {/* Mobile Centered Floating Explorer Dialog ("in der Mitte schweben") */} {showMobileFileDrawer && (
setShowMobileFileDrawer(false)} - /> - )} - - {/* Left Document & Folder Explorer Tree (Desktop Sidebar + Mobile Slide-Over Drawer) */} -
- {/* Mobile Drawer Top Header */} -
-
- - Dateibaum & Ordner -
- -
- -
-
- - setSearchQuery(e.target.value)} - placeholder="Dateien durchsuchen…" - className="w-full h-9 sm:h-7 pl-8 sm:pl-7 pr-2 input-field text-sm sm:text-xs" - /> -
- -
- - - -
-
- - {isCreatingFolder && newFolderParent === null && ( -
- - setNewFolderName(e.target.value)} - onKeyDown={(e) => { - if (e.key === 'Enter') handleConfirmCreateFolder(); - if (e.key === 'Escape') setIsCreatingFolder(false); - }} - placeholder="Neuer Ordnername…" - className="flex-1 h-8 sm:h-6 px-2 sm:px-1.5 input-field text-xs" - /> - - -
- )} - - {isEmpty ? ( -
- -
Keine Dateien vorhanden
-

- Erstelle eine neue Datei oder lege Ordner an, um deine Dokumente übersichtlich zu strukturieren. -

-
+ {/* Mobile Dialog Header */} +
+
+
+ +
+ Dateibaum & Ordner +
-
+ +
+ {renderExplorerBody()} +
- ) : ( -
- {/* Drag target for Root when dragging a note or a folder */} - {(draggingDocId || draggingFolderPath) && ( -
{ - e.preventDefault(); - e.stopPropagation(); - setDragOverFolder('__root__'); - }} - onDragLeave={(e) => { - e.preventDefault(); - if (dragOverFolder === '__root__') setDragOverFolder(null); - }} - onDrop={(e) => { - e.preventDefault(); - e.stopPropagation(); - const droppedFolder = - e.dataTransfer.getData('application/mindsift-folder-path') || - draggingFolderPath; - setDragOverFolder(null); - setDraggingDocId(null); - setDraggingFolderPath(null); +
+ )} - if (droppedFolder) { - handleMoveFolder(droppedFolder, ''); - } else { - handleDropDocToFolder('', e); - } - }} - className={`mx-2 my-1.5 p-2 border-2 border-dashed rounded-btn text-center text-xs transition-colors ${ - dragOverFolder === '__root__' - ? 'border-accent bg-accent/20 text-main font-semibold' - : 'border-border text-muted bg-canvas' - }`} - > - {draggingFolderPath - ? '📁 Ordner in Hauptverzeichnis verschieben' - : '📁 In Hauptverzeichnis verschieben (ohne Ordner)'} -
- )} - - {/* Angepinnte Notizen (Favorites) - Collapsible */} - {pinnedDocs.length > 0 && !searchQuery && ( -
- - {!isPinnedCollapsed && ( -
- {pinnedDocs.map((doc) => { - const isSelected = selectedDoc?.id === doc.id && workspaceMode === 'editor'; - return ( -
{ - e.stopPropagation(); - e.dataTransfer.setData('application/mindsift-doc-id', doc.id); - e.dataTransfer.setData('text/plain', doc.id); - setDraggingDocId(doc.id); - }} - onDragEnd={() => setDraggingDocId(null)} - onClick={() => { - setSelectedDoc(doc); - setZoomedBlockId(null); - setWorkspaceMode('editor'); - setShowMobileFileDrawer(false); - }} - className={`group flex items-center justify-between px-2 py-2.5 sm:py-1.5 rounded-btn transition-colors cursor-pointer text-sm sm:text-xs ${ - isSelected - ? 'bg-panel-elevated border-l-2 border-accent text-main font-medium' - : 'text-muted hover:text-main hover:bg-canvas/50' - }`} - title="Angepinnte Notiz öffnen" - > -
- {doc.icon || '📄'} - {doc.title || 'Unbenannt'} -
- -
- ); - })} -
- )} -
- )} - - {/* Themen & Hashtags (Collapsible) - directly under Pinned Notes */} - {workspaceTags.length > 0 && !searchQuery && ( -
- - {!isTagsCollapsed && ( -
- {workspaceTags.map((wt) => ( - - ))} -
- )} -
- )} - - {rootTree.map(renderFolder)} - {rootDocs.map((doc) => renderDocItem(doc, 0))} - - {filteredDocs.length === 0 && searchQuery && ( -
- Keine Dateien gefunden für "{searchQuery}" -
- )} -
- )} + {/* Desktop Left Document & Folder Explorer Tree (Sidebar) */} +
+ {renderExplorerBody()}
- {/* Right Logseq Outliner Editor */}
{selectedDoc ? (