From c6d43340ff4e74c623cadc8d15f1828f4aeae0fa Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Wed, 18 Mar 2026 14:10:45 +0100
Subject: [PATCH] feat folder download as zip
---
src/components/FolderTree/FolderTree.tsx | 14 ++++++++++++--
src/contexts/FileContext.tsx | 20 ++++++++++++++++++++
src/pages/basedata/FilesPage.tsx | 2 ++
src/pages/views/workspace/FileBrowser.tsx | 2 ++
4 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/src/components/FolderTree/FolderTree.tsx b/src/components/FolderTree/FolderTree.tsx
index 11665a2..7e4860a 100644
--- a/src/components/FolderTree/FolderTree.tsx
+++ b/src/components/FolderTree/FolderTree.tsx
@@ -12,7 +12,7 @@
*/
import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';
-import { FaFolder, FaFolderOpen, FaPlus, FaPen, FaTrash, FaChevronRight, FaGlobe, FaSyncAlt } from 'react-icons/fa';
+import { FaFolder, FaFolderOpen, FaPlus, FaPen, FaTrash, FaChevronRight, FaGlobe, FaSyncAlt, FaDownload } from 'react-icons/fa';
import styles from './FolderTree.module.css';
/* ── Public types ──────────────────────────────────────────────────────── */
@@ -61,6 +61,7 @@ export interface FolderTreeProps {
onDeleteFile?: (fileId: string) => Promise;
onDeleteFiles?: (fileIds: string[]) => Promise;
onDeleteFolders?: (folderIds: string[]) => Promise;
+ onDownloadFolder?: (folderId: string, folderName: string) => Promise;
}
/* ── Helpers ───────────────────────────────────────────────────────────── */
@@ -285,12 +286,14 @@ interface TreeNodeProps {
onMoveFolders?: (folderIds: string[], targetParentId: string | null) => Promise;
onMoveFile?: (fileId: string, targetFolderId: string | null) => Promise;
onMoveFiles?: (fileIds: string[], targetFolderId: string | null) => Promise;
+ onDownloadFolder?: (folderId: string, folderName: string) => Promise;
}
function _TreeNode({
node, depth, selectedFolderId, expandedIds, showFiles, filesByFolder, sel,
onToggle, onSelect,
onCreateFolder, onRenameFolder, onDeleteFolder, onMoveFolder, onMoveFolders, onMoveFile, onMoveFiles,
+ onDownloadFolder,
}: TreeNodeProps) {
const [renaming, setRenaming] = useState(false);
const [renameValue, setRenameValue] = useState(node.name);
@@ -436,6 +439,11 @@ function _TreeNode({
{node.name}
)}
+ {onDownloadFolder && !(isMultiSelected && sel.selectedItemIds.size > 1) && (
+
+ )}
{onCreateFolder && !(isMultiSelected && sel.selectedItemIds.size > 1) && (