From a3c82d802b379cfd24e908a6e92d85acead95611 Mon Sep 17 00:00:00 2001 From: shatfield4 Date: Mon, 23 Sep 2024 17:34:48 -0700 Subject: [PATCH 1/9] wip improve remove document ux --- .../WorkspaceFileRow/index.jsx | 22 +++-- .../Documents/WorkspaceDirectory/index.jsx | 88 +++++++++++++++++-- 2 files changed, 98 insertions(+), 12 deletions(-) diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx index 177d9b82324..7b60f4510ba 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx @@ -19,6 +19,8 @@ export default function WorkspaceFileRow({ fetchKeys, hasChanges, movedItems, + selected, + toggleSelection, }) { const onRemoveClick = async () => { setLoading(true); @@ -43,12 +45,22 @@ export default function WorkspaceFileRow({
-
+
+
{ + e.stopPropagation(); + toggleSelection(); + }} + > + {selected &&
} +
{ + setSelectedItems((prevSelectedItems) => { + const newSelectedItems = { ...prevSelectedItems }; + if (newSelectedItems[item.id]) { + delete newSelectedItems[item.id]; + } else { + newSelectedItems[item.id] = true; + } + return newSelectedItems; + }); + }; + + const removeSelectedItems = async () => { + setLoading(true); + setLoadingMessage("Removing selected files from workspace"); + + const itemsToRemove = Object.keys(selectedItems).map((itemId) => { + const folder = files.items.find((f) => f.items.some((i) => i.id === itemId)); + const item = folder.items.find((i) => i.id === itemId); + return `${folder.name}/${item.name}`; + }); + + try { + await Workspace.modifyEmbeddings(workspace.slug, { + adds: [], + deletes: itemsToRemove, + }); + await fetchKeys(true); + setSelectedItems({}); + } catch (error) { + console.error("Failed to remove documents:", error); + } + + setLoadingMessage(""); + setLoading(false); + }; + if (loading) { return (
@@ -60,18 +100,16 @@ function WorkspaceDirectory({ }`} >
-

Name

+

Name

-
- {Object.values(files.items).some( - (folder) => folder.items.length > 0 - ) || movedItems.length > 0 ? ( +
+ {files.items.some((folder) => folder.items.length > 0) || movedItems.length > 0 ? ( <> {files.items.map((folder) => - folder.items.map((item, index) => ( + folder.items.map((item) => ( toggleSelection(item)} /> )) )} @@ -92,6 +132,40 @@ function WorkspaceDirectory({
)}
+ {Object.keys(selectedItems).length > 0 && !hasChanges && ( +
+
+
+ + +
+
+
+ )}
{hasChanges && (
From 8ae4dab0d54312e113278abe46cf9d0bf20f943d Mon Sep 17 00:00:00 2001 From: shatfield4 Date: Tue, 24 Sep 2024 15:13:01 -0700 Subject: [PATCH 2/9] fix border ui bugs when adding files to workspace --- .../WorkspaceFileRow/index.jsx | 41 ++--- .../Documents/WorkspaceDirectory/index.jsx | 142 +++++++++--------- 2 files changed, 96 insertions(+), 87 deletions(-) diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx index 7b60f4510ba..c91d5af7237 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx @@ -21,8 +21,10 @@ export default function WorkspaceFileRow({ movedItems, selected, toggleSelection, + disableSelection, }) { - const onRemoveClick = async () => { + const onRemoveClick = async (e) => { + e.stopPropagation(); setLoading(true); try { @@ -43,24 +45,26 @@ export default function WorkspaceFileRow({ const isMovedItem = movedItems?.some((movedItem) => movedItem.id === item.id); return (
-
{ - e.stopPropagation(); - toggleSelection(); - }} - > - {selected &&
} -
+ {!disableSelection && ( +
{ + e.stopPropagation(); + toggleSelection(); + }} + > + {selected &&
} +
+ )} { const [hover, setHover] = useState(false); const pinEvent = new CustomEvent("pinned_document"); - const updatePinStatus = async () => { + const updatePinStatus = async (e) => { + e.stopPropagation(); try { if (!pinned) window.dispatchEvent(pinEvent); const success = await Workspace.setPinForDocument( diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx index 10f4ce7f818..2813c234e3c 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx @@ -94,78 +94,82 @@ function WorkspaceDirectory({ {workspace.name}
-
-
-

Name

-

-

-
- {files.items.some((folder) => folder.items.length > 0) || movedItems.length > 0 ? ( - <> - {files.items.map((folder) => - folder.items.map((item) => ( - toggleSelection(item)} - /> - )) - )} - - ) : ( -
-

- No Documents -

+
+
+
+
+

Name

+

+

+
+ {files.items.some((folder) => folder.items.length > 0) || movedItems.length > 0 ? ( + <> + {files.items.map((folder) => + folder.items.map((item) => ( + toggleSelection(item)} + disableSelection={hasChanges} + /> + )) + )} + + ) : ( +
+

+ No Documents +

+
+ )} +
+ {Object.keys(selectedItems).length > 0 && !hasChanges && ( +
+
+
+ + +
+
)}
- {Object.keys(selectedItems).length > 0 && !hasChanges && ( -
-
-
- - -
-
-
- )}
{hasChanges && (
From f7583dfb355f8205dd50841aeea32b9191685e19 Mon Sep 17 00:00:00 2001 From: shatfield4 Date: Tue, 24 Sep 2024 15:26:02 -0700 Subject: [PATCH 3/9] sort workspacedirectory put adding files at top --- .../Documents/WorkspaceDirectory/index.jsx | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx index 2813c234e3c..6ffa8db18fd 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx @@ -108,24 +108,34 @@ function WorkspaceDirectory({
{files.items.some((folder) => folder.items.length > 0) || movedItems.length > 0 ? ( <> - {files.items.map((folder) => - folder.items.map((item) => ( - toggleSelection(item)} - disableSelection={hasChanges} - /> - )) - )} + {/* Sort items so that the items being moved are at the top */} + {files.items.flatMap((folder) => folder.items) + .sort((a, b) => { + const aIsMovedItem = movedItems.some((movedItem) => movedItem.id === a.id); + const bIsMovedItem = movedItems.some((movedItem) => movedItem.id === b.id); + if (aIsMovedItem && !bIsMovedItem) return -1; + if (!aIsMovedItem && bIsMovedItem) return 1; + return 0; + }) + .map((item) => { + const folder = files.items.find((f) => f.items.includes(item)); + return ( + toggleSelection(item)} + disableSelection={hasChanges} + /> + ); + })} ) : (
From 7ad6c2bce4bafeb0c34b88cc01ee79f2ea2ecd4f Mon Sep 17 00:00:00 2001 From: shatfield4 Date: Tue, 24 Sep 2024 15:48:44 -0700 Subject: [PATCH 4/9] fix workspace file row ui shifting --- .../WorkspaceFileRow/index.jsx | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx index c91d5af7237..0d267439855 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx @@ -50,23 +50,25 @@ export default function WorkspaceFileRow({ } ${isMovedItem ? "bg-green-800/40" : "file-row"} ${selected ? "selected" : ""}`} onClick={!disableSelection ? toggleSelection : undefined} > -
- {!disableSelection && ( -
{ - e.stopPropagation(); - toggleSelection(); - }} - > - {selected &&
} -
- )} +
+
+ {!disableSelection ? ( +
{ + e.stopPropagation(); + toggleSelection(); + }} + > + {selected &&
} +
+ ) : null} +

From f01abeda14ea1dee4639aee03bf21d440a7cc254 Mon Sep 17 00:00:00 2001 From: shatfield4 Date: Tue, 24 Sep 2024 16:13:53 -0700 Subject: [PATCH 5/9] fix selected items bug when adding another item with items already selected on workspace --- .../Documents/WorkspaceDirectory/index.jsx | 65 +++++++++++++------ 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx index 6ffa8db18fd..42a9a7634c2 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx @@ -37,6 +37,20 @@ function WorkspaceDirectory({ }); }; + const toggleSelectAll = () => { + const allItems = files.items.flatMap(folder => folder.items); + const allSelected = allItems.every(item => selectedItems[item.id]); + if (allSelected) { + setSelectedItems({}); + } else { + const newSelectedItems = {}; + allItems.forEach(item => { + newSelectedItems[item.id] = true; + }); + setSelectedItems(newSelectedItems); + } + }; + const removeSelectedItems = async () => { setLoading(true); setLoadingMessage("Removing selected files from workspace"); @@ -62,6 +76,11 @@ function WorkspaceDirectory({ setLoading(false); }; + const handleSaveChanges = (e) => { + setSelectedItems({}); + saveChanges(e); + }; + if (loading) { return (

@@ -71,11 +90,14 @@ function WorkspaceDirectory({
-
-

Name

+
+
+
+

Name

+

-
+

{loadingMessage} @@ -101,8 +123,25 @@ function WorkspaceDirectory({ }`} />

-
-

Name

+
+
+ {!hasChanges && files.items.some((folder) => folder.items.length > 0) ? ( +
sum + folder.items.length, 0)} + tabIndex={0} + onClick={toggleSelectAll} + > + {Object.keys(selectedItems).length === files.items.reduce((sum, folder) => sum + folder.items.length, 0) && ( +
+ )} +
+ ) : ( +
+ )} +

Name

+

@@ -150,19 +189,7 @@ function WorkspaceDirectory({
From f59d123b2183b5d10d3cb8f89227b3c846e8bdda Mon Sep 17 00:00:00 2001 From: timothycarambat Date: Wed, 25 Sep 2024 12:32:41 -0700 Subject: [PATCH 8/9] refactor --- .../WorkspaceFileRow/index.jsx | 25 ++++--- .../Documents/WorkspaceDirectory/index.jsx | 73 +++++++++---------- 2 files changed, 50 insertions(+), 48 deletions(-) diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx index 38dcb29198f..ba5d98f6902 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx @@ -42,18 +42,24 @@ export default function WorkspaceFileRow({ setLoading(false); }; + function toggleRowSelection(e) { + if (disableSelection) return; + e.stopPropagation(); + toggleSelection(); + } + + function handleRowSelection(e) { + e.stopPropagation(); + toggleSelection(); + } + const isMovedItem = movedItems?.some((movedItem) => movedItem.id === item.id); return (
{ - if (!disableSelection) { - e.stopPropagation(); - toggleSelection(); - } - }} + onClick={toggleRowSelection} >
{ - e.stopPropagation(); - toggleSelection(); - }} + onClick={handleRowSelection} > {selected &&
}
@@ -132,8 +135,8 @@ const PinItemToWorkspace = memo(({ workspace, docPath, item }) => { const pinEvent = new CustomEvent("pinned_document"); const updatePinStatus = async (e) => { - e.stopPropagation(); try { + e.stopPropagation(); if (!pinned) window.dispatchEvent(pinEvent); const success = await Workspace.setPinForDocument( workspace.slug, diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx index 7476005735d..f8d3698d832 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx @@ -158,43 +158,24 @@ function WorkspaceDirectory({
{files.items.some((folder) => folder.items.length > 0) || movedItems.length > 0 ? ( - <> - {/* Sort items so that the items being moved are at the top */} - {files.items - .flatMap((folder) => folder.items) - .sort((a, b) => { - const aIsMovedItem = movedItems.some( - (movedItem) => movedItem.id === a.id - ); - const bIsMovedItem = movedItems.some( - (movedItem) => movedItem.id === b.id - ); - if (aIsMovedItem && !bIsMovedItem) return -1; - if (!aIsMovedItem && bIsMovedItem) return 1; - return 0; - }) - .map((item) => { - const folder = files.items.find((f) => - f.items.includes(item) - ); - return ( - toggleSelection(item)} - disableSelection={hasChanges} - /> - ); - })} - + + {({ item, folder }) => ( + toggleSelection(item)} + disableSelection={hasChanges} + /> + )} + ) : (

@@ -396,4 +377,22 @@ const DocumentWatchAlert = memo(() => { ); }); +function RenderFileRows({ files, movedItems, children }) { + function sortMovedItemsAndFiles(a, b) { + const aIsMovedItem = movedItems.some((movedItem) => movedItem.id === a.id); + const bIsMovedItem = movedItems.some((movedItem) => movedItem.id === b.id); + if (aIsMovedItem && !bIsMovedItem) return -1; + if (!aIsMovedItem && bIsMovedItem) return 1; + return 0; + } + + return files.items + .flatMap((folder) => folder.items) + .sort(sortMovedItemsAndFiles) + .map((item) => { + const folder = files.items.find((f) => f.items.includes(item)); + return children({ item, folder }); + }); +} + export default memo(WorkspaceDirectory); From 1c0363380008ee8a0f7b4ed1f3383d6a2bcec68d Mon Sep 17 00:00:00 2001 From: shatfield4 Date: Wed, 25 Sep 2024 12:42:53 -0700 Subject: [PATCH 9/9] fix bug where unadding single item while selected would stay selected --- .../Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx | 3 ++- .../ManageWorkspace/Documents/WorkspaceDirectory/index.jsx | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx index ba5d98f6902..cc267170b87 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/WorkspaceFileRow/index.jsx @@ -22,6 +22,7 @@ export default function WorkspaceFileRow({ selected, toggleSelection, disableSelection, + setSelectedItems, }) { const onRemoveClick = async (e) => { e.stopPropagation(); @@ -37,7 +38,7 @@ export default function WorkspaceFileRow({ } catch (error) { console.error("Failed to remove document:", error); } - + setSelectedItems({}); setLoadingMessage(""); setLoading(false); }; diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx index f8d3698d832..e9864f12ce4 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/WorkspaceDirectory/index.jsx @@ -173,6 +173,7 @@ function WorkspaceDirectory({ selected={selectedItems[item.id]} toggleSelection={() => toggleSelection(item)} disableSelection={hasChanges} + setSelectedItems={setSelectedItems} /> )}