From e00f9435dcac7f33349c2dac3e2043dfca57c1fb Mon Sep 17 00:00:00 2001 From: Alf Eaton Date: Fri, 20 Oct 2023 11:17:23 +0100 Subject: [PATCH] Avoid changing the view when selecting a folder (#15315) GitOrigin-RevId: 272c6f87507c65581041150905406f5c38e490d4 --- .../file-tree/components/file-tree-doc.jsx | 2 +- .../file-tree/components/file-tree-folder.jsx | 5 ++- .../contexts/file-tree-selectable.jsx | 35 +++++++++++++++++-- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/services/web/frontend/js/features/file-tree/components/file-tree-doc.jsx b/services/web/frontend/js/features/file-tree/components/file-tree-doc.jsx index 1c7bd54d53..da4e13ba9e 100644 --- a/services/web/frontend/js/features/file-tree/components/file-tree-doc.jsx +++ b/services/web/frontend/js/features/file-tree/components/file-tree-doc.jsx @@ -11,7 +11,7 @@ import classnames from 'classnames' function FileTreeDoc({ name, id, isFile, isLinkedFile }) { const { isSelected, props: selectableEntityProps } = useSelectableEntity( id, - isFile + isFile ? 'file' : 'doc' ) return ( diff --git a/services/web/frontend/js/features/file-tree/components/file-tree-folder.jsx b/services/web/frontend/js/features/file-tree/components/file-tree-folder.jsx index 0f319db6f8..e6d2d417c7 100644 --- a/services/web/frontend/js/features/file-tree/components/file-tree-folder.jsx +++ b/services/web/frontend/js/features/file-tree/components/file-tree-folder.jsx @@ -17,7 +17,10 @@ import usePersistedState from '../../../shared/hooks/use-persisted-state' function FileTreeFolder({ name, id, folders, docs, files }) { const { t } = useTranslation() - const { isSelected, props: selectableEntityProps } = useSelectableEntity(id) + const { isSelected, props: selectableEntityProps } = useSelectableEntity( + id, + 'folder' + ) const { selectedEntityParentIds } = useFileTreeSelectable(id) diff --git a/services/web/frontend/js/features/file-tree/contexts/file-tree-selectable.jsx b/services/web/frontend/js/features/file-tree/contexts/file-tree-selectable.jsx index b9a4b75a8d..e56715593f 100644 --- a/services/web/frontend/js/features/file-tree/contexts/file-tree-selectable.jsx +++ b/services/web/frontend/js/features/file-tree/contexts/file-tree-selectable.jsx @@ -210,9 +210,10 @@ const editorContextPropTypes = { const isMac = /Mac/.test(window.navigator?.platform) -export function useSelectableEntity(id, isFile) { +export function useSelectableEntity(id, type) { const { view, setView } = useLayoutContext() const { setContextMenuCoords } = useFileTreeMainContext() + const { fileTreeData } = useFileTreeData() const { selectedEntityIds, selectOrMultiSelectEntity, @@ -222,6 +223,26 @@ export function useSelectableEntity(id, isFile) { const isSelected = selectedEntityIds.has(id) + const chooseView = useCallback(() => { + for (const id of selectedEntityIds) { + const selectedEntity = findInTree(fileTreeData, id) + + if (selectedEntity.type === 'doc') { + return 'editor' + } + + if (selectedEntity.type === 'fileRef') { + return 'file' + } + + if (selectedEntity.type === 'folder') { + return view + } + } + + return null + }, [fileTreeData, selectedEntityIds, view]) + const handleEvent = useCallback( ev => { ev.stopPropagation() @@ -231,7 +252,14 @@ export function useSelectableEntity(id, isFile) { !isRootFolderSelected && (isMac ? ev.metaKey : ev.ctrlKey) setIsRootFolderSelected(false) selectOrMultiSelectEntity(id, multiSelect) - setView(isFile ? 'file' : 'editor') + + if (type === 'file') { + setView('file') + } else if (type === 'doc') { + setView('editor') + } else if (type === 'folder') { + setView(chooseView()) + } }, [ id, @@ -239,7 +267,8 @@ export function useSelectableEntity(id, isFile) { setIsRootFolderSelected, selectOrMultiSelectEntity, setView, - isFile, + type, + chooseView, ] )