diff --git a/frontend/src/components/dirent-detail/dirent-details/dir-details.js b/frontend/src/components/dirent-detail/dirent-details/dir-details.js index c98414ab67..ecaf90429b 100644 --- a/frontend/src/components/dirent-detail/dirent-details/dir-details.js +++ b/frontend/src/components/dirent-detail/dirent-details/dir-details.js @@ -6,6 +6,8 @@ import { CellType } from '../../../metadata/constants'; import { gettext } from '../../../utils/constants'; import { MetadataDetails } from '../../../metadata'; import { useMetadataStatus } from '../../../hooks'; +import { Utils } from '../../../utils/utils'; +import { SYSTEM_FOLDERS } from '../../../constants'; const DirDetails = ({ direntDetail }) => { const { enableMetadata, enableMetadataManagement } = useMetadataStatus(); @@ -13,14 +15,35 @@ const DirDetails = ({ direntDetail }) => { return { type: CellType.MTIME, name: gettext('Last modified time') }; }, []); + const sizeField = useMemo(() => ({ type: 'size', name: gettext('Size') }), []); + const filesField = useMemo(() => ({ type: CellType.NUMBER, name: gettext('Files') }), []); + let file_count = direntDetail.file_count || 0; + let size = Utils.bytesToSize(direntDetail.size); + let special_folder = false; + if (direntDetail.path !== undefined) { + special_folder = SYSTEM_FOLDERS.some(folder => direntDetail.path.startsWith(folder)); + } + return ( <> + {enableMetadataManagement && enableMetadata && ( + <> + + {special_folder ? + : + } + + + {special_folder ? + : + } + + + + )} - {enableMetadataManagement && enableMetadata && ( - - )} ); }; diff --git a/seahub/api2/endpoints/dir.py b/seahub/api2/endpoints/dir.py index 17227bb3af..22c37ead45 100644 --- a/seahub/api2/endpoints/dir.py +++ b/seahub/api2/endpoints/dir.py @@ -29,7 +29,7 @@ from seahub.base.templatetags.seahub_tags import email2nickname, \ email2contact_email from seahub.utils.repo import parse_repo_perm from seahub.constants import PERMISSION_INVISIBLE - +from seahub.repo_metadata.models import RepoMetadata from seahub.settings import ENABLE_VIDEO_THUMBNAIL, THUMBNAIL_ROOT, THUMBNAIL_DEFAULT_SIZE from seaserv import seafile_api @@ -580,13 +580,43 @@ class DirDetailView(APIView): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) - dir_obj = seafile_api.get_dirent_by_path(repo_id, path) + dir_obj = seafile_api.get_dirent_by_path(repo_id, path) + dir_info = { 'repo_id': repo_id, 'path': path, 'name': dir_obj.obj_name if dir_obj else '', 'mtime': timestamp_to_isoformat_timestr(dir_obj.mtime) if dir_obj else '', 'permission': permission, - } + } + + # metadata enable check + metadata = RepoMetadata.objects.filter(repo_id=repo_id).first() + if metadata and metadata.enabled: + from seafevents.repo_metadata.constants import METADATA_TABLE + from seahub.repo_metadata.metadata_server_api import MetadataServerAPI + metadata_server_api = MetadataServerAPI(repo_id, request.user.username) + try: + sql = f""" + SELECT + COUNT(*) AS file_count, + SUM(`{METADATA_TABLE.columns.size.name}`) AS total_size + FROM `{METADATA_TABLE.name}` + WHERE + (`{METADATA_TABLE.columns.is_dir.name}` = False) AND + ( + `{METADATA_TABLE.columns.parent_dir.name}` ILIKE '{path}%' OR + `{METADATA_TABLE.columns.parent_dir.name}` = '{path[:-1]}' + ) + """ + results = metadata_server_api.query_rows(sql, []) + result_row = results.get('results')[0] + dir_info['file_count'] = result_row.get('file_count', 0) + dir_info['size'] = result_row.get('total_size', 0) + except Exception as e: + logger.exception(e) + error_msg = 'Internal Server Error' + return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) + return Response(dir_info)