fix(workspace): refine folder row drop target, depth-first tree sorting & auto-expansion
MindSift CI & Docker Release / Build, Test in Container & Push (push) Failing after 19s

This commit is contained in:
sandrodach committed 2026-10-27 07:16:20 +01:00
1 parent 27b3567008
commit d3dd4c8cc6
1 file changed
+37 -7
@@ -89,7 +89,10 @@ const FolderTreeItem: React.FC<FolderTreeItemProps> = ({
const hasContent = node.subfolders.length > 0 || node.docs.length > 0;
return (
<div className="space-y-0.5">
<div
draggable
onDragStart={(e) => handleFolderDragStart(e, node.fullPath)}
onDragOver={(e) => {
e.preventDefault();
e.stopPropagation();
@@ -100,11 +103,6 @@ const FolderTreeItem: React.FC<FolderTreeItemProps> = ({
if (dragOverFolder === node.fullPath) setDragOverFolder(null);
}}
onDrop={(e) => handleDropOnFolder(node.fullPath, e)}
className="space-y-0.5"
>
<div
draggable
onDragStart={(e) => handleFolderDragStart(e, node.fullPath)}
style={{ paddingLeft: `${depth * 12 + 8}px` }}
className={`group flex items-center justify-between pr-2 py-1 rounded-btn text-xs cursor-pointer transition-colors ${
isDragOver
@@ -464,7 +462,14 @@ export const WorkspaceView: React.FC<WorkspaceViewProps> = ({
}
const res = await api.createFolder(clean);
setFolders((prev) => (prev.includes(res.path) ? prev : [...prev, res.path].sort()));
setExpandedFolders((prev) => ({ ...prev, [res.path]: true }));
const parts = res.path.split('/');
let acc = '';
const expansions: Record<string, boolean> = {};
for (const part of parts) {
acc = acc ? `${acc}/${part}` : part;
expansions[acc] = true;
}
setExpandedFolders((prev) => ({ ...prev, ...expansions }));
setNewFolderName('');
setNewFolderIsShared(false);
setShowNewFolderModal(false);
@@ -526,6 +531,16 @@ export const WorkspaceView: React.FC<WorkspaceViewProps> = ({
setDocs((prev) =>
prev.map((d) => (d.id === docId ? { ...d, folderPath: updatedDoc.folderPath } : d))
);
if (targetFolder) {
const parts = targetFolder.split('/');
let acc = '';
const expansions: Record<string, boolean> = {};
for (const part of parts) {
acc = acc ? `${acc}/${part}` : part;
expansions[acc] = true;
}
setExpandedFolders((prev) => ({ ...prev, ...expansions }));
}
} catch {
// ignore
}
@@ -533,6 +548,16 @@ export const WorkspaceView: React.FC<WorkspaceViewProps> = ({
triggerHaptic(15);
try {
await api.moveFolder(folderPath, targetFolder);
if (targetFolder) {
const parts = targetFolder.split('/');
let acc = '';
const expansions: Record<string, boolean> = {};
for (const part of parts) {
acc = acc ? `${acc}/${part}` : part;
expansions[acc] = true;
}
setExpandedFolders((prev) => ({ ...prev, ...expansions }));
}
loadWorkspaceData();
} catch {
// ignore
@@ -672,7 +697,12 @@ export const WorkspaceView: React.FC<WorkspaceViewProps> = ({
}
}
const sortedPaths = Array.from(allPathsSet).sort((a, b) => a.localeCompare(b));
const sortedPaths = Array.from(allPathsSet).sort((a, b) => {
const depthA = a.split('/').length;
const depthB = b.split('/').length;
if (depthA !== depthB) return depthA - depthB;
return a.localeCompare(b);
});
for (const p of sortedPaths) {
const parts = p.split('/');