diff --git a/api/db/services/file_service.py b/api/db/services/file_service.py index fbad870f38..bd9e610c4b 100644 --- a/api/db/services/file_service.py +++ b/api/db/services/file_service.py @@ -57,6 +57,12 @@ def get_by_pf_id(cls, tenant_id, pf_id, page_number, items_per_page, if file["type"] == FileType.FOLDER.value: file["size"] = cls.get_folder_size(file["id"]) file['kbs_info'] = [] + children = list(cls.model.select().where( + (cls.model.tenant_id == tenant_id), + (cls.model.parent_id == file["id"]), + ~(cls.model.id == file["id"]), + ).dicts()) + file["has_child_folder"] = any(value["type"] == "folder" for value in children) continue kbs_info = cls.get_kb_id_by_file_id(file['id']) file['kbs_info'] = kbs_info diff --git a/web/src/interfaces/database/file-manager.ts b/web/src/interfaces/database/file-manager.ts index 749d6ff011..bfcafa355e 100644 --- a/web/src/interfaces/database/file-manager.ts +++ b/web/src/interfaces/database/file-manager.ts @@ -13,6 +13,7 @@ export interface IFile { update_date: string; update_time: number; source_type: string; + has_child_folder?: boolean; } export interface IFolder { diff --git a/web/src/pages/file-manager/move-file-modal/async-tree-select.tsx b/web/src/pages/file-manager/move-file-modal/async-tree-select.tsx index f88b734895..7643f250b8 100644 --- a/web/src/pages/file-manager/move-file-modal/async-tree-select.tsx +++ b/web/src/pages/file-manager/move-file-modal/async-tree-select.tsx @@ -3,6 +3,7 @@ import { IFile } from '@/interfaces/database/file-manager'; import type { GetProp, TreeSelectProps } from 'antd'; import { TreeSelect } from 'antd'; import { useCallback, useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; type DefaultOptionType = GetProp[number]; @@ -12,6 +13,7 @@ interface IProps { } const AsyncTreeSelect = ({ value, onChange }: IProps) => { + const { t } = useTranslation(); const { fetchList } = useFetchPureFileList(); const [treeData, setTreeData] = useState[]>( [], @@ -30,7 +32,10 @@ const AsyncTreeSelect = ({ value, onChange }: IProps) => { pId: x.parent_id, value: x.id, title: x.name, - isLeaf: false, + isLeaf: + typeof x.has_child_folder === 'boolean' + ? !x.has_child_folder + : false, })), ); }); @@ -53,7 +58,7 @@ const AsyncTreeSelect = ({ value, onChange }: IProps) => { style={{ width: '100%' }} value={value} dropdownStyle={{ maxHeight: 400, overflow: 'auto' }} - placeholder="Please select" + placeholder={t('fileManager.pleaseSelect')} onChange={handleChange} loadData={onLoadData} treeData={treeData}