diff --git a/tdrive/frontend/src/app/features/drive/api-client/api-client.ts b/tdrive/frontend/src/app/features/drive/api-client/api-client.ts index 7b4a40f1..573cdb2c 100644 --- a/tdrive/frontend/src/app/features/drive/api-client/api-client.ts +++ b/tdrive/frontend/src/app/features/drive/api-client/api-client.ts @@ -1,5 +1,5 @@ import Api from '../../global/framework/api-service'; -import { DriveItem, DriveItemDetails, DriveItemVersion } from '../types'; +import { BrowseFilter, DriveItem, DriveItemDetails, DriveItemVersion } from '../types'; import Workspace from '@deprecated/workspaces/workspaces'; import Logger from 'features/global/framework/logger-service'; import { JWTDataType } from 'app/features/auth/jwt-storage-service'; @@ -70,6 +70,13 @@ export class DriveApiClient { ); } + static async browse(companyId: string, id: string | 'trash' | '', filter: BrowseFilter) { + return await Api.post( + `/internal/services/documents/v1/companies/${companyId}/browse/${id}${appendTdriveToken()}`, + filter, + ); + } + static async remove(companyId: string, id: string | 'trash' | '') { return await Api.delete( `/internal/services/documents/v1/companies/${companyId}/item/${id}${appendTdriveToken()}`, @@ -156,7 +163,11 @@ export class DriveApiClient { static async sharedWithMe(filter?: any, options?: BaseSearchOptions) { const companyId = options?.company_id ? options.company_id : Workspace.currentGroupId; const query = `/internal/services/documents/v1/companies/${companyId}/shared-with-me`; - const filterData = { mime_type: filter.mimeType, creator: filter.creator, view: "shared_with_me" }; + const filterData = { + mime_type: filter.mimeType, + creator: filter.creator, + view: 'shared_with_me', + }; const res = await Api.post( query, filterData, diff --git a/tdrive/frontend/src/app/features/drive/hooks/use-drive-actions.tsx b/tdrive/frontend/src/app/features/drive/hooks/use-drive-actions.tsx index 87cb0dbc..fe939af0 100644 --- a/tdrive/frontend/src/app/features/drive/hooks/use-drive-actions.tsx +++ b/tdrive/frontend/src/app/features/drive/hooks/use-drive-actions.tsx @@ -1,11 +1,11 @@ import { ToasterService } from '@features/global/services/toaster-service'; import useRouterCompany from '@features/router/hooks/use-router-company'; import { useCallback } from 'react'; -import { useRecoilCallback } from 'recoil'; +import { useRecoilValue, useRecoilCallback } from 'recoil'; import { DriveApiClient } from '../api-client/api-client'; import { DriveItemAtom, DriveItemChildrenAtom } from '../state/store'; -import { DriveItem, DriveItemVersion } from '../types'; - +import { BrowseFilter, DriveItem, DriveItemVersion } from '../types'; +import { SharedWithMeFilterState } from '../state/shared-with-me-filter'; /** * Returns the children of a drive item * @param id @@ -13,13 +13,18 @@ import { DriveItem, DriveItemVersion } from '../types'; */ export const useDriveActions = () => { const companyId = useRouterCompany(); + const sharedFilter = useRecoilValue(SharedWithMeFilterState); const refresh = useRecoilCallback( ({ set, snapshot }) => async (parentId: string) => { if (parentId) { + const filter:BrowseFilter = { + company_id: companyId, + mime_type: sharedFilter.mimeType.value, + }; try { - const details = await DriveApiClient.get(companyId, parentId); + const details = await DriveApiClient.browse(companyId, parentId, filter); set(DriveItemChildrenAtom(parentId), details.children); set(DriveItemAtom(parentId), details); for (const child of details.children) { diff --git a/tdrive/frontend/src/app/features/drive/hooks/use-drive-item.tsx b/tdrive/frontend/src/app/features/drive/hooks/use-drive-item.tsx index 7efb829b..062f919a 100644 --- a/tdrive/frontend/src/app/features/drive/hooks/use-drive-item.tsx +++ b/tdrive/frontend/src/app/features/drive/hooks/use-drive-item.tsx @@ -71,8 +71,10 @@ export const useDriveItem = (id: string) => { ); const inTrash = id === 'trash' || item?.path?.some(i => i.parent_id === 'trash'); + const sharedWithMe = id =="shared_with_me"; return { + sharedWithMe, inTrash, loading: loading, children: children || [], diff --git a/tdrive/frontend/src/app/features/drive/state/shared-with-me-filter.tsx b/tdrive/frontend/src/app/features/drive/state/shared-with-me-filter.tsx index dacda8b7..3e37e16b 100644 --- a/tdrive/frontend/src/app/features/drive/state/shared-with-me-filter.tsx +++ b/tdrive/frontend/src/app/features/drive/state/shared-with-me-filter.tsx @@ -2,16 +2,28 @@ import { string } from 'prop-types'; import { atom } from 'recoil'; export type SharedWithMeFilter = { - mimeType: string; + mimeType: { + key: string; + value: string + }; creator: string; - date: string; + date: { + key: string; + value: string; + }; }; export const SharedWithMeFilterState = atom({ key: 'SharedWithMeFilterState', default: { - mimeType: '', + mimeType: { + key: '', + value: '' + }, creator: '', - date: '', + date: { + key: '', + value: '' + } }, }); \ No newline at end of file diff --git a/tdrive/frontend/src/app/features/drive/types.ts b/tdrive/frontend/src/app/features/drive/types.ts index 2cf148ce..8a2d540a 100644 --- a/tdrive/frontend/src/app/features/drive/types.ts +++ b/tdrive/frontend/src/app/features/drive/types.ts @@ -1,3 +1,8 @@ +export type BrowseFilter = { + company_id: string; + mime_type?: string; +} + export type DriveItemDetails = { item: DriveItem; versions: DriveItemVersion[]; diff --git a/tdrive/frontend/src/app/views/client/body/drive/browser.tsx b/tdrive/frontend/src/app/views/client/body/drive/browser.tsx index ded3c420..b24b9db6 100644 --- a/tdrive/frontend/src/app/views/client/body/drive/browser.tsx +++ b/tdrive/frontend/src/app/views/client/body/drive/browser.tsx @@ -11,12 +11,16 @@ import { useDriveUpload } from '@features/drive/hooks/use-drive-upload'; import { DriveItemSelectedList } from '@features/drive/state/store'; import { formatBytes } from '@features/drive/utils'; import useRouterCompany from '@features/router/hooks/use-router-company'; -import useRouterView from '@features/router/hooks/use-router-view'; import _ from 'lodash'; import { memo, Suspense, useCallback, useEffect, useRef, useState } from 'react'; import { atomFamily, useRecoilState, useSetRecoilState } from 'recoil'; import { DrivePreview } from '../../viewer/drive-preview'; -import { useOnBuildContextMenu } from './context-menu'; +import { + useOnBuildContextMenu, + useOnBuildFileTypeContextMenu, + useOnBuildPeopleContextMenu, + useOnBuildDateContextMenu, +} from './context-menu'; import { DocumentRow } from './documents/document-row'; import { FolderRow } from './documents/folder-row'; import HeaderPath from './header-path'; @@ -27,9 +31,10 @@ import { PropertiesModal } from './modals/properties'; import { AccessModal } from './modals/update-access'; import { VersionsModal } from './modals/versions'; import { SharedFilesTable } from './shared-files-table'; -import RouterServices from '@features/router/services/router-service'; import useRouteState from 'app/features/router/hooks/use-route-state'; -import Languages from "features/global/services/languages-service"; +import { SharedWithMeFilterState } from '@features/drive/state/shared-with-me-filter'; +import MenusManager from '@components/menus/menus-manager.jsx'; +import Languages from 'features/global/services/languages-service'; export const DriveCurrentFolderAtom = atomFamily< string, @@ -53,6 +58,7 @@ export default memo( }) => { const companyId = useRouterCompany(); setTdriveTabToken(tdriveTabContextToken || null); + const [filter, setFilter] = useRecoilState(SharedWithMeFilterState); const [parentId, _setParentId] = useRecoilState( DriveCurrentFolderAtom({ context: context, initialFolderId: initialParentId || 'root' }), @@ -60,6 +66,7 @@ export default memo( const [loadingParentChange, setLoadingParentChange] = useState(false); const { + sharedWithMe, details, access, item, @@ -96,14 +103,14 @@ export default memo( //In case we are kicked out of the current folder, we need to reset the parent id useEffect(() => { - if (!loading && !path?.length && !inPublicSharing) setParentId('root'); + if (!loading && !path?.length && !inPublicSharing && !sharedWithMe) setParentId('root'); }, [path, loading, setParentId]); useEffect(() => { setChecked({}); refresh(parentId); if (!inPublicSharing) refresh('trash'); - }, [parentId, refresh]); + }, [parentId, refresh, filter]); const openItemModal = useCallback(() => { if (item?.id) setCreationModalState({ open: true, parent_id: item.id }); @@ -127,6 +134,10 @@ export default memo( const onBuildContextMenu = useOnBuildContextMenu(children, initialParentId); const { viewId } = useRouteState(); + const buildFileTypeContextMenu = useOnBuildFileTypeContextMenu(); + const buildPeopleContextMen = useOnBuildPeopleContextMenu(); + const buildDateContextMenu = useOnBuildDateContextMenu(); + return ( <> {viewId == 'shared-with-me' ? ( @@ -171,16 +182,90 @@ export default memo( } >
- + {sharedWithMe ? ( +
+ + {Languages.t('scenes.app.shared_with_me.shared_with_me')} + + {/* Filters */} +
+
+ +
+
+ +
+ +
+ +
+
+
+ ) : ( + + )}
{access !== 'read' && ( - {formatBytes(item?.size || 0)} { Languages.t('scenes.app.drive.used')} + + {formatBytes(item?.size || 0)} {Languages.t('scenes.app.drive.used')} + )} onBuildContextMenu(details)}> {' '} @@ -218,12 +303,12 @@ export default memo( {documents.length === 0 && !loading && (
- {Languages.t('scenes.app.drive.nothing')} + + {Languages.t('scenes.app.drive.nothing')} + {!inTrash && access != 'read' && ( <> - - {Languages.t('scenes.app.drive.drag_and_drop')} - + {Languages.t('scenes.app.drive.drag_and_drop')}