From 27a4bcdfc20466f936c0e4a3cf608264aa89b0f4 Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Sun, 28 Dec 2025 16:48:56 +0200 Subject: [PATCH] feat(ui): support multiple folder selection in Google Drive indexing - Update manage page to handle array of selected folders - Add info icon with clear description about folder-level indexing - Display list of all selected folders before indexing - Remove unnecessary file type details section - Pass comma-separated folder IDs and names to backend --- .../connectors/(manage)/page.tsx | 128 +++++++++--------- 1 file changed, 61 insertions(+), 67 deletions(-) diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx index fd1f7da1d..bbbfd61e0 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/(manage)/page.tsx @@ -7,6 +7,7 @@ import { Edit, Folder, HardDrive, + Info, Loader2, Plus, RefreshCw, @@ -117,8 +118,7 @@ export default function ConnectorsPage() { // Google Drive folder selection state const [driveFolderDialogOpen, setDriveFolderDialogOpen] = useState(false); const [driveFolders, setDriveFolders] = useState([]); - const [selectedFolderId, setSelectedFolderId] = useState(""); - const [selectedFolderName, setSelectedFolderName] = useState(""); + const [selectedFolders, setSelectedFolders] = useState>([]); const [isLoadingFolders, setIsLoadingFolders] = useState(false); useEffect(() => { @@ -186,8 +186,8 @@ export default function ConnectorsPage() { // Handle Google Drive folder indexing const handleIndexDriveFolder = async () => { - if (selectedConnectorForIndexing === null || !selectedFolderId) { - toast.error("Please select a folder"); + if (selectedConnectorForIndexing === null || selectedFolders.length === 0) { + toast.error("Please select at least one folder"); return; } @@ -195,28 +195,26 @@ export default function ConnectorsPage() { try { setIndexingConnectorId(selectedConnectorForIndexing); - const selectedFolder = driveFolders.find((f) => f.id === selectedFolderId); - const folderName = selectedFolder?.name || "Selected Folder"; - // Call indexConnector with folder_id and folder_name as query params + // Call indexConnector with folder_ids and folder_names as query params await indexConnector( selectedConnectorForIndexing, searchSpaceId, undefined, undefined, - selectedFolderId, - folderName + selectedFolders.map((f) => f.id).join(","), + selectedFolders.map((f) => f.name).join(", ") ); toast.success(t("indexing_started")); } catch (error) { console.error("Error indexing connector content:", error); toast.error(error instanceof Error ? error.message : t("indexing_failed")); } finally { - setIndexingConnectorId(null); - setSelectedConnectorForIndexing(null); - setSelectedFolderId(""); - setDriveFolders([]); - } + setIndexingConnectorId(null); + setSelectedConnectorForIndexing(null); + setSelectedFolders([]); + setDriveFolders([]); + } }; // Handle connector indexing with dates @@ -683,66 +681,62 @@ export default function ConnectorsPage() { {/* Google Drive Folder Selection Dialog */} - - Select Google Drive Folder - - Browse and select a folder to index. Click folders to expand and see subfolders. - - -
+ + Select Google Drive Folders + + + + Select folders to index. Only files directly in each folder will be + processed—subfolders must be selected separately. + + + +
- {selectedConnectorForIndexing && ( - { - setSelectedFolderId(folderId); - setSelectedFolderName(folderName); - }} - /> - )} -

- Changes to files in this folder will be automatically detected and re-indexed. -

-
- {selectedFolderId && selectedFolderName && ( -
-
-

Selected folder:

-

- {selectedFolderName} -

-
-
-

What will be indexed:

-
    -
  • Google Docs, Sheets, Slides (as PDFs)
  • -
  • PDFs, Word, Excel, PowerPoint files
  • -
  • Text files, markdown, code files
  • -
  • Images (with OCR if enabled)
  • -
-
-
+ {selectedConnectorForIndexing && ( + { + setSelectedFolders(folders); + }} + /> )}
+ {selectedFolders.length > 0 && ( +
+
+

+ Selected {selectedFolders.length} folder{selectedFolders.length > 1 ? "s" : ""}: +

+
+ {selectedFolders.map((folder) => ( +

+ • {folder.name} +

+ ))} +
+
+
+ )} +
- - + onClick={() => { + setDriveFolderDialogOpen(false); + setSelectedConnectorForIndexing(null); + setSelectedFolders([]); + setDriveFolders([]); + }} + > + {tCommon("cancel")} + + +