diff --git a/app/src/assets/scss/component/_menu.scss b/app/src/assets/scss/component/_menu.scss index 1480cdad3..d4d9cf2bc 100644 --- a/app/src/assets/scss/component/_menu.scss +++ b/app/src/assets/scss/component/_menu.scss @@ -25,6 +25,12 @@ } } + &__filter { + min-width: 260px; + max-width: 420px; + max-height: 50vh; + } + &--fullscreen { top: 100vh; left: 0; diff --git a/app/src/protyle/header/Background.ts b/app/src/protyle/header/Background.ts index cee3debb3..b2de08924 100644 --- a/app/src/protyle/header/Background.ts +++ b/app/src/protyle/header/Background.ts @@ -15,7 +15,7 @@ import {Dialog} from "../../dialog"; import {Constants} from "../../constants"; import {assetMenu} from "../../menus/protyle"; import {previewImage} from "../preview/image"; -import {MenuItem} from "../../menus/Menu"; +import {Menu} from "../../plugin/Menu"; const bgs = [ "background:radial-gradient(black 3px, transparent 4px),radial-gradient(black 3px, transparent 4px),linear-gradient(#fff 4px, transparent 0),linear-gradient(45deg, transparent 74px, transparent 75px, #a4a4a4 75px, #a4a4a4 76px, transparent 77px, transparent 109px),linear-gradient(-45deg, transparent 75px, transparent 76px, #a4a4a4 76px, #a4a4a4 77px, transparent 78px, transparent 109px),#fff;background-size: 109px 109px, 109px 109px,100% 6px, 109px 109px, 109px 109px;background-position: 54px 55px, 0px 0px, 0px 0px, 0px 0px, 0px 0px;", @@ -476,77 +476,82 @@ export class Background { } private openTag(protyle: IProtyle) { - fetchPost("/api/search/searchTag", { - k: "", - }, (response) => { - let html = ""; - response.data.tags.forEach((item: string, index: number) => { - html += `
${item}
`; - }); - window.siyuan.menus.menu.remove(); - window.siyuan.menus.menu.append(new MenuItem({ - iconHTML: "", - type: "readonly", - label: `
- -
-
${html}
+ window.siyuan.menus.menu.remove(); + const menu = new Menu(); + menu.addItem({ + iconHTML: "", + type: "empty", + label: `
+ +
+
+ +
`, - bind: (element) => { - const inputElement = element.querySelector("input"); - const listElement = element.querySelector(".b3-list--background"); - inputElement.addEventListener("keydown", (event: KeyboardEvent) => { - event.stopPropagation(); - if (event.isComposing) { - return; - } - upDownHint(listElement, event); - if (event.key === "Enter") { - const currentElement = listElement.querySelector(".b3-list-item--focus"); - if (currentElement) { - this.addTags(currentElement.textContent, protyle); - } else { - this.addTags(inputElement.value, protyle); - } - window.siyuan.menus.menu.remove(); - } else if (event.key === "Escape") { - window.siyuan.menus.menu.remove(); - } + bind: (element) => { + const listElement = element.querySelector(".b3-list--background"); + fetchPost("/api/search/searchTag", { + k: "", + }, (response) => { + let html = ""; + response.data.tags.forEach((item: string, index: number) => { + html += `
${item}
`; }); - inputElement.addEventListener("input", (event) => { - event.stopPropagation(); - fetchPost("/api/search/searchTag", { - k: inputElement.value, - }, (response) => { - let searchHTML = ""; - let hasKey = false; - response.data.tags.forEach((item: string) => { - searchHTML += `
${item}
`; - if (item === `${response.data.k}`) { - hasKey = true; - } - }); - if (!hasKey && response.data.k) { - searchHTML = `
${response.data.k}
` + searchHTML; + listElement.innerHTML = html; + }); + const inputElement = element.querySelector("input"); + inputElement.addEventListener("keydown", (event: KeyboardEvent) => { + event.stopPropagation(); + if (event.isComposing) { + return; + } + upDownHint(listElement, event); + if (event.key === "Enter") { + const currentElement = listElement.querySelector(".b3-list-item--focus"); + if (currentElement) { + this.addTags(currentElement.textContent, protyle); + } else { + this.addTags(inputElement.value, protyle); + } + window.siyuan.menus.menu.remove(); + } else if (event.key === "Escape") { + window.siyuan.menus.menu.remove(); + } + }); + inputElement.addEventListener("input", (event) => { + event.stopPropagation(); + fetchPost("/api/search/searchTag", { + k: inputElement.value, + }, (response) => { + let searchHTML = ""; + let hasKey = false; + response.data.tags.forEach((item: string) => { + searchHTML += `
${item}
`; + if (item === `${response.data.k}`) { + hasKey = true; } - listElement.innerHTML = searchHTML; - listElement.firstElementChild.classList.add("b3-list-item--focus"); }); - }); - listElement.addEventListener("click", (event) => { - const target = event.target as HTMLElement; - const listItemElement = hasClosestByClassName(target, "b3-list-item"); - if (!listItemElement) { - return; + if (!hasKey && response.data.k) { + searchHTML = `
${response.data.k}
` + searchHTML; } - this.addTags(listItemElement.textContent, protyle); + listElement.innerHTML = searchHTML; + listElement.firstElementChild.classList.add("b3-list-item--focus"); }); - } - }).element); - const rect = this.iconElement.nextElementSibling.getBoundingClientRect(); - window.siyuan.menus.menu.popup({x: rect.left, y: rect.top + rect.height}); - window.siyuan.menus.menu.element.querySelector("input").focus(); + }); + listElement.addEventListener("click", (event) => { + const target = event.target as HTMLElement; + const listItemElement = hasClosestByClassName(target, "b3-list-item"); + if (!listItemElement) { + return; + } + this.addTags(listItemElement.textContent, protyle); + }); + } }); + menu.element.querySelector(".b3-menu__items").setAttribute("style", "overflow: initial"); + const rect = this.iconElement.nextElementSibling.getBoundingClientRect(); + menu.open({x: rect.left, y: rect.top + rect.height}); + menu.element.querySelector("input").focus(); } private getTags(removeTag?: string) { diff --git a/app/src/protyle/render/av/relation.ts b/app/src/protyle/render/av/relation.ts index 816c87388..53582f595 100644 --- a/app/src/protyle/render/av/relation.ts +++ b/app/src/protyle/render/av/relation.ts @@ -51,7 +51,7 @@ export const openSearchAV = (avId: string, target: HTMLElement, cb?: (element: H menu.addItem({ iconHTML: "", type: "empty", - label: `
+ label: `
diff --git a/app/src/protyle/render/av/rollup.ts b/app/src/protyle/render/av/rollup.ts index 8cac364cf..404ec0fbf 100644 --- a/app/src/protyle/render/av/rollup.ts +++ b/app/src/protyle/render/av/rollup.ts @@ -95,7 +95,7 @@ export const goSearchRollupCol = (options: { menu.addItem({ iconHTML: "", type: "empty", - label: `
+ label: `