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
MindSift CI & Docker Release / Build, Test in Container & Push (push) Failing after 19s
This commit is contained in:
1 parent
27b3567008
commit
d3dd4c8cc6
1 file changed
+45
-15
@@ -89,22 +89,20 @@ const FolderTreeItem: React.FC<FolderTreeItemProps> = ({
|
|||||||
const hasContent = node.subfolders.length > 0 || node.docs.length > 0;
|
const hasContent = node.subfolders.length > 0 || node.docs.length > 0;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div className="space-y-0.5">
|
||||||
onDragOver={(e) => {
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
setDragOverFolder(node.fullPath);
|
|
||||||
}}
|
|
||||||
onDragLeave={(e) => {
|
|
||||||
e.preventDefault();
|
|
||||||
if (dragOverFolder === node.fullPath) setDragOverFolder(null);
|
|
||||||
}}
|
|
||||||
onDrop={(e) => handleDropOnFolder(node.fullPath, e)}
|
|
||||||
className="space-y-0.5"
|
|
||||||
>
|
|
||||||
<div
|
<div
|
||||||
draggable
|
draggable
|
||||||
onDragStart={(e) => handleFolderDragStart(e, node.fullPath)}
|
onDragStart={(e) => handleFolderDragStart(e, node.fullPath)}
|
||||||
|
onDragOver={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
setDragOverFolder(node.fullPath);
|
||||||
|
}}
|
||||||
|
onDragLeave={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
if (dragOverFolder === node.fullPath) setDragOverFolder(null);
|
||||||
|
}}
|
||||||
|
onDrop={(e) => handleDropOnFolder(node.fullPath, e)}
|
||||||
style={{ paddingLeft: `${depth * 12 + 8}px` }}
|
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 ${
|
className={`group flex items-center justify-between pr-2 py-1 rounded-btn text-xs cursor-pointer transition-colors ${
|
||||||
isDragOver
|
isDragOver
|
||||||
@@ -464,7 +462,14 @@ export const WorkspaceView: React.FC<WorkspaceViewProps> = ({
|
|||||||
}
|
}
|
||||||
const res = await api.createFolder(clean);
|
const res = await api.createFolder(clean);
|
||||||
setFolders((prev) => (prev.includes(res.path) ? prev : [...prev, res.path].sort()));
|
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('');
|
setNewFolderName('');
|
||||||
setNewFolderIsShared(false);
|
setNewFolderIsShared(false);
|
||||||
setShowNewFolderModal(false);
|
setShowNewFolderModal(false);
|
||||||
@@ -526,6 +531,16 @@ export const WorkspaceView: React.FC<WorkspaceViewProps> = ({
|
|||||||
setDocs((prev) =>
|
setDocs((prev) =>
|
||||||
prev.map((d) => (d.id === docId ? { ...d, folderPath: updatedDoc.folderPath } : d))
|
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 {
|
} catch {
|
||||||
// ignore
|
// ignore
|
||||||
}
|
}
|
||||||
@@ -533,6 +548,16 @@ export const WorkspaceView: React.FC<WorkspaceViewProps> = ({
|
|||||||
triggerHaptic(15);
|
triggerHaptic(15);
|
||||||
try {
|
try {
|
||||||
await api.moveFolder(folderPath, targetFolder);
|
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();
|
loadWorkspaceData();
|
||||||
} catch {
|
} catch {
|
||||||
// ignore
|
// 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) {
|
for (const p of sortedPaths) {
|
||||||
const parts = p.split('/');
|
const parts = p.split('/');
|
||||||
|
|||||||
Reference in new issue
Block a user