From 51130ad35ce6700d63b3a06efb93d0f79687dea4 Mon Sep 17 00:00:00 2001 From: Vanessa Date: Sat, 29 Oct 2022 00:10:08 +0800 Subject: [PATCH] :sparkles: fix https://github.com/siyuan-note/siyuan/issues/4781 --- app/src/block/popover.ts | 115 +++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 54 deletions(-) diff --git a/app/src/block/popover.ts b/app/src/block/popover.ts index 28f23e19b..2128d71e8 100644 --- a/app/src/block/popover.ts +++ b/app/src/block/popover.ts @@ -37,11 +37,16 @@ export const initBlockPopover = () => { } if (window.siyuan.config.editor.floatWindowMode === 1) { + clearTimeout(timeoutHide); + timeoutHide = window.setTimeout(() => { + hidePopover(event) + }, 200); + if (!getTarget(event, aElement)) { - hidePopover(event); return; } if (window.siyuan.ctrlIsPressed) { + clearTimeout(timeoutHide); showPopover() } return; @@ -50,29 +55,7 @@ export const initBlockPopover = () => { clearTimeout(timeout); clearTimeout(timeoutHide); timeoutHide = window.setTimeout(() => { - if (hasClosestByClassName(event.target, "b3-menu") || - (event.target.id && event.target.tagName !== "svg" && (event.target.id.startsWith("minder_node") || event.target.id.startsWith("kity_") || event.target.id.startsWith("node_"))) - || event.target.classList.contains("counter") - || event.target.tagName === "circle" - ) { - // b3-menu 需要处理,(( 后的 hint 上的图表移上去需显示预览 - // gutter & mindmap & 文件树上的数字 & 关系图节点不处理 - return false; - } - popoverTargetElement = hasClosestByAttribute(event.target, "data-type", "block-ref") as HTMLElement || - hasClosestByAttribute(event.target, "data-type", "virtual-block-ref") as HTMLElement; - if (popoverTargetElement && popoverTargetElement.classList.contains("b3-tooltips")) { - popoverTargetElement = undefined; - } - if (!popoverTargetElement) { - popoverTargetElement = hasClosestByClassName(event.target, "popover__block") as HTMLElement; - } - const linkElement = hasClosestByAttribute(event.target, "data-type", "a", true); - if (!popoverTargetElement && linkElement && linkElement.getAttribute("data-href")?.startsWith("siyuan://blocks")) { - popoverTargetElement = linkElement; - } - if (!popoverTargetElement) { - hidePopover(event) + if (!hidePopover(event)) { return; } if (!popoverTargetElement && !aElement) { @@ -90,39 +73,62 @@ export const initBlockPopover = () => { }; const hidePopover = (event: MouseEvent & { target: HTMLElement }) => { - const blockElement = hasClosestByClassName(event.target, "block__popover", true); - const maxEditLevels: { [key: string]: number } = {oid: 0}; - window.siyuan.blockPanels.forEach((item) => { - if (item.targetElement && item.element.getAttribute("data-pin") === "true") { - const level = parseInt(item.element.getAttribute("data-level")); - const oid = item.element.getAttribute("data-oid"); - if (maxEditLevels[oid]) { - if (level > maxEditLevels[oid]) { - maxEditLevels[oid] = level; + if (hasClosestByClassName(event.target, "b3-menu") || + (event.target.id && event.target.tagName !== "svg" && (event.target.id.startsWith("minder_node") || event.target.id.startsWith("kity_") || event.target.id.startsWith("node_"))) + || event.target.classList.contains("counter") + || event.target.tagName === "circle" + ) { + // b3-menu 需要处理,(( 后的 hint 上的图表移上去需显示预览 + // gutter & mindmap & 文件树上的数字 & 关系图节点不处理 + return false; + } + popoverTargetElement = hasClosestByAttribute(event.target, "data-type", "block-ref") as HTMLElement || + hasClosestByAttribute(event.target, "data-type", "virtual-block-ref") as HTMLElement; + if (popoverTargetElement && popoverTargetElement.classList.contains("b3-tooltips")) { + popoverTargetElement = undefined; + } + if (!popoverTargetElement) { + popoverTargetElement = hasClosestByClassName(event.target, "popover__block") as HTMLElement; + } + const linkElement = hasClosestByAttribute(event.target, "data-type", "a", true); + if (!popoverTargetElement && linkElement && linkElement.getAttribute("data-href")?.startsWith("siyuan://blocks")) { + popoverTargetElement = linkElement; + } + if (!popoverTargetElement) { + const blockElement = hasClosestByClassName(event.target, "block__popover", true); + const maxEditLevels: { [key: string]: number } = {oid: 0}; + window.siyuan.blockPanels.forEach((item) => { + if (item.targetElement && item.element.getAttribute("data-pin") === "true") { + const level = parseInt(item.element.getAttribute("data-level")); + const oid = item.element.getAttribute("data-oid"); + if (maxEditLevels[oid]) { + if (level > maxEditLevels[oid]) { + maxEditLevels[oid] = level; + } + } else { + maxEditLevels[oid] = level; // 不能为1,否则 pin 住第三层,第二层会消失 } - } else { - maxEditLevels[oid] = level; // 不能为1,否则 pin 住第三层,第二层会消失 } - } - }); - if (blockElement) { - for (let i = 0; i < window.siyuan.blockPanels.length; i++) { - const item = window.siyuan.blockPanels[i]; - if (item.targetElement && - parseInt(item.element.getAttribute("data-level")) > (maxEditLevels[item.element.getAttribute("data-oid")] || 0) && - item.element.getAttribute("data-pin") === "false" && - parseInt(item.element.getAttribute("data-level")) > parseInt(blockElement.getAttribute("data-level"))) { - item.destroy(); - i--; + }); + if (blockElement) { + for (let i = 0; i < window.siyuan.blockPanels.length; i++) { + const item = window.siyuan.blockPanels[i]; + if (item.targetElement && + parseInt(item.element.getAttribute("data-level")) > (maxEditLevels[item.element.getAttribute("data-oid")] || 0) && + item.element.getAttribute("data-pin") === "false" && + parseInt(item.element.getAttribute("data-level")) > parseInt(blockElement.getAttribute("data-level"))) { + item.destroy(); + i--; + } } - } - } else { - for (let i = 0; i < window.siyuan.blockPanels.length; i++) { - const item = window.siyuan.blockPanels[i]; - if (item.targetElement && item.element.getAttribute("data-pin") === "false" && - parseInt(item.element.getAttribute("data-level")) > (maxEditLevels[item.element.getAttribute("data-oid")] || 0)) { - item.destroy(); - i--; + } else { + for (let i = 0; i < window.siyuan.blockPanels.length; i++) { + const item = window.siyuan.blockPanels[i]; + if (item.targetElement && item.element.getAttribute("data-pin") === "false" && + parseInt(item.element.getAttribute("data-level")) > (maxEditLevels[item.element.getAttribute("data-oid")] || 0)) { + item.destroy(); + i--; + } } } } @@ -222,4 +228,5 @@ export const showPopover = async () => { defIds, })); } + popoverTargetElement = undefined; }