From 3ec2ff243f746e30224753f914c82996e03dbee2 Mon Sep 17 00:00:00 2001 From: Vanessa Date: Sat, 24 Feb 2024 21:38:25 +0800 Subject: [PATCH] :art: fix https://github.com/siyuan-note/siyuan/issues/10397 --- app/src/block/Panel.ts | 4 +++- app/src/block/popover.ts | 31 +++++++++++++++++++-------- app/src/menus/protyle.ts | 17 +++++++++------ app/src/protyle/gutter/index.ts | 12 ++++++----- app/src/protyle/render/av/relation.ts | 10 +++++---- 5 files changed, 49 insertions(+), 25 deletions(-) diff --git a/app/src/block/Panel.ts b/app/src/block/Panel.ts index fc860b63d..9090e4672 100644 --- a/app/src/block/Panel.ts +++ b/app/src/block/Panel.ts @@ -211,11 +211,13 @@ export class BlockPanel { }); this.editors = []; } + const level = parseInt(this.element.dataset.level); this.element.remove(); this.element = undefined; this.targetElement = undefined; // 移除弹出上使用右键菜单 - if (window.siyuan.menus.menu.element.dataset.from !== "app") { + const menuLevel = parseInt(window.siyuan.menus.menu.element.dataset.from) + if (window.siyuan.menus.menu.element.dataset.from !== "app" && menuLevel && menuLevel >= level) { // https://github.com/siyuan-note/siyuan/issues/9854 右键菜单不是从浮窗中弹出的则不进行移除 window.siyuan.menus.menu.remove(); } diff --git a/app/src/block/popover.ts b/app/src/block/popover.ts index 424b3a256..310c04d51 100644 --- a/app/src/block/popover.ts +++ b/app/src/block/popover.ts @@ -1,5 +1,9 @@ import {BlockPanel} from "./Panel"; -import {hasClosestBlock, hasClosestByAttribute, hasClosestByClassName} from "../protyle/util/hasClosest"; +import { + hasClosestBlock, + hasClosestByAttribute, + hasClosestByClassName, +} from "../protyle/util/hasClosest"; import {fetchSyncPost} from "../util/fetch"; import {hideTooltip, showTooltip} from "../dialog/tooltip"; import {getIdFromSYProtocol} from "../util/pathName"; @@ -174,23 +178,32 @@ const hidePopover = (event: MouseEvent & { path: HTMLElement[] }) => { } } }); + const menuLevel = parseInt(window.siyuan.menus.menu.element.dataset.from); if (blockElement) { - for (let i = 0; i < window.siyuan.blockPanels.length; i++) { + for (let i = window.siyuan.blockPanels.length - 1; i >= 0; i--) { const item = window.siyuan.blockPanels[i]; + const itemLevel = parseInt(item.element.getAttribute("data-level")) if ((item.targetElement || typeof item.x === "number") && - parseInt(item.element.getAttribute("data-level")) > (maxEditLevels[item.element.getAttribute("data-oid")] || 0) && + itemLevel > (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--; + itemLevel > parseInt(blockElement.getAttribute("data-level"))) { + if (menuLevel && menuLevel >= itemLevel) { + // 有 gutter 菜单时不隐藏 + } else { + item.destroy(); + } } } } else { - for (let i = 0; i < window.siyuan.blockPanels.length; i++) { + for (let i = window.siyuan.blockPanels.length - 1; i >= 0; i--) { const item = window.siyuan.blockPanels[i]; + const itemLevel = parseInt(item.element.getAttribute("data-level")); if ((item.targetElement || typeof item.x === "number") && item.element.getAttribute("data-pin") === "false") { - item.destroy(); - i--; + if (menuLevel && menuLevel >= itemLevel) { + // 有 gutter 菜单时不隐藏 + } else { + item.destroy(); + } } } } diff --git a/app/src/menus/protyle.ts b/app/src/menus/protyle.ts index 9fcee3743..399f185f0 100644 --- a/app/src/menus/protyle.ts +++ b/app/src/menus/protyle.ts @@ -2,7 +2,7 @@ import { hasClosestBlock, hasClosestByAttribute, hasClosestByClassName, - hasClosestByMatchTag + hasClosestByMatchTag, hasTopClosestByClassName } from "../protyle/util/hasClosest"; import {MenuItem} from "./Menu"; import {focusBlock, focusByRange, focusByWbr, getEditorRange, selectAll,} from "../protyle/util/selection"; @@ -294,7 +294,8 @@ export const fileAnnotationRefMenu = (protyle: IProtyle, refElement: HTMLElement y: rect.top + 26, h: 26 }); - window.siyuan.menus.menu.element.setAttribute("data-from", hasClosestByClassName(protyle.element, "block__edit") ? "popover" : "app"); + const popoverElement = hasTopClosestByClassName(protyle.element, "block__popover", true); + window.siyuan.menus.menu.element.setAttribute("data-from", popoverElement ? popoverElement.dataset.level + "popover" : "app"); anchorElement.select(); window.siyuan.menus.menu.removeCB = () => { if (nodeElement.outerHTML !== oldHTML) { @@ -601,7 +602,8 @@ export const refMenu = (protyle: IProtyle, element: HTMLElement) => { y: rect.top + 26, h: 26 }); - window.siyuan.menus.menu.element.setAttribute("data-from", hasClosestByClassName(protyle.element, "block__edit") ? "popover" : "app"); + const popoverElement = hasTopClosestByClassName(protyle.element, "block__popover", true); + window.siyuan.menus.menu.element.setAttribute("data-from", popoverElement ? popoverElement.dataset.level + "popover" : "app"); if (!protyle.disabled) { window.siyuan.menus.menu.element.querySelector("input").select(); window.siyuan.menus.menu.removeCB = () => { @@ -1080,7 +1082,8 @@ export const imgMenu = (protyle: IProtyle, range: Range, assetElement: HTMLEleme } window.siyuan.menus.menu.popup({x: position.clientX, y: position.clientY}); - window.siyuan.menus.menu.element.setAttribute("data-from", hasClosestByClassName(protyle.element, "block__edit") ? "popover" : "app"); + const popoverElement = hasTopClosestByClassName(protyle.element, "block__popover", true); + window.siyuan.menus.menu.element.setAttribute("data-from", popoverElement ? popoverElement.dataset.level + "popover" : "app"); if (!protyle.disabled) { const textElements = window.siyuan.menus.menu.element.querySelectorAll("textarea"); textElements[0].focus(); @@ -1275,7 +1278,8 @@ export const linkMenu = (protyle: IProtyle, linkElement: HTMLElement, focusText y: rect.top + 26, h: 26 }); - window.siyuan.menus.menu.element.setAttribute("data-from", hasClosestByClassName(protyle.element, "block__edit") ? "popover" : "app"); + const popoverElement = hasTopClosestByClassName(protyle.element, "block__popover", true); + window.siyuan.menus.menu.element.setAttribute("data-from", popoverElement ? popoverElement.dataset.level + "popover" : "app"); if (focusText || protyle.lute.IsValidLinkDest(linkAddress)) { inputElements[1].select(); } else { @@ -1415,7 +1419,8 @@ export const tagMenu = (protyle: IProtyle, tagElement: HTMLElement) => { y: rect.top + 26, h: 26 }); - window.siyuan.menus.menu.element.setAttribute("data-from", hasClosestByClassName(protyle.element, "block__edit") ? "popover" : "app"); + const popoverElement = hasTopClosestByClassName(protyle.element, "block__popover", true); + window.siyuan.menus.menu.element.setAttribute("data-from", popoverElement ? popoverElement.dataset.level + "popover" : "app"); window.siyuan.menus.menu.element.querySelector("input").select(); }; diff --git a/app/src/protyle/gutter/index.ts b/app/src/protyle/gutter/index.ts index 5802bf8cc..07389b308 100644 --- a/app/src/protyle/gutter/index.ts +++ b/app/src/protyle/gutter/index.ts @@ -3,7 +3,7 @@ import { hasClosestByAttribute, hasClosestByClassName, hasClosestByMatchTag, - hasClosestByTag + hasClosestByTag, hasTopClosestByClassName } from "../util/hasClosest"; import {getIconByType} from "../../editor/getIcon"; import {enterBack, iframeMenu, setFold, tableMenu, videoMenu, zoomOut} from "../../menus/protyle"; @@ -312,7 +312,8 @@ export class Gutter { window.siyuan.menus.menu.fullscreen(); } else { window.siyuan.menus.menu.popup({x: gutterRect.left, y: gutterRect.bottom, isLeft: true}); - window.siyuan.menus.menu.element.setAttribute("data-from", hasClosestByClassName(protyle.element, "block__edit") ? "popover" : "app"); + const popoverElement = hasTopClosestByClassName(protyle.element, "block__popover", true); + window.siyuan.menus.menu.element.setAttribute("data-from", popoverElement ? popoverElement.dataset.level + "popover" : "app"); focusByRange(protyle.toolbar.range); } } @@ -343,7 +344,8 @@ export class Gutter { } else if (buttonElement.dataset.type !== "NodeAttributeViewRow") { this.renderMenu(protyle, buttonElement); window.siyuan.menus.menu.popup({x: gutterRect.left, y: gutterRect.bottom, isLeft: true}); - window.siyuan.menus.menu.element.setAttribute("data-from", hasClosestByClassName(protyle.element, "block__edit") ? "popover" : "app"); + const popoverElement = hasTopClosestByClassName(protyle.element, "block__popover", true); + window.siyuan.menus.menu.element.setAttribute("data-from", popoverElement ? popoverElement.dataset.level + "popover" : "app"); } } event.preventDefault(); @@ -790,7 +792,7 @@ export class Gutter { label: window.siyuan.languages.addToDatabase, icon: "iconDatabase", click: () => { - openSearchAV("", this.element, (listItemElement) => { + openSearchAV("", selectsElement[0] as HTMLElement, (listItemElement) => { const sourceIds: string[] = []; selectsElement.forEach(item => { sourceIds.push(item.getAttribute("data-node-id")); @@ -1242,7 +1244,7 @@ export class Gutter { label: window.siyuan.languages.addToDatabase, icon: "iconDatabase", click: () => { - openSearchAV("", this.element, (listItemElement) => { + openSearchAV("", nodeElement as HTMLElement, (listItemElement) => { const sourceIds: string[] = [nodeElement.getAttribute("data-node-id")]; const avID = listItemElement.dataset.avId; transaction(protyle, [{ diff --git a/app/src/protyle/render/av/relation.ts b/app/src/protyle/render/av/relation.ts index 53582f595..3daedebfd 100644 --- a/app/src/protyle/render/av/relation.ts +++ b/app/src/protyle/render/av/relation.ts @@ -1,8 +1,8 @@ import {Menu} from "../../../plugin/Menu"; -import {hasClosestByClassName} from "../../util/hasClosest"; +import {hasClosestByClassName, hasTopClosestByClassName} from "../../util/hasClosest"; import {upDownHint} from "../../../util/upDownHint"; import {fetchPost} from "../../../util/fetch"; -import {escapeHtml} from "../../../util/escape"; +import {escapeGreat, escapeHtml} from "../../../util/escape"; import {transaction} from "../../wysiwyg/transaction"; import {updateCellsValue} from "./cell"; import {updateAttrViewCellAnimation} from "./action"; @@ -23,7 +23,7 @@ const genSearchList = (element: Element, keyword: string, avId: string, cb?: ()
${escapeHtml(item.avName || window.siyuan.languages.title)}
-
${escapeHtml(item.hPath)}
+
${escapeGreat(item.hPath)}
`; @@ -115,6 +115,8 @@ export const openSearchAV = (avId: string, target: HTMLElement, cb?: (element: H } }); menu.element.querySelector(".b3-menu__items").setAttribute("style", "overflow: initial"); + const popoverElement = hasTopClosestByClassName(target, "block__popover", true); + menu.element.setAttribute("data-from", popoverElement ? popoverElement.dataset.level + "popover" : "app"); }; export const updateRelation = (options: { @@ -251,7 +253,7 @@ export const bindRelationEvent = (options: { fetchPost("/api/av/getAttributeViewPrimaryKeyValues", { id: options.menuElement.firstElementChild.getAttribute("data-av-id"), }, response => { - const cells=response.data.rows.values as IAVCellValue[]; + const cells = response.data.rows.values as IAVCellValue[]; let html = ""; let selectHTML = ""; hasIds.forEach(hasId => {