From 13b4d6d2bd6b8eb60758255756f4c3e92fcd2fb8 Mon Sep 17 00:00:00 2001 From: EnixCoda Date: Sun, 24 Apr 2022 21:34:22 +0800 Subject: [PATCH] fix: recursive toggle folders was blocked --- src/components/Node.tsx | 1 + src/driver/core/FileExplorer.ts | 53 ++++++++++++++++++++------------- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/components/Node.tsx b/src/components/Node.tsx index 1b8b2b0..77117a4 100644 --- a/src/components/Node.tsx +++ b/src/components/Node.tsx @@ -46,6 +46,7 @@ export function Node({ className={cx(`node-item`, { focused, disabled: node.accessDenied, expanded, compact })} style={{ ...style, paddingLeft: `${10 + (compact ? 10 : 20) * depth}px` }} title={node.path} + target={node.type === 'commit' ? '_blank' : undefined} {...platform.delegatePJAXProps?.({ node })} >
diff --git a/src/driver/core/FileExplorer.ts b/src/driver/core/FileExplorer.ts index 8ca0de9..00e075e 100644 --- a/src/driver/core/FileExplorer.ts +++ b/src/driver/core/FileExplorer.ts @@ -295,29 +295,40 @@ export const focusNode: BoundMethodCreator<[TreeNode | null]> = export const onNodeClick: BoundMethodCreator< [React.MouseEvent, TreeNode] > = dispatch => (event, node) => { - if (isOpenInNewWindowClick(event)) return + switch (node.type) { + case 'tree': { + const { + props: { + config: { recursiveToggleFolder }, + }, + } = dispatch.get() + const recursive = + (recursiveToggleFolder === 'shift' && event.shiftKey) || + (recursiveToggleFolder === 'alt' && event.altKey) + // recursive toggle action may conflict with browser default action + // e.g. shift + click is the default open in new tab action on macOS + // giving recursive toggle action higher priority than default action + if (!recursive && isOpenInNewWindowClick(event)) return - const preventDefault = !(node.type === 'blob' && node.url?.includes('#')) - if (preventDefault) event.preventDefault() - - if (node.type === 'tree') { - const { - props: { - config: { recursiveToggleFolder }, - }, - } = dispatch.get() - const recursive = - (recursiveToggleFolder === 'shift' && event.shiftKey) || - (recursiveToggleFolder === 'alt' && event.altKey) - dispatch.call(toggleNodeExpansion, node, { recursive }) - } else if (node.type === 'blob') { - dispatch.call(focusNode, node) - if (node.url && !node.url.includes('#')) { - loadWithPJAX(node.url, event.currentTarget) + event.preventDefault() + dispatch.call(toggleNodeExpansion, node, { recursive }) + break } - } else if (node.type === 'commit') { - if (node.url) { - window.open(node.url, '_blank') + case 'blob': { + if (isOpenInNewWindowClick(event)) return + + dispatch.call(focusNode, node) + if (node.url) { + const isHashLink = node.url.includes('#') + if (!isHashLink) { + event.preventDefault() + loadWithPJAX(node.url, event.currentTarget) + } + } + break + } + case 'commit': { + // pass event, open in new tab thanks to the target="_blank" on the anchor element } } }