🍄 Separate trash for the personal and shared drive (#189)
This commit is contained in:
@@ -83,6 +83,13 @@ export class DriveApiClient {
|
||||
);
|
||||
}
|
||||
|
||||
static async restore(companyId: string, id: string | 'trash' | '') {
|
||||
return await Api.post<any, any>(
|
||||
`/internal/services/documents/v1/companies/${companyId}/item/${id}/restore${appendTdriveToken()}`,
|
||||
{}
|
||||
);
|
||||
}
|
||||
|
||||
static async update(companyId: string, id: string, update: Partial<DriveItem>) {
|
||||
return await Api.post<Partial<DriveItem>, DriveItem>(
|
||||
`/internal/services/documents/v1/companies/${companyId}/item/${id}${appendTdriveToken()}`,
|
||||
|
||||
@@ -96,6 +96,18 @@ export const useDriveActions = () => {
|
||||
[refresh],
|
||||
);
|
||||
|
||||
const restore = useCallback(
|
||||
async (id: string, parentId: string) => {
|
||||
try {
|
||||
await DriveApiClient.restore(companyId, id);
|
||||
await refresh(parentId || '');
|
||||
} catch (e) {
|
||||
ToasterService.error(Languages.t('hooks.use-drive-actions.unable_restore_file'));
|
||||
}
|
||||
},
|
||||
[refresh],
|
||||
);
|
||||
|
||||
const update = useCallback(
|
||||
async (update: Partial<DriveItem>, id: string, parentId: string) => {
|
||||
try {
|
||||
@@ -127,5 +139,5 @@ export const useDriveActions = () => {
|
||||
[refresh],
|
||||
);
|
||||
|
||||
return { create, refresh, download, downloadZip, remove, update, updateLevel };
|
||||
return { create, refresh, download, downloadZip, remove, restore, update, updateLevel };
|
||||
};
|
||||
|
||||
@@ -19,7 +19,7 @@ export const useDriveItem = (id: string) => {
|
||||
const item = useRecoilValue(DriveItemAtom(id));
|
||||
const children = useRecoilValue(DriveItemChildrenAtom(id));
|
||||
const [loading, setLoading] = useRecoilState(LoadingStateInitTrue('useDriveItem-' + id));
|
||||
const { refresh: refreshItem, create, update: _update, updateLevel: _updateLevel, remove: _remove } = useDriveActions();
|
||||
const { refresh: refreshItem, create, update: _update, updateLevel: _updateLevel, remove: _remove, restore: _restore } = useDriveActions();
|
||||
const { uploadVersion: _uploadVersion } = useDriveUpload();
|
||||
|
||||
const refresh = useCallback(
|
||||
@@ -44,6 +44,16 @@ export const useDriveItem = (id: string) => {
|
||||
setLoading(false);
|
||||
}, [id, setLoading, refresh, item?.item?.parent_id]);
|
||||
|
||||
const restore = useCallback(async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
await _restore(id, item?.item?.parent_id || '');
|
||||
} catch (e) {
|
||||
ToasterService.error('Unable to restore this item.');
|
||||
}
|
||||
setLoading(false);
|
||||
}, [id, setLoading, refresh, item?.item?.parent_id]);
|
||||
|
||||
const update = useCallback(
|
||||
async (update: Partial<DriveItem>) => {
|
||||
setLoading(true);
|
||||
@@ -83,7 +93,7 @@ export const useDriveItem = (id: string) => {
|
||||
[companyId, id, setLoading, refresh, item?.item?.parent_id],
|
||||
);
|
||||
|
||||
const inTrash = id === 'trash' || item?.path?.some(i => i.parent_id === 'trash');
|
||||
const inTrash = id.includes('trash') || item?.path?.some(i => i?.parent_id?.includes('trash')) || item?.item?.is_in_trash;
|
||||
const sharedWithMe = id =="shared_with_me";
|
||||
|
||||
return {
|
||||
|
||||
@@ -31,7 +31,6 @@ export const useDrivePreviewModal = () => {
|
||||
|
||||
const close = () => {
|
||||
setStatus({ item: null, loading: true });
|
||||
history.push(RouterServices.generateRouteFromState({companyId: company, itemId: ""}));
|
||||
}
|
||||
|
||||
return { open, close, isOpen: !!status.item };
|
||||
|
||||
@@ -21,7 +21,7 @@ export type DriveItem = {
|
||||
workspace_id: string;
|
||||
|
||||
parent_id: string;
|
||||
in_trash: boolean;
|
||||
is_in_trash: boolean;
|
||||
is_directory: boolean;
|
||||
name: string;
|
||||
extension: string;
|
||||
@@ -35,6 +35,7 @@ export type DriveItem = {
|
||||
access_info: DriveItemAccessInfo;
|
||||
|
||||
size: number;
|
||||
scope: string;
|
||||
};
|
||||
|
||||
export type DriveFileAccessLevel = 'none' | 'read' | 'write' | 'manage';
|
||||
|
||||
@@ -27,6 +27,7 @@ export type ClientStateType = {
|
||||
companyId?: string;
|
||||
viewId?: string;
|
||||
itemId?: string;
|
||||
dirId?: string;
|
||||
workspaceId?: string;
|
||||
channelId?: string;
|
||||
messageId?: string;
|
||||
@@ -52,6 +53,7 @@ class RouterServices extends Observable {
|
||||
'/client/:companyId/v/:viewId',
|
||||
'/client/:companyId/preview/:itemId',
|
||||
'/client/:companyId/v/:viewId/preview/:itemId',
|
||||
'/client/:companyId/v/:viewId/d/:dirId',
|
||||
'/client/:companyId/w/:workspaceId',
|
||||
'/client/:companyId/w/:workspaceId/c/:channelId',
|
||||
'/client/:companyId/w/:workspaceId/c/:channelId/t/:threadId',
|
||||
@@ -185,6 +187,7 @@ class RouterServices extends Observable {
|
||||
companyId: match?.params?.companyId || '',
|
||||
viewId: match?.params?.viewId || '',
|
||||
itemId: match?.params?.itemId || '',
|
||||
dirId: match?.params?.dirId || '',
|
||||
workspaceId: match?.params?.workspaceId || '',
|
||||
channelId: match?.params?.channelId || '',
|
||||
messageId: match?.params?.messageId || '',
|
||||
@@ -291,6 +294,7 @@ class RouterServices extends Observable {
|
||||
(state.companyId ? `/${state.companyId}` : '') +
|
||||
(state.viewId ? `/v/${state.viewId}` : '') +
|
||||
(state.itemId ? `/preview/${state.itemId}` : '') +
|
||||
(state.dirId ? `/d/${state.dirId}` : '') +
|
||||
(state.sharedWithMe ? `/shared-with-me` : '') +
|
||||
(state.workspaceId ? `/w/${state.workspaceId}` : '') +
|
||||
(state.channelId ? `/c/${state.channelId}` : '') +
|
||||
|
||||
@@ -16,6 +16,11 @@ export const RoutePreviewSelector = selector<string>({
|
||||
get: ({ get }) => get(RouterState)?.itemId || '',
|
||||
});
|
||||
|
||||
export const RouteDirectorySelector = selector<string>({
|
||||
key: 'RouterDirectorySelector',
|
||||
get: ({ get }) => get(RouterState)?.dirId || '',
|
||||
});
|
||||
|
||||
export const RouterWorkspaceSelector = selector<string>({
|
||||
key: 'RouterWorkspaceSelector',
|
||||
get: ({ get }) => get(RouterState)?.workspaceId || '',
|
||||
|
||||
@@ -113,13 +113,6 @@ export default memo(
|
||||
[_setParentId],
|
||||
);
|
||||
|
||||
|
||||
|
||||
//In case we are kicked out of the current folder, we need to reset the parent id
|
||||
useEffect(() => {
|
||||
if (!loading && !path?.length && !inPublicSharing && !sharedWithMe) setParentId('user_'+user?.id);
|
||||
}, [path, loading, setParentId]);
|
||||
|
||||
useEffect(() => {
|
||||
setChecked({});
|
||||
refresh(parentId);
|
||||
|
||||
@@ -19,6 +19,7 @@ import { ToasterService } from '@features/global/services/toaster-service';
|
||||
import { copyToClipboard } from '@features/global/utils/CopyClipboard';
|
||||
import { SharedWithMeFilterState } from '@features/drive/state/shared-with-me-filter';
|
||||
import { getCurrentUserList } from '@features/users/hooks/use-user-list';
|
||||
import useRouteState from 'app/features/router/hooks/use-route-state';
|
||||
import RouterServices from '@features/router/services/router-service';
|
||||
import useRouterCompany from '@features/router/hooks/use-router-company';
|
||||
import _ from 'lodash';
|
||||
@@ -35,7 +36,7 @@ export const useOnBuildContextMenu = (children: DriveItem[], initialParentId?: s
|
||||
DriveCurrentFolderAtom({ initialFolderId: initialParentId || 'root' }),
|
||||
);
|
||||
|
||||
const { download, downloadZip, update } = useDriveActions();
|
||||
const { download, downloadZip, update, restore } = useDriveActions();
|
||||
const setCreationModalState = useSetRecoilState(CreateModalAtom);
|
||||
const setSelectorModalState = useSetRecoilState(SelectorModalAtom);
|
||||
const setConfirmDeleteModalState = useSetRecoilState(ConfirmDeleteModalAtom);
|
||||
@@ -45,6 +46,7 @@ export const useOnBuildContextMenu = (children: DriveItem[], initialParentId?: s
|
||||
const setPropertiesModalState = useSetRecoilState(PropertiesModalAtom);
|
||||
const setUsersModalState = useSetRecoilState(UsersModalAtom);
|
||||
const { open: preview } = useDrivePreview();
|
||||
const { viewId } = useRouteState();
|
||||
const company = useRouterCompany();
|
||||
|
||||
function getIdsFromArray(arr: DriveItem[]): string[] {
|
||||
@@ -56,7 +58,8 @@ export const useOnBuildContextMenu = (children: DriveItem[], initialParentId?: s
|
||||
if (!parent || !parent.access) return [];
|
||||
|
||||
try {
|
||||
const inTrash = parent.path?.[0]?.id === 'trash';
|
||||
const inTrash = parent.path?.[0]?.id.includes('trash') || viewId?.includes("trash");
|
||||
const isPersonal = item?.scope === 'personal';
|
||||
const selectedCount = checked.length;
|
||||
|
||||
let menu: any[] = [];
|
||||
@@ -75,7 +78,7 @@ export const useOnBuildContextMenu = (children: DriveItem[], initialParentId?: s
|
||||
{
|
||||
type: 'menu',
|
||||
text: Languages.t('components.item_context_menu.share'),
|
||||
hide: access === 'read' || getPublicLinkToken(),
|
||||
hide: access === 'read' || getPublicLinkToken() || inTrash,
|
||||
onClick: () => setAccessModalState({ open: true, id: item.id }),
|
||||
},
|
||||
{
|
||||
@@ -106,13 +109,13 @@ export const useOnBuildContextMenu = (children: DriveItem[], initialParentId?: s
|
||||
{
|
||||
type: 'menu',
|
||||
text: Languages.t('components.item_context_menu.manage_access'),
|
||||
hide: access === 'read' || getPublicLinkToken(),
|
||||
hide: access === 'read' || getPublicLinkToken() || inTrash,
|
||||
onClick: () => setAccessModalState({ open: true, id: item.id }),
|
||||
},
|
||||
{
|
||||
type: 'menu',
|
||||
text: Languages.t('components.item_context_menu.move'),
|
||||
hide: access === 'read',
|
||||
hide: access === 'read' || inTrash,
|
||||
onClick: () =>
|
||||
setSelectorModalState({
|
||||
open: true,
|
||||
@@ -135,13 +138,13 @@ export const useOnBuildContextMenu = (children: DriveItem[], initialParentId?: s
|
||||
{
|
||||
type: 'menu',
|
||||
text: Languages.t('components.item_context_menu.rename'),
|
||||
hide: access === 'read',
|
||||
hide: access === 'read' || inTrash,
|
||||
onClick: () => setPropertiesModalState({ open: true, id: item.id }),
|
||||
},
|
||||
{
|
||||
type: 'menu',
|
||||
text: Languages.t('components.item_context_menu.copy_link'),
|
||||
hide: !item.access_info.public?.level || item.access_info.public?.level === 'none',
|
||||
hide: !item.access_info.public?.level || item.access_info.public?.level === 'none' || inTrash,
|
||||
onClick: () => {
|
||||
copyToClipboard(getPublicLink(item || parent?.item));
|
||||
ToasterService.success(
|
||||
@@ -152,10 +155,10 @@ export const useOnBuildContextMenu = (children: DriveItem[], initialParentId?: s
|
||||
{
|
||||
type: 'menu',
|
||||
text: Languages.t('components.item_context_menu.versions'),
|
||||
hide: item.is_directory,
|
||||
hide: item.is_directory || inTrash,
|
||||
onClick: () => setVersionModal({ open: true, id: item.id }),
|
||||
},
|
||||
{ type: 'separator', hide: access !== 'manage' },
|
||||
{ type: 'separator', hide: access !== 'manage' || inTrash, },
|
||||
{
|
||||
type: 'menu',
|
||||
text: Languages.t('components.item_context_menu.move_to_trash'),
|
||||
@@ -163,6 +166,16 @@ export const useOnBuildContextMenu = (children: DriveItem[], initialParentId?: s
|
||||
hide: inTrash || access !== 'manage',
|
||||
onClick: () => setConfirmTrashModalState({ open: true, items: [item] }),
|
||||
},
|
||||
{
|
||||
type: 'menu',
|
||||
text: Languages.t('components.item_context_menu.restore'),
|
||||
className: 'error',
|
||||
hide: !inTrash || (access !== 'manage' && !isPersonal),
|
||||
onClick: () => {
|
||||
const parentId = item.is_in_trash ? viewId || '' : item.parent_id;
|
||||
restore(item.id, parentId);
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'menu',
|
||||
text: Languages.t('components.item_context_menu.delete'),
|
||||
@@ -257,7 +270,7 @@ export const useOnBuildContextMenu = (children: DriveItem[], initialParentId?: s
|
||||
type: 'menu',
|
||||
text: Languages.t('components.item_context_menu.trash.empty'),
|
||||
className: 'error',
|
||||
hide: parent.item!.id != 'trash' || parent.access !== 'manage',
|
||||
hide: !inTrash,
|
||||
onClick: () => {
|
||||
setConfirmDeleteModalState({
|
||||
open: true,
|
||||
|
||||
@@ -57,7 +57,7 @@ export const DocumentRow = ({
|
||||
const device = getDevice();
|
||||
console.log("DEVICE:: " + device);
|
||||
if (device != "ios" && device != "android") {
|
||||
history.push(RouterServices.generateRouteFromState({companyId: company, itemId: item.id}));
|
||||
history.push(RouterServices.generateRouteFromState({companyId: company, itemId: item.id, dirId: ''}));
|
||||
open(item);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -5,7 +5,11 @@ import { useEffect, useState } from 'react';
|
||||
import { PublicIcon } from './components/public-icon';
|
||||
import MenusManager from '@components/menus/menus-manager.jsx';
|
||||
import { useCurrentUser } from 'app/features/users/hooks/use-current-user';
|
||||
import Languages from "features/global/services/languages-service";
|
||||
import { useDriveItem } from '@features/drive/hooks/use-drive-item';
|
||||
import Languages from 'features/global/services/languages-service';
|
||||
import { useHistory } from 'react-router-dom';
|
||||
import useRouterCompany from '@features/router/hooks/use-router-company';
|
||||
import RouterServices from '@features/router/services/router-service';
|
||||
|
||||
export default ({
|
||||
path: livePath,
|
||||
@@ -17,18 +21,36 @@ export default ({
|
||||
setParentId: (id: string) => void;
|
||||
}) => {
|
||||
const [savedPath, setSavedPath] = useState<DriveItem[]>([]);
|
||||
const { user } = useCurrentUser();
|
||||
const history = useHistory();
|
||||
const company = useRouterCompany();
|
||||
useEffect(() => {
|
||||
if (livePath) setSavedPath(livePath);
|
||||
}, [livePath]);
|
||||
const path = livePath || savedPath;
|
||||
|
||||
return <PathRender inTrash={inTrash || false} path={path} onClick={id => setParentId(id)} />;
|
||||
return (
|
||||
<PathRender
|
||||
inTrash={inTrash || false}
|
||||
path={path}
|
||||
onClick={(viewId, dirId) => {
|
||||
history.push(
|
||||
RouterServices.generateRouteFromState({
|
||||
companyId: company,
|
||||
viewId,
|
||||
dirId
|
||||
}),
|
||||
);
|
||||
setParentId(dirId? dirId: viewId)
|
||||
}}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
function cutFileName (name: any){
|
||||
if (typeof name !== "undefined" ){
|
||||
if (name.length >= 30){
|
||||
return name.substring(0,30)+" ...";
|
||||
function cutFileName(name: any) {
|
||||
if (typeof name !== 'undefined') {
|
||||
if (name.length >= 30) {
|
||||
return name.substring(0, 30) + ' ...';
|
||||
} else {
|
||||
return name;
|
||||
}
|
||||
@@ -43,7 +65,7 @@ export const PathRender = ({
|
||||
}: {
|
||||
path: DriveItem[];
|
||||
inTrash: boolean;
|
||||
onClick: (id: string) => void;
|
||||
onClick: (viewId: string, dirId: string) => void;
|
||||
}) => {
|
||||
const pathLength = (path || []).reduce((acc, curr) => acc + curr.name.length, 0);
|
||||
|
||||
@@ -100,30 +122,61 @@ const PathItem = ({
|
||||
item: Partial<DriveItem>;
|
||||
last?: boolean;
|
||||
first?: boolean;
|
||||
onClick: (id: string) => void;
|
||||
onClick: (viewId: string, dirId: string) => void;
|
||||
}) => {
|
||||
const { user } = useCurrentUser();
|
||||
const { viewId } = RouterServices.getStateFromRoute();
|
||||
const { access: trashAccess } = useDriveItem('trash');
|
||||
return (
|
||||
<div className="flex items-center">
|
||||
<a
|
||||
href="#"
|
||||
className="text-sm font-medium text-gray-700 hover:text-blue-600 dark:text-gray-400 dark:hover:text-white"
|
||||
onClick={evt => {
|
||||
if (first && user?.id) {
|
||||
MenusManager.openMenu(
|
||||
[
|
||||
{ type: 'menu', text: Languages.t('components.side_menu.home'), onClick: () => onClick('root') },
|
||||
{ type: 'menu', text: Languages.t('components.side_menu.my_drive'), onClick: () => onClick('user_' + user?.id) },
|
||||
],
|
||||
{ x: evt.clientX, y: evt.clientY },
|
||||
'center',
|
||||
);
|
||||
const driveMenuItems = [
|
||||
{
|
||||
type: 'menu',
|
||||
text: Languages.t('components.side_menu.home',),
|
||||
onClick: () => onClick('root', ''),
|
||||
},
|
||||
{
|
||||
type: 'menu',
|
||||
text: Languages.t('components.side_menu.my_drive'),
|
||||
onClick: () => onClick('user_' + user?.id, ''),
|
||||
},
|
||||
];
|
||||
|
||||
const trashMenuItems = [
|
||||
{
|
||||
type: 'menu',
|
||||
text: Languages.t('components.header_path.my_trash'),
|
||||
onClick: () => onClick('trash_' + user?.id, ''),
|
||||
},
|
||||
{
|
||||
type: 'menu',
|
||||
text: Languages.t('components.header_path.shared_trash'),
|
||||
onClick: () => onClick('trash', ''),
|
||||
hide: trashAccess === 'read',
|
||||
},
|
||||
];
|
||||
|
||||
if (first && user?.id) {
|
||||
if (viewId?.includes('trash')) {
|
||||
MenusManager.openMenu(trashMenuItems, { x: evt.clientX, y: evt.clientY }, 'center');
|
||||
} else {
|
||||
MenusManager.openMenu(driveMenuItems, { x: evt.clientX, y: evt.clientY }, 'center');
|
||||
}
|
||||
} else {
|
||||
onClick(item?.id || '');
|
||||
onClick(viewId || '',item?.id || '');
|
||||
}
|
||||
}}
|
||||
>
|
||||
<Title>{cutFileName(item?.name) || ''}</Title>
|
||||
<Title>
|
||||
{viewId?.includes('trash_') && first && Languages.t('components.header_path.my_trash')}
|
||||
{viewId === 'trash' && first && Languages.t('components.header_path.shared_trash')}
|
||||
{(viewId === 'trash' || viewId?.includes('trash_')) && !first && (cutFileName(item?.name) || '')}
|
||||
{!viewId?.includes('trash') && (cutFileName(item?.name) || '')}
|
||||
</Title>
|
||||
</a>
|
||||
{item?.access_info?.public?.level && item?.access_info?.public?.level !== 'none' && (
|
||||
<PublicIcon className="h-5 w-5 ml-2" />
|
||||
|
||||
@@ -7,6 +7,7 @@ import { DriveItemSelectedList } from '@features/drive/state/store';
|
||||
import { DriveItem } from '@features/drive/types';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { atom, useRecoilState } from 'recoil';
|
||||
import RouterServices from '@features/router/services/router-service';
|
||||
|
||||
export type ConfirmDeleteModalType = {
|
||||
open: boolean;
|
||||
@@ -40,6 +41,7 @@ const ConfirmDeleteModalContent = ({ items }: { items: DriveItem[] }) => {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [state, setState] = useRecoilState(ConfirmDeleteModalAtom);
|
||||
const [, setSelected] = useRecoilState(DriveItemSelectedList);
|
||||
const { viewId } = RouterServices.getStateFromRoute();
|
||||
|
||||
useEffect(() => {
|
||||
refresh(items[0].id);
|
||||
@@ -64,7 +66,7 @@ const ConfirmDeleteModalContent = ({ items }: { items: DriveItem[] }) => {
|
||||
onClick={async () => {
|
||||
setLoading(true);
|
||||
for (const item of items) {
|
||||
await remove(item.id, item.parent_id);
|
||||
await remove(item.id, viewId || "");
|
||||
}
|
||||
setLoading(false);
|
||||
setSelected({});
|
||||
|
||||
+2
-14
@@ -111,9 +111,9 @@ const PublicLinkOptions = (props: {
|
||||
};
|
||||
|
||||
|
||||
/* useEffect(() => {
|
||||
useEffect(() => {
|
||||
props.onChangePassword(usePassword ? password : '');
|
||||
}, [usePassword, password]); */
|
||||
}, [usePassword, password]);
|
||||
|
||||
useEffect(() => {
|
||||
props.onChangeExpiration(useExpiration ? expiration : 0);
|
||||
@@ -144,18 +144,6 @@ const PublicLinkOptions = (props: {
|
||||
className="max-w-xs"
|
||||
value={password}
|
||||
onChange={e => setPassword(e.target.value)}
|
||||
onBlur={handlePasswordBlur}
|
||||
// changes password only when press enter
|
||||
onKeyPress={e => {
|
||||
if (e.key === 'Enter') {
|
||||
props.onChangePassword(password);
|
||||
e.preventDefault();
|
||||
if (password) {
|
||||
copyToClipboard(password);
|
||||
ToasterService.success(Languages.t('components.public-link-security_password_copied'));
|
||||
}
|
||||
}
|
||||
}}
|
||||
// saves and copies password
|
||||
onClick={() => {
|
||||
if (password) copyToClipboard(password);
|
||||
|
||||
@@ -13,6 +13,7 @@ import { CreateModal, CreateModalAtom } from '../body/drive/modals/create';
|
||||
import { Button } from '@atoms/button/button';
|
||||
import Languages from "features/global/services/languages-service";
|
||||
import { useCurrentUser } from 'app/features/users/hooks/use-current-user';
|
||||
import RouterServices from '@features/router/services/router-service';
|
||||
|
||||
export const CreateModalWithUploadZones = ({ initialParentId }: { initialParentId?: string }) => {
|
||||
const companyId = useRouterCompany();
|
||||
@@ -25,8 +26,6 @@ export const CreateModalWithUploadZones = ({ initialParentId }: { initialParentI
|
||||
DriveCurrentFolderAtom({ initialFolderId: initialParentId || 'user_'+user?.id }),
|
||||
);
|
||||
|
||||
console.log("Upload Zone:: " + parentId);
|
||||
|
||||
return (
|
||||
<>
|
||||
<UploadZone
|
||||
@@ -81,12 +80,14 @@ export const CreateModalWithUploadZones = ({ initialParentId }: { initialParentI
|
||||
|
||||
export default () => {
|
||||
const { user } = useCurrentUser();
|
||||
const { viewId } = RouterServices.getStateFromRoute();
|
||||
const [parentId, _] = useRecoilState(DriveCurrentFolderAtom({ initialFolderId: 'user_'+user?.id }));
|
||||
const { access, item, inTrash } = useDriveItem(parentId);
|
||||
const { children: trashChildren } = useDriveItem('trash');
|
||||
const { access, item } = useDriveItem(parentId);
|
||||
const { children: trashChildren } = useDriveItem(viewId === 'trash' ? 'trash' : 'trash_'+user?.id);
|
||||
const uploadZoneRef = useRef<UploadZone | null>(null);
|
||||
const { uploadTree } = useDriveUpload();
|
||||
const companyId = useRouterCompany();
|
||||
const inTrash = viewId?.includes("trash") || false;
|
||||
|
||||
const setConfirmDeleteModalState = useSetRecoilState(ConfirmDeleteModalAtom);
|
||||
const setCreationModalState = useSetRecoilState(CreateModalAtom);
|
||||
@@ -101,7 +102,7 @@ export default () => {
|
||||
<div className="p-4">
|
||||
<CreateModalWithUploadZones initialParentId={parentId} />
|
||||
|
||||
{inTrash && access === 'manage' && (
|
||||
{inTrash && (
|
||||
<>
|
||||
<Button
|
||||
onClick={() =>
|
||||
@@ -113,6 +114,7 @@ export default () => {
|
||||
size="lg"
|
||||
theme="danger"
|
||||
className="w-full mb-2 justify-center"
|
||||
disabled={!(trashChildren.length > 0)}
|
||||
>
|
||||
<TruckIcon className="w-5 h-5 mr-2" /> { Languages.t('components.side_menu.buttons.empty_trash') }
|
||||
</Button>
|
||||
|
||||
@@ -11,7 +11,6 @@ import {
|
||||
} from '@heroicons/react/outline';
|
||||
import { useEffect } from 'react';
|
||||
import useRouterCompany from '@features/router/hooks/use-router-company';
|
||||
import useRouterWorkspace from '@features/router/hooks/use-router-workspace';
|
||||
import { useCurrentUser } from 'app/features/users/hooks/use-current-user';
|
||||
import { useRecoilState } from 'recoil';
|
||||
import { Title } from '../../../atoms/text';
|
||||
@@ -21,17 +20,15 @@ import Account from '../common/account';
|
||||
import AppGrid from '../common/app-grid';
|
||||
import DiskUsage from '../common/disk-usage';
|
||||
import Actions from './actions';
|
||||
import { useHistory, useLocation } from 'react-router-dom';
|
||||
import { useHistory } from 'react-router-dom';
|
||||
import RouterServices from '@features/router/services/router-service';
|
||||
import Languages from "features/global/services/languages-service";
|
||||
|
||||
export default () => {
|
||||
const history = useHistory();
|
||||
const { user } = useCurrentUser();
|
||||
const location = useLocation();
|
||||
const company = useRouterCompany();
|
||||
const workspace = useRouterWorkspace();
|
||||
const { viewId, itemId } = RouterServices.getStateFromRoute();
|
||||
const { viewId, itemId, dirId } = RouterServices.getStateFromRoute();
|
||||
const [parentId, setParentId] = useRecoilState(
|
||||
DriveCurrentFolderAtom({ initialFolderId: viewId || 'user_'+user?.id }),
|
||||
);
|
||||
@@ -46,7 +43,8 @@ export default () => {
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
!itemId && viewId && setParentId(viewId);
|
||||
!itemId && !dirId && viewId && setParentId(viewId);
|
||||
dirId && viewId && setParentId(dirId);
|
||||
}, [viewId, itemId]);
|
||||
return (
|
||||
<div className="grow flex flex-col overflow-auto -m-4 p-4 relative">
|
||||
@@ -68,15 +66,15 @@ export default () => {
|
||||
<div className="mt-4" />
|
||||
<Title>Drive</Title>
|
||||
<Button
|
||||
onClick={() => {history.push(RouterServices.generateRouteFromState({companyId: company, viewId: 'user_' + user?.id})); setParentId('user_' + user?.id)}}
|
||||
onClick={() => {history.push(RouterServices.generateRouteFromState({companyId: company, viewId: 'user_' + user?.id, itemId: '', dirId: ''})); setParentId('user_' + user?.id)}}
|
||||
size="lg"
|
||||
theme="white"
|
||||
className={'w-full mb-1 ' + (folderType === 'personal' && (viewId == '' || 'user_' + user?.id) ? activeClass : '')}
|
||||
className={'w-full mb-1 ' + (folderType === 'personal' && (viewId == '' || viewId == 'user_' + user?.id) ? activeClass : '')}
|
||||
>
|
||||
<UserIcon className="w-5 h-5 mr-4" /> {Languages.t('components.side_menu.my_drive')}
|
||||
</Button>
|
||||
<Button
|
||||
onClick={() => {history.push(RouterServices.generateRouteFromState({companyId: company, viewId: "root"})); setParentId('root')}}
|
||||
onClick={() => {history.push(RouterServices.generateRouteFromState({companyId: company, viewId: "root", itemId: '', dirId: ''})); setParentId('root')}}
|
||||
size="lg"
|
||||
theme="white"
|
||||
className={'w-full mb-1 ' + (folderType === 'home' && viewId == 'root' ? activeClass : '')}
|
||||
@@ -84,7 +82,7 @@ export default () => {
|
||||
<CloudIcon className="w-5 h-5 mr-4" /> {Languages.t('components.side_menu.home')}
|
||||
</Button>
|
||||
<Button
|
||||
onClick={() => {history.push(RouterServices.generateRouteFromState({companyId: company, viewId: "shared_with_me"})); setParentId('shared_with_me')}}
|
||||
onClick={() => {history.push(RouterServices.generateRouteFromState({companyId: company, viewId: "shared_with_me", itemId: '', dirId: ''})); setParentId('shared_with_me')}}
|
||||
size="lg"
|
||||
theme="white"
|
||||
className={'w-full mb-1 ' + (folderType === 'shared' && viewId == 'shared_with_me'? activeClass : '')}
|
||||
@@ -109,16 +107,14 @@ export default () => {
|
||||
</Button>
|
||||
</>
|
||||
)}
|
||||
{rootAccess === 'manage' && (
|
||||
<Button
|
||||
onClick={() =>{history.push(RouterServices.generateRouteFromState({companyId: company, viewId: ""}));setParentId('trash')}}
|
||||
size="lg"
|
||||
theme="white"
|
||||
className={'w-full mb-1 ' + (folderType === 'trash' && viewId == ''? activeClass : '')}
|
||||
>
|
||||
<TrashIcon className="w-5 h-5 mr-4 text-rose-500" /> {Languages.t('components.side_menu.trash')}
|
||||
</Button>
|
||||
)}
|
||||
<Button
|
||||
onClick={() =>{history.push(RouterServices.generateRouteFromState({companyId: company, viewId: 'trash_'+user?.id, itemId: '', dirId: ''}));setParentId('trash_'+user?.id)}}
|
||||
size="lg"
|
||||
theme="white"
|
||||
className={'w-full mb-1 ' + (viewId?.includes("trash")? activeClass : '')}
|
||||
>
|
||||
<TrashIcon className="w-5 h-5 mr-4 text-rose-500" /> {Languages.t('components.side_menu.trash')}
|
||||
</Button>
|
||||
|
||||
{false && (
|
||||
<>
|
||||
|
||||
@@ -83,7 +83,7 @@ export const DrivePreview: React.FC<DrivePreviewProps> = ({ items }) => {
|
||||
if (device != 'ios' && device != 'android') {
|
||||
close();
|
||||
history.push(
|
||||
RouterServices.generateRouteFromState({ companyId: company, viewId: '', itemId: item.id }),
|
||||
RouterServices.generateRouteFromState({ companyId: company, viewId: '', itemId: item.id, dirId: '' }),
|
||||
);
|
||||
open(item);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user