diff --git a/app/src/protyle/toolbar/index.ts b/app/src/protyle/toolbar/index.ts index 96931851d..a1ca5efdd 100644 --- a/app/src/protyle/toolbar/index.ts +++ b/app/src/protyle/toolbar/index.ts @@ -40,6 +40,7 @@ import {hideElements} from "../ui/hideElements"; import {linkMenu} from "../../menus/protyle"; import {renderAssetsPreview} from "../../asset/renderAssets"; import {electronUndo} from "../undo"; +import {previewTemplate} from "./util"; export class Toolbar { public element: HTMLElement; @@ -1031,10 +1032,24 @@ export class Toolbar { } this.subElement.style.width = ""; this.subElement.style.padding = ""; - this.subElement.innerHTML = `
-
${html}
+ this.subElement.innerHTML = `
+
+ +
${html}
+
+
`; - + const listElement = this.subElement.querySelector(".b3-list"); + const previewElement = this.subElement.firstElementChild.lastElementChild; + previewTemplate(listElement.firstElementChild.getAttribute("data-value"), previewElement) + listElement.addEventListener("mouseover", (event) => { + const target = event.target as HTMLElement; + const hoverItemElement = hasClosestByClassName(target, "b3-list-item"); + if (!hoverItemElement) { + return; + } + previewTemplate(hoverItemElement.getAttribute("data-value"), previewElement) + }); const inputElement = this.subElement.querySelector("input"); inputElement.addEventListener("keydown", (event: KeyboardEvent) => { event.stopPropagation(); @@ -1043,7 +1058,10 @@ export class Toolbar { } const isEmpty = !this.subElement.querySelector(".b3-list-item") if (!isEmpty) { - upDownHint(this.subElement.lastElementChild.lastElementChild as HTMLElement, event); + const currentElement = upDownHint(listElement, event); + if (currentElement) { + previewTemplate(currentElement.getAttribute("data-value"), previewElement) + } } if (event.key === "Enter") { if (!isEmpty) { @@ -1067,7 +1085,8 @@ export class Toolbar { response.data.blocks.forEach((item: { path: string, content: string }, index: number) => { searchHTML += `
${item.content}
`; }); - this.subElement.firstElementChild.lastElementChild.innerHTML = searchHTML || `
  • ${window.siyuan.languages.emptyContent}
  • `; + listElement.innerHTML = searchHTML || `
  • ${window.siyuan.languages.emptyContent}
  • `; + previewTemplate(response.data.blocks[0].path, previewElement); }); }); this.subElement.lastElementChild.addEventListener("click", (event) => { @@ -1159,6 +1178,9 @@ export class Toolbar { response.data.forEach((item: { hName: string, path: string }, index: number) => { html += `
    ${item.hName}
    `; }); + if (html === "") { + html = `
  • ${window.siyuan.languages.emptyContent}
  • `; + } this.subElement.style.width = ""; this.subElement.style.padding = ""; this.subElement.innerHTML = `
    @@ -1185,12 +1207,21 @@ export class Toolbar { if (event.isComposing) { return; } - const currentElement = upDownHint(listElement, event); - if (currentElement) { - previewElement.innerHTML = renderAssetsPreview(currentElement.getAttribute("data-value")); + const isEmpty = !this.subElement.querySelector(".b3-list-item") + if (!isEmpty) { + const currentElement = upDownHint(listElement, event); + if (currentElement) { + previewElement.innerHTML = renderAssetsPreview(currentElement.getAttribute("data-value")); + } } + if (event.key === "Enter") { - hintRenderAssets(this.subElement.querySelector(".b3-list-item--focus").getAttribute("data-value"), protyle); + if (!isEmpty) { + hintRenderAssets(this.subElement.querySelector(".b3-list-item--focus").getAttribute("data-value"), protyle); + } else { + focusByRange(this.range); + } + this.subElement.classList.add("fn__none"); // 空行处插入 mp3 会多一个空的 mp3 块 event.preventDefault(); } else if (event.key === "Escape") { @@ -1207,12 +1238,17 @@ export class Toolbar { response.data.forEach((item: { path: string, hName: string }, index: number) => { searchHTML += `
    ${item.hName}
    `; }); - listElement.innerHTML = searchHTML; + listElement.innerHTML = searchHTML || `
  • ${window.siyuan.languages.emptyContent}
  • `; previewElement.innerHTML = renderAssetsPreview(listElement.firstElementChild.getAttribute("data-value")); }); }); this.subElement.lastElementChild.addEventListener("click", (event) => { const target = event.target as HTMLElement; + if (target.classList.contains("b3-list--empty")) { + this.subElement.classList.add("fn__none"); + focusByRange(this.range); + return; + } const listItemElement = hasClosestByClassName(target, "b3-list-item"); if (!listItemElement) { return; diff --git a/app/src/protyle/toolbar/util.ts b/app/src/protyle/toolbar/util.ts new file mode 100644 index 000000000..e84530e08 --- /dev/null +++ b/app/src/protyle/toolbar/util.ts @@ -0,0 +1,7 @@ +import {fetchPost} from "../../util/fetch"; + +export const previewTemplate = (pathString: string, element: Element) => { + fetchPost("/api/file/getFile", {path: pathString.replace(window.siyuan.config.system.dataDir, "")}, (response) => { + element.innerHTML = response.data; + }) +}