import {Dialog} from "../dialog"; import {App} from "../index"; import {upDownHint} from "../util/upDownHint"; /// #if !MOBILE import {openSetting} from "../config"; /// #endif import {updateHotkeyTip} from "../protyle/util/compatibility"; import {isMobile} from "../util/functions"; import {Constants} from "../constants"; export const commandPanel = (app: App) => { const dialog = new Dialog({ width: isMobile() ? "92vw" : "80vw", height: isMobile() ? "80vh" : "70vh", title: window.siyuan.languages.commandPanel, content: `
` }); dialog.element.setAttribute("data-key", Constants.DIALOG_COMMANDPANEL); const listElement = dialog.element.querySelector("#commands"); app.plugins.forEach(plugin => { plugin.commands.forEach(command => { const liElement = document.createElement("li"); liElement.classList.add("b3-list-item"); if (listElement.childElementCount === 0) { liElement.classList.add("b3-list-item--focus"); } liElement.innerHTML = `${plugin.displayName}: ${command.langText || plugin.i18n[command.langKey]} ${updateHotkeyTip(command.customHotkey)}`; liElement.addEventListener("click", () => { if (command.callback) { command.callback(); } else if (command.globalCallback) { command.globalCallback(); } dialog.destroy(); }); listElement.insertAdjacentElement("beforeend", liElement); }); }); if (listElement.childElementCount === 0) { const liElement = document.createElement("li"); liElement.classList.add("b3-list-item", "b3-list-item--focus"); liElement.innerHTML = `${isMobile() ? window.siyuan.languages._kernel[122] : window.siyuan.languages.commandEmpty}`; liElement.addEventListener("click", () => { dialog.destroy(); /// #if !MOBILE openSetting(app).element.querySelector('.b3-tab-bar [data-name="bazaar"]').dispatchEvent(new CustomEvent("click")); /// #endif }); listElement.insertAdjacentElement("beforeend", liElement); } else { listElement.firstElementChild.classList.add("b3-list-item--focus"); } const inputElement = dialog.element.querySelector(".b3-text-field") as HTMLInputElement; inputElement.focus(); 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) { currentElement.dispatchEvent(new CustomEvent("click")); } dialog.destroy(); } else if (event.key === "Escape") { dialog.destroy(); } }); inputElement.addEventListener("compositionend", () => { filterList(inputElement, listElement); }); inputElement.addEventListener("input", (event: InputEvent) => { if (event.isComposing) { return; } event.stopPropagation(); filterList(inputElement, listElement); }); }; const filterList = (inputElement: HTMLInputElement, listElement: Element) => { const inputValue = inputElement.value.toLowerCase(); listElement.querySelector(".b3-list-item--focus")?.classList.remove("b3-list-item--focus"); let hasFocus = false; Array.from(listElement.children).forEach((element: HTMLElement) => { const elementValue = element.querySelector(".b3-list-item__text").textContent.toLowerCase(); if (inputValue.indexOf(elementValue) > -1 || elementValue.indexOf(inputValue) > -1) { if (!hasFocus) { element.classList.add("b3-list-item--focus"); } hasFocus = true; element.classList.remove("fn__none"); } else { element.classList.add("fn__none"); } }); };