From 863ce38137cb8c9ad53fcf4d27f349db14215dbe Mon Sep 17 00:00:00 2001 From: Marcello Fitton <106866560+angelplusultra@users.noreply.github.com> Date: Tue, 17 Mar 2026 13:46:54 -0700 Subject: [PATCH] feat: Add document count indicators to workspace document management modal (#5207) * add document counts to non-embedded and embedded documents * Update logic to not count search filtered documents * refactor how count is done and rendered * translations --------- Co-authored-by: Timothy Carambat --- .../Documents/Directory/FolderRow/index.jsx | 6 ++++++ .../ManageWorkspace/Documents/Directory/index.jsx | 14 +++++++++++++- .../Documents/WorkspaceDirectory/index.jsx | 13 +++++++++++-- frontend/src/locales/ar/common.js | 2 ++ frontend/src/locales/cs/common.js | 2 ++ frontend/src/locales/da/common.js | 2 ++ frontend/src/locales/de/common.js | 2 ++ frontend/src/locales/en/common.js | 2 ++ frontend/src/locales/es/common.js | 2 ++ frontend/src/locales/et/common.js | 2 ++ frontend/src/locales/fa/common.js | 2 ++ frontend/src/locales/fr/common.js | 2 ++ frontend/src/locales/he/common.js | 2 ++ frontend/src/locales/it/common.js | 2 ++ frontend/src/locales/ja/common.js | 2 ++ frontend/src/locales/ko/common.js | 2 ++ frontend/src/locales/lv/common.js | 2 ++ frontend/src/locales/nl/common.js | 2 ++ frontend/src/locales/pl/common.js | 2 ++ frontend/src/locales/pt_BR/common.js | 2 ++ frontend/src/locales/ro/common.js | 2 ++ frontend/src/locales/ru/common.js | 2 ++ frontend/src/locales/tr/common.js | 2 ++ frontend/src/locales/vn/common.js | 2 ++ frontend/src/locales/zh/common.js | 2 ++ frontend/src/locales/zh_TW/common.js | 2 ++ 26 files changed, 76 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/Directory/FolderRow/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/Directory/FolderRow/index.jsx index 320c2b17..1acd9205 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/Directory/FolderRow/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/Directory/FolderRow/index.jsx @@ -5,6 +5,7 @@ import { middleTruncate } from "@/utils/directories"; export default function FolderRow({ item, + totalItems = 0, selected, onRowClick, toggleSelection, @@ -60,6 +61,11 @@ export default function FolderRow({

{middleTruncate(item.name, 35)}

+ {totalItems > 0 && ( + + ({totalItems}) + + )}

diff --git a/frontend/src/components/Modals/ManageWorkspace/Documents/Directory/index.jsx b/frontend/src/components/Modals/ManageWorkspace/Documents/Directory/index.jsx index a57558b3..31e73944 100644 --- a/frontend/src/components/Modals/ManageWorkspace/Documents/Directory/index.jsx +++ b/frontend/src/components/Modals/ManageWorkspace/Documents/Directory/index.jsx @@ -193,6 +193,11 @@ function Directory({ setContextMenu({ visible: false, x: 0, y: 0 }); }; + const totalDocCount = (files?.items ?? []).reduce((acc, folder) => { + if (folder.type === "folder") return folder.items.length + acc; + return acc; + }, 0); + return ( <>

@@ -232,6 +237,13 @@ function Directory({

Name

+ {totalDocCount > 0 && ( +

+ {t(`connectors.directory.total-documents`, { + count: totalDocCount, + })} +

+ )}
@@ -249,6 +261,7 @@ function Directory({ )}
- sum + (folder.items?.length ?? 0), + 0 + ); const toggleSelection = (item) => { setSelectedItems((prevSelectedItems) => { @@ -101,7 +105,6 @@ function WorkspaceDirectory({

Name

-

@@ -157,7 +160,13 @@ function WorkspaceDirectory({ )}

Name

-

+ {embeddedDocCount > 0 && ( +

+ {t(`connectors.directory.total-documents`, { + count: embeddedDocCount, + })} +

+ )}
{files.items.some((folder) => folder.items.length > 0) || diff --git a/frontend/src/locales/ar/common.js b/frontend/src/locales/ar/common.js index 4147f048..e1f628e6 100644 --- a/frontend/src/locales/ar/common.js +++ b/frontend/src/locales/ar/common.js @@ -590,6 +590,8 @@ const TRANSLATIONS = { remove_selected: "حذف المحدد", costs: "*تكلفة ثابتة لإنشاء التمثيلات", save_embed: "حفظ و تضمين", + "total-documents_one": "{{count}}", + "total-documents_other": "{{count}} المستندات", }, upload: { "processor-offline": "غير متاح", diff --git a/frontend/src/locales/cs/common.js b/frontend/src/locales/cs/common.js index c331a4de..18b6abc5 100644 --- a/frontend/src/locales/cs/common.js +++ b/frontend/src/locales/cs/common.js @@ -728,6 +728,8 @@ const TRANSLATIONS = { remove_selected: "Odebrat vybrané", costs: "*Jednorázové náklady pro embeddingy", save_embed: "Uložit a vložit", + "total-documents_one": "{{count}} dokument", + "total-documents_other": "{{count}} dokumenty", }, upload: { "processor-offline": "Procesor dokumentů nedostupný", diff --git a/frontend/src/locales/da/common.js b/frontend/src/locales/da/common.js index 5b9cbfdf..ea57718c 100644 --- a/frontend/src/locales/da/common.js +++ b/frontend/src/locales/da/common.js @@ -597,6 +597,8 @@ const TRANSLATIONS = { remove_selected: "Fjern valgte", costs: "*Engangsomkostning for indlejringer", save_embed: "Gem og indlejr", + "total-documents_one": "{{count}} dokument", + "total-documents_other": "{{count}} dokumenter", }, upload: { "processor-offline": "Dokumentbehandler utilgængelig", diff --git a/frontend/src/locales/de/common.js b/frontend/src/locales/de/common.js index f61373ba..7591d425 100644 --- a/frontend/src/locales/de/common.js +++ b/frontend/src/locales/de/common.js @@ -705,6 +705,8 @@ const TRANSLATIONS = { remove_selected: "Ausgewähltes entfernen", costs: "*Einmalige Kosten für das Einbetten", save_embed: "Speichern und Einbetten", + "total-documents_one": "{{count}} Dokument", + "total-documents_other": "{{count}} Dokumente", }, upload: { "processor-offline": "Dokumentenprozessor nicht verfügbar", diff --git a/frontend/src/locales/en/common.js b/frontend/src/locales/en/common.js index acdc9326..67306800 100644 --- a/frontend/src/locales/en/common.js +++ b/frontend/src/locales/en/common.js @@ -715,6 +715,8 @@ const TRANSLATIONS = { directory: { "my-documents": "My Documents", "new-folder": "New Folder", + "total-documents_one": "{{count}} document", + "total-documents_other": "{{count}} documents", "search-document": "Search for document", "no-documents": "No Documents", "move-workspace": "Move to Workspace", diff --git a/frontend/src/locales/es/common.js b/frontend/src/locales/es/common.js index 664cc1b2..882054e0 100644 --- a/frontend/src/locales/es/common.js +++ b/frontend/src/locales/es/common.js @@ -715,6 +715,8 @@ const TRANSLATIONS = { remove_selected: "Eliminar seleccionados", costs: "*Costo único por incrustaciones", save_embed: "Guardar e incrustar", + "total-documents_one": "{{count}} documento", + "total-documents_other": "{{count}} documentos", }, upload: { "processor-offline": "Procesador de documentos no disponible", diff --git a/frontend/src/locales/et/common.js b/frontend/src/locales/et/common.js index 03dd3d3d..2cefa614 100644 --- a/frontend/src/locales/et/common.js +++ b/frontend/src/locales/et/common.js @@ -675,6 +675,8 @@ const TRANSLATIONS = { remove_selected: "Eemalda valitud", costs: "*Ühekordne embeddingu kulu", save_embed: "Salvesta ja põimi", + "total-documents_one": "{{count}} dokument", + "total-documents_other": "{{count}} dokumendid", }, upload: { "processor-offline": "Dokumenditöötleja pole saadaval", diff --git a/frontend/src/locales/fa/common.js b/frontend/src/locales/fa/common.js index 24b6ddfa..3cb339ee 100644 --- a/frontend/src/locales/fa/common.js +++ b/frontend/src/locales/fa/common.js @@ -594,6 +594,8 @@ const TRANSLATIONS = { remove_selected: "حذف انتخاب‌شده", costs: "*هزینه یکباره برای ایجاد مدل‌های برداری", save_embed: "ذخیره و وارد کردن", + "total-documents_one": "{{count}} سند", + "total-documents_other": "{{count}} اسناد", }, upload: { "processor-offline": diff --git a/frontend/src/locales/fr/common.js b/frontend/src/locales/fr/common.js index 4fbbedb1..decef6b9 100644 --- a/frontend/src/locales/fr/common.js +++ b/frontend/src/locales/fr/common.js @@ -596,6 +596,8 @@ const TRANSLATIONS = { remove_selected: "Supprimer la sélection", costs: "Coûts", save_embed: "Sauvegarder et intégrer", + "total-documents_one": "{{count}}", + "total-documents_other": "{{count}} documents", }, upload: { "processor-offline": "Processeur de documents hors ligne", diff --git a/frontend/src/locales/he/common.js b/frontend/src/locales/he/common.js index ab798760..e43c2461 100644 --- a/frontend/src/locales/he/common.js +++ b/frontend/src/locales/he/common.js @@ -679,6 +679,8 @@ const TRANSLATIONS = { remove_selected: "הסר נבחרים", costs: "*עלות חד פעמית להטמעות", save_embed: "שמור והטמע", + "total-documents_one": "{{count}} מסמך", + "total-documents_other": "מסמכים {{count}}", }, upload: { "processor-offline": "מעבד המסמכים אינו זמין", diff --git a/frontend/src/locales/it/common.js b/frontend/src/locales/it/common.js index cedf604f..e19a0e69 100644 --- a/frontend/src/locales/it/common.js +++ b/frontend/src/locales/it/common.js @@ -600,6 +600,8 @@ const TRANSLATIONS = { remove_selected: "Elimina gli elementi selezionati", costs: "*Costo una tantum per le embedding", save_embed: "Salva e incorpora", + "total-documents_one": "{{count}} documento", + "total-documents_other": "{{count}} documenti", }, upload: { "processor-offline": "Il processore di documenti non è disponibile.", diff --git a/frontend/src/locales/ja/common.js b/frontend/src/locales/ja/common.js index 3b3a1b92..64f297b4 100644 --- a/frontend/src/locales/ja/common.js +++ b/frontend/src/locales/ja/common.js @@ -586,6 +586,8 @@ const TRANSLATIONS = { remove_selected: "選択したものを削除", costs: "※埋め込みには一度だけ費用がかかります", save_embed: "保存して埋め込む", + "total-documents_one": "{{count}} のドキュメント", + "total-documents_other": "{{count}} に関する書類", }, upload: { "processor-offline": "ドキュメント処理機能が利用できません", diff --git a/frontend/src/locales/ko/common.js b/frontend/src/locales/ko/common.js index 410a2a60..bf0dfa42 100644 --- a/frontend/src/locales/ko/common.js +++ b/frontend/src/locales/ko/common.js @@ -687,6 +687,8 @@ const TRANSLATIONS = { remove_selected: "선택 항목 삭제", costs: "*임베딩 1회 비용", save_embed: "저장 및 임베딩", + "total-documents_one": "{{count}} 문서", + "total-documents_other": "{{count}} 관련 문서", }, upload: { "processor-offline": "문서 처리기가 오프라인 상태입니다", diff --git a/frontend/src/locales/lv/common.js b/frontend/src/locales/lv/common.js index ea27a226..f9ffd1d6 100644 --- a/frontend/src/locales/lv/common.js +++ b/frontend/src/locales/lv/common.js @@ -700,6 +700,8 @@ const TRANSLATIONS = { remove_selected: "Noņemt atlasītos", costs: "*Vienreizējas izmaksas iegulšanai", save_embed: "Saglabāt un iegult", + "total-documents_one": "{{count}} dokumenta", + "total-documents_other": "{{count}} dokumenti", }, upload: { "processor-offline": "Dokumentu apstrādātājs nav pieejams", diff --git a/frontend/src/locales/nl/common.js b/frontend/src/locales/nl/common.js index f935edda..2943f2b9 100644 --- a/frontend/src/locales/nl/common.js +++ b/frontend/src/locales/nl/common.js @@ -596,6 +596,8 @@ const TRANSLATIONS = { remove_selected: "Verwijderen Geselecteerd", costs: "*Eenmalige kosten voor embedden", save_embed: "Opslaan en embedden", + "total-documents_one": "{{count}} document", + "total-documents_other": "{{count}} documenten", }, upload: { "processor-offline": "Documentverwerker niet beschikbaar", diff --git a/frontend/src/locales/pl/common.js b/frontend/src/locales/pl/common.js index 14d67f00..ab9ba831 100644 --- a/frontend/src/locales/pl/common.js +++ b/frontend/src/locales/pl/common.js @@ -702,6 +702,8 @@ const TRANSLATIONS = { remove_selected: "Usuń wybrane", costs: "*Jednorazowy koszt dodania danych", save_embed: "Zapisz", + "total-documents_one": "{{count}} dokument", + "total-documents_other": "{{count}} dokumenty", }, upload: { "processor-offline": "Procesor dokumentów niedostępny", diff --git a/frontend/src/locales/pt_BR/common.js b/frontend/src/locales/pt_BR/common.js index 5a04e695..ebfc9dd7 100644 --- a/frontend/src/locales/pt_BR/common.js +++ b/frontend/src/locales/pt_BR/common.js @@ -685,6 +685,8 @@ const TRANSLATIONS = { remove_selected: "Remover Selecionados", costs: "*Custo único para vínculos", save_embed: "Salvar e Inserir", + "total-documents_one": "{{count}} documento", + "total-documents_other": "{{count}} documentos", }, upload: { "processor-offline": "Processador de documentos Indisponível", diff --git a/frontend/src/locales/ro/common.js b/frontend/src/locales/ro/common.js index 08e709a4..49fa53ad 100644 --- a/frontend/src/locales/ro/common.js +++ b/frontend/src/locales/ro/common.js @@ -448,6 +448,8 @@ const TRANSLATIONS = { remove_selected: "Elimină selectate", costs: "*Cost unic pentru embeddings", save_embed: "Salvează și încorporează", + "total-documents_one": "{{count}}", + "total-documents_other": "{{count}} documente", }, upload: { "processor-offline": "Procesorul de documente este offline", diff --git a/frontend/src/locales/ru/common.js b/frontend/src/locales/ru/common.js index 6a401629..bb9473ef 100644 --- a/frontend/src/locales/ru/common.js +++ b/frontend/src/locales/ru/common.js @@ -594,6 +594,8 @@ const TRANSLATIONS = { remove_selected: "Удалить выбранные", costs: "*Единоразовая стоимость за внедрение", save_embed: "Сохранить и внедрить", + "total-documents_one": "{{count}} документ", + "total-documents_other": "{{count}} документы", }, upload: { "processor-offline": "Процессор документов недоступен", diff --git a/frontend/src/locales/tr/common.js b/frontend/src/locales/tr/common.js index 35a37d15..96e5e1d4 100644 --- a/frontend/src/locales/tr/common.js +++ b/frontend/src/locales/tr/common.js @@ -594,6 +594,8 @@ const TRANSLATIONS = { remove_selected: "Seçilenleri Kaldır", costs: "*Gömmeler için tek seferlik maliyet", save_embed: "Kaydet ve Göm", + "total-documents_one": "{{count}} belgesi", + "total-documents_other": "{{count}} belgeleri", }, upload: { "processor-offline": "Belge İşleyici Kullanılamıyor", diff --git a/frontend/src/locales/vn/common.js b/frontend/src/locales/vn/common.js index e03d083e..be950076 100644 --- a/frontend/src/locales/vn/common.js +++ b/frontend/src/locales/vn/common.js @@ -591,6 +591,8 @@ const TRANSLATIONS = { remove_selected: "Xóa Đã chọn", costs: "*Chi phí một lần cho việc nhúng", save_embed: "Lưu và Nhúng", + "total-documents_one": "{{count}}", + "total-documents_other": "{{count}}", }, upload: { "processor-offline": "Trình xử lý Tài liệu Không khả dụng", diff --git a/frontend/src/locales/zh/common.js b/frontend/src/locales/zh/common.js index 2d73969b..8d0505a6 100644 --- a/frontend/src/locales/zh/common.js +++ b/frontend/src/locales/zh/common.js @@ -643,6 +643,8 @@ const TRANSLATIONS = { remove_selected: "移除所选", costs: "*嵌入时一次性费用", save_embed: "保存并嵌入", + "total-documents_one": "{{count}} 文件", + "total-documents_other": "{{count}} 类型的文件", }, upload: { "processor-offline": "文档处理器不可用", diff --git a/frontend/src/locales/zh_TW/common.js b/frontend/src/locales/zh_TW/common.js index e9f10862..08a3fba6 100644 --- a/frontend/src/locales/zh_TW/common.js +++ b/frontend/src/locales/zh_TW/common.js @@ -553,6 +553,8 @@ const TRANSLATIONS = { remove_selected: "移除選擇的項目", costs: "*嵌入僅會計費一次", save_embed: "儲存並嵌入", + "total-documents_one": "{{count}} 文件", + "total-documents_other": "{{count}} 文件", }, upload: { "processor-offline": "文件處理器無法使用",