mirror of
https://github.com/siyuan-note/siyuan.git
synced 2026-01-21 07:46:09 +01:00
This commit is contained in:
parent
c72a4ead7e
commit
3757577850
8 changed files with 327 additions and 304 deletions
|
|
@ -61,7 +61,7 @@
|
|||
top: 42px;
|
||||
position: absolute;
|
||||
left: 8px;
|
||||
z-index: 1;
|
||||
z-index: 3;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ import {transaction} from "../../protyle/wysiwyg/transaction";
|
|||
import {quickMakeCard} from "../../card/makeCard";
|
||||
import {copyPNG} from "../../menus/util";
|
||||
import {getContentByInlineHTML} from "../../protyle/wysiwyg/keydown";
|
||||
import {searchKeydown} from "./searchKeydown";
|
||||
|
||||
const switchDialogEvent = (app: App, event: MouseEvent) => {
|
||||
event.preventDefault();
|
||||
|
|
@ -1018,6 +1019,12 @@ export const windowKeyDown = (app: App, event: KeyboardEvent) => {
|
|||
return;
|
||||
}
|
||||
|
||||
if (searchKeydown(app, event)) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return;
|
||||
}
|
||||
|
||||
const isTabWindow = isWindow();
|
||||
if (event.ctrlKey && !event.metaKey && event.key === "Tab") {
|
||||
if (switchDialog && switchDialog.element.parentElement) {
|
||||
|
|
@ -1580,7 +1587,6 @@ export const windowKeyDown = (app: App, event: KeyboardEvent) => {
|
|||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
|
||||
// https://github.com/siyuan-note/insider/issues/445
|
||||
if (matchHotKey("⌘S", event)) {
|
||||
event.preventDefault();
|
||||
|
|
|
|||
291
app/src/boot/globalEvent/searchKeydown.ts
Normal file
291
app/src/boot/globalEvent/searchKeydown.ts
Normal file
|
|
@ -0,0 +1,291 @@
|
|||
/// #if !BROWSER
|
||||
import * as path from "path";
|
||||
/// #endif
|
||||
import {matchHotKey} from "../../protyle/util/hotKey";
|
||||
import {fetchPost} from "../../util/fetch";
|
||||
import {openFileById} from "../../editor/util";
|
||||
import {Constants} from "../../constants";
|
||||
import {newFileByName} from "../../util/newFile";
|
||||
import {upDownHint} from "../../util/upDownHint";
|
||||
import {App} from "../../index";
|
||||
import {Dialog} from "../../dialog";
|
||||
import {getAllModels} from "../../layout/getAll";
|
||||
import {hasClosestByClassName} from "../../protyle/util/hasClosest";
|
||||
import {getArticle, inputEvent, replace, toggleReplaceHistory, toggleSearchHistory} from "../../search/util";
|
||||
import {showFileInFolder} from "../../util/pathName";
|
||||
import {assetInputEvent, renderPreview, toggleAssetHistory} from "../../search/assets";
|
||||
|
||||
export const searchKeydown = (app: App, event: KeyboardEvent) => {
|
||||
if (getSelection().rangeCount === 0) {
|
||||
return false;
|
||||
}
|
||||
const range = getSelection().getRangeAt(0);
|
||||
if (hasClosestByClassName(range.startContainer, "protyle", true)) {
|
||||
return false;
|
||||
}
|
||||
let element: HTMLElement
|
||||
let dialog: Dialog
|
||||
let edit
|
||||
let config: ISearchOption
|
||||
window.siyuan.dialogs.find((item) => {
|
||||
if (item.element.contains(range.startContainer) && item.element.querySelector("#searchList")) {
|
||||
element = item.element.querySelector(".b3-dialog__body");
|
||||
dialog = item
|
||||
config = dialog.data
|
||||
edit = dialog.editor
|
||||
return true;
|
||||
}
|
||||
});
|
||||
if (!element) {
|
||||
getAllModels().search.find((item) => {
|
||||
if (item.element.contains(range.startContainer)) {
|
||||
element = item.element;
|
||||
edit = item.edit;
|
||||
config = item.config
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
if (!element) {
|
||||
return false;
|
||||
}
|
||||
const assetsElement = element.querySelector("#searchAssets");
|
||||
const isAsset = !assetsElement.classList.contains("fn__none")
|
||||
const listElement = isAsset ? assetsElement.querySelector("#searchAssetList") : element.querySelector("#searchList");
|
||||
let currentList: HTMLElement = listElement.querySelector(".b3-list-item--focus");
|
||||
if (!currentList) {
|
||||
return false;
|
||||
}
|
||||
const searchInputElement = element.querySelector("#searchInput") as HTMLInputElement;
|
||||
if (!isAsset && matchHotKey(window.siyuan.config.keymap.general.newFile.custom, event)) {
|
||||
newFileByName(app, searchInputElement.value);
|
||||
return true;
|
||||
}
|
||||
const targetId = (event.target as HTMLElement).id
|
||||
const historyElement = element.querySelector("#searchHistoryList");
|
||||
const replaceHistoryElement = element.querySelector("#replaceHistoryList");
|
||||
const replaceInputElement = element.querySelector("#replaceInput") as HTMLInputElement;
|
||||
const assetHistoryElement = assetsElement.querySelector("#searchAssetHistoryList");
|
||||
const assetInputElement = assetsElement.querySelector("#searchAssetInput") as HTMLInputElement;
|
||||
const assetPreviewElement = assetsElement.querySelector("#searchAssetPreview");
|
||||
if (event.key === "ArrowDown" && event.altKey) {
|
||||
if (isAsset) {
|
||||
toggleAssetHistory(assetHistoryElement, assetInputElement);
|
||||
} else {
|
||||
if (targetId === "replaceInput") {
|
||||
toggleReplaceHistory(replaceHistoryElement, historyElement, replaceInputElement);
|
||||
} else {
|
||||
toggleSearchHistory(historyElement, replaceHistoryElement, searchInputElement);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
const assetLocal = window.siyuan.storage[Constants.LOCAL_SEARCHASSET] as ISearchAssetOption
|
||||
let history;
|
||||
if (!historyElement.classList.contains("fn__none")) {
|
||||
history = "history"
|
||||
} else if (!replaceHistoryElement.classList.contains("fn__none")) {
|
||||
history = "replaceHistory"
|
||||
} else if (isAsset && !assetHistoryElement.classList.contains("fn__none")) {
|
||||
history = "assetHistory"
|
||||
}
|
||||
if (history) {
|
||||
if (event.key === "Escape") {
|
||||
if (isAsset) {
|
||||
toggleAssetHistory(assetHistoryElement, assetInputElement);
|
||||
} else {
|
||||
if ((event.target as HTMLElement).id === "replaceInput") {
|
||||
toggleReplaceHistory(replaceHistoryElement, historyElement, replaceInputElement);
|
||||
} else {
|
||||
toggleSearchHistory(historyElement, replaceHistoryElement, searchInputElement);
|
||||
}
|
||||
}
|
||||
} else if (event.key === "Enter") {
|
||||
if (history === "replaceHistory") {
|
||||
replaceInputElement.value = replaceHistoryElement.querySelector(".b3-list-item--focus").textContent.trim();
|
||||
toggleReplaceHistory(replaceHistoryElement, historyElement, replaceInputElement);
|
||||
} else if (history === "assetHistory") {
|
||||
assetInputElement.value = assetHistoryElement.querySelector(".b3-list-item--focus").textContent.trim();
|
||||
assetInputEvent(assetsElement, assetLocal);
|
||||
toggleAssetHistory(assetHistoryElement, assetInputElement);
|
||||
renderPreview(assetPreviewElement, currentList.dataset.id, assetInputElement.value, assetLocal.method);
|
||||
} else {
|
||||
searchInputElement.value = historyElement.querySelector(".b3-list-item--focus").textContent.trim();
|
||||
config.page = 1;
|
||||
inputEvent(element, config, edit, true);
|
||||
toggleSearchHistory(historyElement, replaceHistoryElement, searchInputElement);
|
||||
}
|
||||
} else {
|
||||
if (history === "assetHistory") {
|
||||
upDownHint(assetHistoryElement, event);
|
||||
} else {
|
||||
if (history === "replaceHistory") {
|
||||
upDownHint(replaceHistoryElement, event);
|
||||
} else {
|
||||
upDownHint(historyElement, event);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (currentList.getAttribute("data-type") === "search-new") {
|
||||
if (event.key === "Enter") {
|
||||
newFileByName(app, searchInputElement.value);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (!isAsset && matchHotKey(window.siyuan.config.keymap.editor.general.insertRight.custom, event)) {
|
||||
const id = currentList.getAttribute("data-node-id");
|
||||
fetchPost("/api/block/checkBlockFold", {id}, (foldResponse) => {
|
||||
openFileById({
|
||||
app,
|
||||
id,
|
||||
position: "right",
|
||||
action: foldResponse.data ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL] :
|
||||
(id === currentList.getAttribute("data-root-id") ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ROOTSCROLL] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT]),
|
||||
zoomIn: foldResponse.data
|
||||
});
|
||||
if (dialog) {
|
||||
dialog.destroy({focus: "false"});
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
// TODO https://github.com/siyuan-note/siyuan/issues/9548
|
||||
if (Constants.KEYCODELIST[event.keyCode] === "PageUp") {
|
||||
if (isAsset) {
|
||||
if (!assetsElement.querySelector('[data-type="assetPrevious"]').getAttribute("disabled")) {
|
||||
let currentPage = parseInt(assetsElement.querySelector("#searchAssetResult .fn__flex-center").textContent.split("/")[0]);
|
||||
if (currentPage > 1) {
|
||||
currentPage--;
|
||||
assetInputEvent(assetsElement, assetLocal, currentPage);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!element.querySelector('[data-type="previous"]').getAttribute("disabled")) {
|
||||
if (config.page > 1) {
|
||||
config.page--;
|
||||
inputEvent(element, config, edit);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
if (Constants.KEYCODELIST[event.keyCode] === "PageDown") {
|
||||
if (isAsset) {
|
||||
if (!assetsElement.querySelector('[data-type="assetNext"]').getAttribute("disabled")) {
|
||||
const assetPages = assetsElement.querySelector("#searchAssetResult .fn__flex-center").textContent.split("/")
|
||||
let currentPage = parseInt(assetPages[0]);
|
||||
if (currentPage < parseInt(assetPages[1])) {
|
||||
currentPage++;
|
||||
assetInputEvent(assetsElement, assetLocal, currentPage);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const nextElement = element.querySelector('[data-type="next"]');
|
||||
if (!nextElement.getAttribute("disabled")) {
|
||||
if (config.page < parseInt(nextElement.parentElement.querySelector("#searchResult").getAttribute("data-pagecount"))) {
|
||||
config.page++;
|
||||
inputEvent(element, config, edit);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
if (!window.siyuan.menus.menu.element.classList.contains("fn__none")) {
|
||||
return false;
|
||||
}
|
||||
if (event.key === "Enter") {
|
||||
if (!isAsset) {
|
||||
if (targetId === "replaceInput") {
|
||||
replace(element, config, edit, false);
|
||||
} else {
|
||||
const id = currentList.getAttribute("data-node-id");
|
||||
fetchPost("/api/block/checkBlockFold", {id}, (foldResponse) => {
|
||||
openFileById({
|
||||
app,
|
||||
id,
|
||||
action: foldResponse.data ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL] :
|
||||
(id === currentList.getAttribute("data-root-id") ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ROOTSCROLL] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT]),
|
||||
zoomIn: foldResponse.data
|
||||
});
|
||||
if (dialog) {
|
||||
dialog.destroy({focus: "false"});
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
/// #if !BROWSER
|
||||
showFileInFolder(path.join(window.siyuan.config.system.dataDir, currentList.lastElementChild.getAttribute("aria-label")));
|
||||
/// #endif
|
||||
}
|
||||
return true;
|
||||
}
|
||||
const lineHeight = 28;
|
||||
if (event.key === "ArrowDown") {
|
||||
currentList.classList.remove("b3-list-item--focus");
|
||||
if (!currentList.nextElementSibling) {
|
||||
if (config.group === 1 && !isAsset) {
|
||||
if (currentList.parentElement.nextElementSibling) {
|
||||
currentList.parentElement.nextElementSibling.nextElementSibling.firstElementChild.classList.add("b3-list-item--focus");
|
||||
} else {
|
||||
listElement.children[1].firstElementChild.classList.add("b3-list-item--focus");
|
||||
}
|
||||
} else {
|
||||
listElement.firstElementChild.classList.add("b3-list-item--focus");
|
||||
}
|
||||
} else {
|
||||
currentList.nextElementSibling.classList.add("b3-list-item--focus");
|
||||
}
|
||||
currentList = listElement.querySelector(".b3-list-item--focus");
|
||||
if (listElement.scrollTop < currentList.offsetTop - listElement.clientHeight + lineHeight ||
|
||||
listElement.scrollTop > currentList.offsetTop) {
|
||||
listElement.scrollTop = currentList.offsetTop - listElement.clientHeight + lineHeight;
|
||||
}
|
||||
if (isAsset) {
|
||||
renderPreview(assetPreviewElement, currentList.dataset.id, searchInputElement.value, assetLocal.method);
|
||||
} else {
|
||||
getArticle({
|
||||
id: currentList.getAttribute("data-node-id"),
|
||||
config,
|
||||
value: searchInputElement.value,
|
||||
edit,
|
||||
});
|
||||
}
|
||||
return true
|
||||
}
|
||||
if (event.key === "ArrowUp") {
|
||||
currentList.classList.remove("b3-list-item--focus");
|
||||
if (!currentList.previousElementSibling) {
|
||||
if (config.group === 1 && !isAsset) {
|
||||
if (currentList.parentElement.previousElementSibling.previousElementSibling) {
|
||||
currentList.parentElement.previousElementSibling.previousElementSibling.lastElementChild.classList.add("b3-list-item--focus");
|
||||
} else {
|
||||
listElement.lastElementChild.lastElementChild.classList.add("b3-list-item--focus");
|
||||
}
|
||||
} else {
|
||||
listElement.lastElementChild.classList.add("b3-list-item--focus");
|
||||
}
|
||||
} else {
|
||||
currentList.previousElementSibling.classList.add("b3-list-item--focus");
|
||||
}
|
||||
currentList = listElement.querySelector(".b3-list-item--focus");
|
||||
if (listElement.scrollTop < currentList.offsetTop - listElement.clientHeight + lineHeight ||
|
||||
listElement.scrollTop > currentList.offsetTop - lineHeight * 2) {
|
||||
listElement.scrollTop = currentList.offsetTop - lineHeight * 2;
|
||||
}
|
||||
if (isAsset) {
|
||||
renderPreview(assetPreviewElement, currentList.dataset.id, searchInputElement.value, assetLocal.method);
|
||||
} else {
|
||||
getArticle({
|
||||
id: currentList.getAttribute("data-node-id"),
|
||||
config,
|
||||
value: searchInputElement.value,
|
||||
edit,
|
||||
});
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
|
@ -12,6 +12,7 @@ export class Dialog {
|
|||
private id: string;
|
||||
private disableClose: boolean;
|
||||
public editor: Protyle;
|
||||
public data: any;
|
||||
|
||||
constructor(options: {
|
||||
title?: string,
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
/// #if !BROWSER
|
||||
import * as path from "path";
|
||||
/// #endif
|
||||
import {Constants} from "../constants";
|
||||
import {fetchPost} from "../util/fetch";
|
||||
import {upDownHint} from "../util/upDownHint";
|
||||
import {escapeAriaLabel, escapeHtml} from "../util/escape";
|
||||
import {setStorageVal} from "../protyle/util/compatibility";
|
||||
/// #if !MOBILE
|
||||
|
|
@ -11,7 +7,6 @@ import {getQueryTip} from "./util";
|
|||
/// #endif
|
||||
import {MenuItem} from "../menus/Menu";
|
||||
import {Dialog} from "../dialog";
|
||||
import {showFileInFolder} from "../util/pathName";
|
||||
|
||||
export const openSearchAsset = (element: Element, isStick: boolean) => {
|
||||
/// #if !MOBILE
|
||||
|
|
@ -78,7 +73,6 @@ export const openSearchAsset = (element: Element, isStick: boolean) => {
|
|||
<kbd>Click</kbd> ${window.siyuan.languages.searchTip3}
|
||||
<kbd>Esc</kbd> ${window.siyuan.languages.searchTip5}
|
||||
</div>`;
|
||||
const searchPanelElement = element.querySelector("#searchAssetList");
|
||||
if (element.querySelector("#searchAssetList").innerHTML !== "") {
|
||||
return;
|
||||
}
|
||||
|
|
@ -123,95 +117,6 @@ export const openSearchAsset = (element: Element, isStick: boolean) => {
|
|||
window.siyuan.storage[Constants.LOCAL_SEARCHASSET].keys = list;
|
||||
setStorageVal(Constants.LOCAL_SEARCHASSET, window.siyuan.storage[Constants.LOCAL_SEARCHASSET]);
|
||||
});
|
||||
const historyElement = element.querySelector("#searchAssetHistoryList");
|
||||
const lineHeight = 28;
|
||||
searchInputElement.addEventListener("keydown", (event: KeyboardEvent) => {
|
||||
if (event.isComposing) {
|
||||
return;
|
||||
}
|
||||
let currentList: HTMLElement = searchPanelElement.querySelector(".b3-list-item--focus");
|
||||
const isHistory = !historyElement.classList.contains("fn__none");
|
||||
if (event.key === "Enter") {
|
||||
if (!isHistory) {
|
||||
if (currentList) {
|
||||
/// #if !BROWSER
|
||||
showFileInFolder(path.join(window.siyuan.config.system.dataDir, currentList.lastElementChild.getAttribute("aria-label")));
|
||||
/// #endif
|
||||
}
|
||||
} else {
|
||||
searchInputElement.value = historyElement.querySelector(".b3-list-item--focus").textContent.trim();
|
||||
assetInputEvent(element, localSearch);
|
||||
toggleAssetHistory(historyElement, searchInputElement);
|
||||
renderPreview(previewElement, currentList.dataset.id, searchInputElement.value, localSearch.method);
|
||||
}
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
if (event.key === "ArrowDown" && event.altKey) {
|
||||
toggleAssetHistory(historyElement, searchInputElement);
|
||||
return;
|
||||
}
|
||||
if (isHistory) {
|
||||
if (event.key === "Escape") {
|
||||
toggleAssetHistory(historyElement, searchInputElement);
|
||||
} else {
|
||||
upDownHint(historyElement, event);
|
||||
}
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
if (!currentList) {
|
||||
return;
|
||||
}
|
||||
if (event.key === "ArrowDown") {
|
||||
currentList.classList.remove("b3-list-item--focus");
|
||||
if (!currentList.nextElementSibling) {
|
||||
searchPanelElement.firstElementChild.classList.add("b3-list-item--focus");
|
||||
} else {
|
||||
currentList.nextElementSibling.classList.add("b3-list-item--focus");
|
||||
}
|
||||
currentList = searchPanelElement.querySelector(".b3-list-item--focus");
|
||||
if (searchPanelElement.scrollTop < currentList.offsetTop - searchPanelElement.clientHeight + lineHeight ||
|
||||
searchPanelElement.scrollTop > currentList.offsetTop) {
|
||||
searchPanelElement.scrollTop = currentList.offsetTop - searchPanelElement.clientHeight + lineHeight;
|
||||
}
|
||||
event.preventDefault();
|
||||
renderPreview(previewElement, currentList.dataset.id, searchInputElement.value, localSearch.method);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
currentList.classList.remove("b3-list-item--focus");
|
||||
if (!currentList.previousElementSibling) {
|
||||
searchPanelElement.lastElementChild.classList.add("b3-list-item--focus");
|
||||
} else {
|
||||
currentList.previousElementSibling.classList.add("b3-list-item--focus");
|
||||
}
|
||||
currentList = searchPanelElement.querySelector(".b3-list-item--focus");
|
||||
if (searchPanelElement.scrollTop < currentList.offsetTop - searchPanelElement.clientHeight + lineHeight ||
|
||||
searchPanelElement.scrollTop > currentList.offsetTop - lineHeight * 2) {
|
||||
searchPanelElement.scrollTop = currentList.offsetTop - lineHeight * 2;
|
||||
}
|
||||
event.preventDefault();
|
||||
renderPreview(previewElement, currentList.dataset.id, searchInputElement.value, localSearch.method);
|
||||
} else if (Constants.KEYCODELIST[event.keyCode] === "PageUp") {
|
||||
if (!element.querySelector('[data-type="assetPrevious"]').getAttribute("disabled")) {
|
||||
let currentPage = parseInt(element.querySelector("#searchAssetResult .fn__flex-center").textContent.split("/")[0]);
|
||||
if (currentPage > 1) {
|
||||
currentPage--;
|
||||
assetInputEvent(element, localSearch, currentPage);
|
||||
}
|
||||
}
|
||||
event.preventDefault();
|
||||
} else if (Constants.KEYCODELIST[event.keyCode] === "PageDown") {
|
||||
if (!element.querySelector('[data-type="assetNext"]').getAttribute("disabled")) {
|
||||
let currentPage = parseInt(element.querySelector("#searchAssetResult .fn__flex-center").textContent.split("/")[0]);
|
||||
if (currentPage < parseInt(element.querySelector("#searchAssetResult .fn__flex-center").textContent.split("/")[1])) {
|
||||
currentPage++;
|
||||
assetInputEvent(element, localSearch, currentPage);
|
||||
}
|
||||
}
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
assetInputEvent(element, localSearch);
|
||||
|
||||
const dragElement = element.querySelector(".search__drag");
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import {setPanelFocus} from "../layout/util";
|
|||
import {App} from "../index";
|
||||
|
||||
export class Search extends Model {
|
||||
private element: HTMLElement;
|
||||
public element: HTMLElement;
|
||||
public config: ISearchOption;
|
||||
public edit: Protyle;
|
||||
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ export const openSearch = async (options: {
|
|||
}
|
||||
});
|
||||
dialog.element.setAttribute("data-key", options.hotkey);
|
||||
const edit = genSearch(options.app, {
|
||||
const config = {
|
||||
removed: localData.removed,
|
||||
k: options.key || localData.k,
|
||||
r: localData.r,
|
||||
|
|
@ -110,8 +110,10 @@ export const openSearch = async (options: {
|
|||
sort: localData.sort,
|
||||
types: Object.assign({}, localData.types),
|
||||
page: options.key ? 1 : localData.page
|
||||
}, dialog.element.querySelector(".b3-dialog__body"), () => {
|
||||
}
|
||||
const edit = genSearch(options.app, config, dialog.element.querySelector(".b3-dialog__body"), () => {
|
||||
dialog.destroy({focus: "false"});
|
||||
});
|
||||
dialog.editor = edit;
|
||||
dialog.data = config;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -25,10 +25,8 @@ import {unicode2Emoji} from "../emoji";
|
|||
import {hasClosestByClassName} from "../protyle/util/hasClosest";
|
||||
import {setStorageVal, updateHotkeyTip} from "../protyle/util/compatibility";
|
||||
import {newFileByName} from "../util/newFile";
|
||||
import {matchHotKey} from "../protyle/util/hotKey";
|
||||
import {filterMenu, getKeyByLiElement, initCriteriaMenu, moreMenu, queryMenu, saveCriterion} from "./menu";
|
||||
import {App} from "../index";
|
||||
import {upDownHint} from "../util/upDownHint";
|
||||
import {
|
||||
assetFilterMenu,
|
||||
assetInputEvent,
|
||||
|
|
@ -41,7 +39,7 @@ import {
|
|||
} from "./assets";
|
||||
import {resize} from "../protyle/util/resize";
|
||||
|
||||
const toggleReplaceHistory = (replaceHistoryElement: Element, historyElement: Element, replaceInputElement: HTMLInputElement) => {
|
||||
export const toggleReplaceHistory = (replaceHistoryElement: Element, historyElement: Element, replaceInputElement: HTMLInputElement) => {
|
||||
if (replaceHistoryElement.classList.contains("fn__none")) {
|
||||
const list = window.siyuan.storage[Constants.LOCAL_SEARCHKEYS];
|
||||
if (!list.replaceKeys || list.replaceKeys.length === 0) {
|
||||
|
|
@ -64,7 +62,7 @@ const toggleReplaceHistory = (replaceHistoryElement: Element, historyElement: El
|
|||
historyElement.classList.add("fn__none");
|
||||
};
|
||||
|
||||
const toggleSearchHistory = (historyElement: Element, replaceHistoryElement: Element, searchInputElement: HTMLInputElement) => {
|
||||
export const toggleSearchHistory = (historyElement: Element, replaceHistoryElement: Element, searchInputElement: HTMLInputElement) => {
|
||||
if (historyElement.classList.contains("fn__none")) {
|
||||
const list = window.siyuan.storage[Constants.LOCAL_SEARCHKEYS];
|
||||
if (!list.keys || list.keys.length === 0) {
|
||||
|
|
@ -256,7 +254,6 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
|
|||
const replaceHistoryElement = element.querySelector("#replaceHistoryList");
|
||||
const historyElement = element.querySelector("#searchHistoryList");
|
||||
|
||||
const lineHeight = 28;
|
||||
const edit = new Protyle(app, element.querySelector("#searchPreview") as HTMLElement, {
|
||||
blockId: "",
|
||||
render: {
|
||||
|
|
@ -291,7 +288,6 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
|
|||
}
|
||||
let clickTimeout: number;
|
||||
let lastClickTime = new Date().getTime();
|
||||
let inputTimeout: number;
|
||||
|
||||
searchInputElement.value = config.k || "";
|
||||
replaceInputElement.value = config.r || "";
|
||||
|
|
@ -383,7 +379,7 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
|
|||
if (!target.getAttribute("disabled")) {
|
||||
if (config.page < parseInt(target.parentElement.querySelector("#searchResult").getAttribute("data-pagecount"))) {
|
||||
config.page++;
|
||||
inputTimeout = inputEvent(element, config, inputTimeout, edit);
|
||||
inputEvent(element, config, edit);
|
||||
}
|
||||
}
|
||||
event.stopPropagation();
|
||||
|
|
@ -393,7 +389,7 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
|
|||
if (!target.getAttribute("disabled")) {
|
||||
if (config.page > 1) {
|
||||
config.page--;
|
||||
inputTimeout = inputEvent(element, config, inputTimeout, edit);
|
||||
inputEvent(element, config, edit);
|
||||
}
|
||||
}
|
||||
event.stopPropagation();
|
||||
|
|
@ -431,7 +427,7 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
|
|||
config.page = 1;
|
||||
searchPathInputElement.innerHTML = config.hPath;
|
||||
searchPathInputElement.setAttribute("aria-label", "");
|
||||
inputTimeout = inputEvent(element, config, inputTimeout, edit, true);
|
||||
inputEvent(element, config, edit, true);
|
||||
const includeElement = element.querySelector("#searchInclude");
|
||||
includeElement.classList.remove("b3-button--cancel");
|
||||
includeElement.setAttribute("disabled", "disabled");
|
||||
|
|
@ -487,7 +483,7 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
|
|||
} else {
|
||||
includeElement.setAttribute("disabled", "disabled");
|
||||
}
|
||||
inputTimeout = inputEvent(element, config, inputTimeout, edit, true);
|
||||
inputEvent(element, config, edit, true);
|
||||
});
|
||||
}, [], undefined, window.siyuan.languages.specifyPath);
|
||||
event.stopPropagation();
|
||||
|
|
@ -509,7 +505,7 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
|
|||
});
|
||||
}
|
||||
config.page = 1;
|
||||
inputTimeout = inputEvent(element, config, inputTimeout, edit, true);
|
||||
inputEvent(element, config, edit, true);
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
break;
|
||||
|
|
@ -548,14 +544,14 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
|
|||
event.preventDefault();
|
||||
break;
|
||||
} else if (target.id === "searchRefresh") {
|
||||
inputTimeout = inputEvent(element, config, inputTimeout, edit);
|
||||
inputEvent(element, config, edit);
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
break;
|
||||
} else if (target.id === "searchMore") {
|
||||
moreMenu(config, criteriaData, element, () => {
|
||||
config.page = 1;
|
||||
inputEvent(element, config, undefined, edit, true);
|
||||
inputEvent(element, config, edit, true);
|
||||
}, () => {
|
||||
updateConfig(element, {
|
||||
removed: true,
|
||||
|
|
@ -646,7 +642,7 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
|
|||
window.siyuan.menus.menu.remove();
|
||||
filterMenu(config, () => {
|
||||
config.page = 1;
|
||||
inputEvent(element, config, undefined, edit, true);
|
||||
inputEvent(element, config, edit, true);
|
||||
});
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
|
|
@ -699,7 +695,7 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
|
|||
queryMenu(config, () => {
|
||||
element.querySelector("#searchSyntaxCheck").setAttribute("aria-label", getQueryTip(config.method));
|
||||
config.page = 1;
|
||||
inputEvent(element, config, undefined, edit, true);
|
||||
inputEvent(element, config, edit, true);
|
||||
});
|
||||
const rect = target.getBoundingClientRect();
|
||||
window.siyuan.menus.menu.popup({x: rect.right, y: rect.bottom, isLeft: true});
|
||||
|
|
@ -747,7 +743,7 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
|
|||
if (target.parentElement.id === "searchHistoryList") {
|
||||
searchInputElement.value = target.textContent;
|
||||
config.page = 1;
|
||||
inputTimeout = inputEvent(element, config, inputTimeout, edit, true);
|
||||
inputEvent(element, config, edit, true);
|
||||
} else if (target.parentElement.id === "searchAssetHistoryList") {
|
||||
searchAssetInputElement.value = target.textContent;
|
||||
assetInputEvent(assetsElement);
|
||||
|
|
@ -857,14 +853,14 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
|
|||
if (event.isComposing) {
|
||||
return;
|
||||
}
|
||||
inputTimeout = inputEvent(element, config, inputTimeout, edit, true);
|
||||
inputEvent(element, config, edit, true);
|
||||
});
|
||||
searchInputElement.addEventListener("input", (event: InputEvent) => {
|
||||
config.page = 1;
|
||||
if (event.isComposing) {
|
||||
return;
|
||||
}
|
||||
inputTimeout = inputEvent(element, config, inputTimeout, edit, true);
|
||||
inputEvent(element, config, edit, true);
|
||||
});
|
||||
searchInputElement.addEventListener("blur", () => {
|
||||
if (config.removed) {
|
||||
|
|
@ -874,186 +870,7 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
|
|||
}
|
||||
saveKeyList("keys", searchInputElement.value);
|
||||
});
|
||||
searchInputElement.addEventListener("keydown", (event: KeyboardEvent) => {
|
||||
let currentList: HTMLElement = searchPanelElement.querySelector(".b3-list-item--focus");
|
||||
if (!currentList || event.isComposing) {
|
||||
return;
|
||||
}
|
||||
if (searchInputElement.value && matchHotKey(window.siyuan.config.keymap.editor.general.insertRight.custom, event)) {
|
||||
const id = currentList.getAttribute("data-node-id");
|
||||
fetchPost("/api/block/checkBlockFold", {id}, (foldResponse) => {
|
||||
openFileById({
|
||||
app,
|
||||
id,
|
||||
position: "right",
|
||||
action: foldResponse.data ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL] :
|
||||
(id === currentList.getAttribute("data-root-id") ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ROOTSCROLL] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT]),
|
||||
zoomIn: foldResponse.data
|
||||
});
|
||||
if (closeCB) {
|
||||
closeCB();
|
||||
}
|
||||
});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return;
|
||||
}
|
||||
if (searchInputElement.value && matchHotKey(window.siyuan.config.keymap.general.newFile.custom, event)) {
|
||||
newFileByName(app, searchInputElement.value);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
return;
|
||||
}
|
||||
const focusIsNew = currentList.getAttribute("data-type") === "search-new";
|
||||
const isHistory = !historyElement.classList.contains("fn__none");
|
||||
if (event.key === "Enter") {
|
||||
if (!isHistory) {
|
||||
if (focusIsNew) {
|
||||
newFileByName(app, searchInputElement.value);
|
||||
} else {
|
||||
const id = currentList.getAttribute("data-node-id");
|
||||
fetchPost("/api/block/checkBlockFold", {id}, (foldResponse) => {
|
||||
openFileById({
|
||||
app,
|
||||
id,
|
||||
action: foldResponse.data ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL] :
|
||||
(id === currentList.getAttribute("data-root-id") ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ROOTSCROLL] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT]),
|
||||
zoomIn: foldResponse.data
|
||||
});
|
||||
if (closeCB) {
|
||||
closeCB();
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
searchInputElement.value = historyElement.querySelector(".b3-list-item--focus").textContent.trim();
|
||||
config.page = 1;
|
||||
inputTimeout = inputEvent(element, config, inputTimeout, edit, true);
|
||||
toggleSearchHistory(historyElement, replaceHistoryElement, searchInputElement);
|
||||
}
|
||||
event.preventDefault();
|
||||
}
|
||||
if (event.key === "ArrowDown" && event.altKey) {
|
||||
toggleSearchHistory(historyElement, replaceHistoryElement, searchInputElement);
|
||||
return;
|
||||
}
|
||||
if (isHistory) {
|
||||
if (event.key === "Escape") {
|
||||
toggleSearchHistory(historyElement, replaceHistoryElement, searchInputElement);
|
||||
} else {
|
||||
upDownHint(historyElement, event);
|
||||
}
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
if (focusIsNew && !isHistory) {
|
||||
return;
|
||||
}
|
||||
if (event.key === "ArrowDown") {
|
||||
currentList.classList.remove("b3-list-item--focus");
|
||||
if (!currentList.nextElementSibling) {
|
||||
if (config.group === 1) {
|
||||
if (currentList.parentElement.nextElementSibling) {
|
||||
currentList.parentElement.nextElementSibling.nextElementSibling.firstElementChild.classList.add("b3-list-item--focus");
|
||||
} else {
|
||||
searchPanelElement.children[1].firstElementChild.classList.add("b3-list-item--focus");
|
||||
}
|
||||
} else {
|
||||
searchPanelElement.firstElementChild.classList.add("b3-list-item--focus");
|
||||
}
|
||||
} else {
|
||||
currentList.nextElementSibling.classList.add("b3-list-item--focus");
|
||||
}
|
||||
currentList = searchPanelElement.querySelector(".b3-list-item--focus");
|
||||
if (searchPanelElement.scrollTop < currentList.offsetTop - searchPanelElement.clientHeight + lineHeight ||
|
||||
searchPanelElement.scrollTop > currentList.offsetTop) {
|
||||
searchPanelElement.scrollTop = currentList.offsetTop - searchPanelElement.clientHeight + lineHeight;
|
||||
}
|
||||
getArticle({
|
||||
id: currentList.getAttribute("data-node-id"),
|
||||
config,
|
||||
value: searchInputElement.value,
|
||||
edit,
|
||||
});
|
||||
event.preventDefault();
|
||||
} else if (event.key === "ArrowUp") {
|
||||
currentList.classList.remove("b3-list-item--focus");
|
||||
if (!currentList.previousElementSibling) {
|
||||
if (config.group === 1) {
|
||||
if (currentList.parentElement.previousElementSibling.previousElementSibling) {
|
||||
currentList.parentElement.previousElementSibling.previousElementSibling.lastElementChild.classList.add("b3-list-item--focus");
|
||||
} else {
|
||||
searchPanelElement.lastElementChild.lastElementChild.classList.add("b3-list-item--focus");
|
||||
}
|
||||
} else {
|
||||
searchPanelElement.lastElementChild.classList.add("b3-list-item--focus");
|
||||
}
|
||||
} else {
|
||||
currentList.previousElementSibling.classList.add("b3-list-item--focus");
|
||||
}
|
||||
currentList = searchPanelElement.querySelector(".b3-list-item--focus");
|
||||
if (searchPanelElement.scrollTop < currentList.offsetTop - searchPanelElement.clientHeight + lineHeight ||
|
||||
searchPanelElement.scrollTop > currentList.offsetTop - lineHeight * 2) {
|
||||
searchPanelElement.scrollTop = currentList.offsetTop - lineHeight * 2;
|
||||
}
|
||||
getArticle({
|
||||
id: currentList.getAttribute("data-node-id"),
|
||||
config,
|
||||
value: searchInputElement.value,
|
||||
edit,
|
||||
});
|
||||
event.preventDefault();
|
||||
} else if (Constants.KEYCODELIST[event.keyCode] === "PageUp") {
|
||||
const previousElement = element.querySelector('[data-type="previous"]');
|
||||
if (!previousElement.getAttribute("disabled")) {
|
||||
if (config.page > 1) {
|
||||
config.page--;
|
||||
inputTimeout = inputEvent(element, config, inputTimeout, edit);
|
||||
}
|
||||
}
|
||||
event.preventDefault();
|
||||
} else if (Constants.KEYCODELIST[event.keyCode] === "PageDown") {
|
||||
const nextElement = element.querySelector('[data-type="next"]');
|
||||
if (!nextElement.getAttribute("disabled")) {
|
||||
if (config.page < parseInt(nextElement.parentElement.querySelector("#searchResult").getAttribute("data-pagecount"))) {
|
||||
config.page++;
|
||||
inputTimeout = inputEvent(element, config, inputTimeout, edit);
|
||||
}
|
||||
}
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
replaceInputElement.addEventListener("keydown", (event: KeyboardEvent) => {
|
||||
if (event.isComposing) {
|
||||
return;
|
||||
}
|
||||
const isHistory = !replaceHistoryElement.classList.contains("fn__none");
|
||||
if (event.key === "Enter") {
|
||||
if (isHistory) {
|
||||
replaceInputElement.value = replaceHistoryElement.querySelector(".b3-list-item--focus").textContent.trim();
|
||||
toggleReplaceHistory(replaceHistoryElement, historyElement, replaceInputElement);
|
||||
} else {
|
||||
replace(element, config, edit, false);
|
||||
}
|
||||
event.preventDefault();
|
||||
}
|
||||
if (event.key === "ArrowDown" && event.altKey) {
|
||||
toggleReplaceHistory(replaceHistoryElement, historyElement, replaceInputElement);
|
||||
return;
|
||||
}
|
||||
if (isHistory) {
|
||||
if (event.key === "Escape") {
|
||||
toggleReplaceHistory(replaceHistoryElement, historyElement, replaceInputElement);
|
||||
} else {
|
||||
upDownHint(replaceHistoryElement, event);
|
||||
}
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
});
|
||||
inputTimeout = inputEvent(element, config, inputTimeout, edit);
|
||||
inputEvent(element, config, edit);
|
||||
return edit;
|
||||
};
|
||||
|
||||
|
|
@ -1132,7 +949,7 @@ const updateConfig = (element: Element, item: ISearchOption, config: ISearchOpti
|
|||
Object.assign(config, item);
|
||||
window.siyuan.storage[Constants.LOCAL_SEARCHDATA] = Object.assign({}, config);
|
||||
setStorageVal(Constants.LOCAL_SEARCHDATA, window.siyuan.storage[Constants.LOCAL_SEARCHDATA]);
|
||||
inputEvent(element, config, undefined, edit);
|
||||
inputEvent(element, config, edit);
|
||||
window.siyuan.menus.menu.remove();
|
||||
};
|
||||
|
||||
|
|
@ -1160,7 +977,7 @@ const renderNextSearchMark = (options: {
|
|||
}
|
||||
};
|
||||
|
||||
const getArticle = (options: {
|
||||
export const getArticle = (options: {
|
||||
id: string,
|
||||
config: ISearchOption,
|
||||
edit: Protyle
|
||||
|
|
@ -1193,7 +1010,7 @@ const getArticle = (options: {
|
|||
});
|
||||
};
|
||||
|
||||
const replace = (element: Element, config: ISearchOption, edit: Protyle, isAll: boolean) => {
|
||||
export const replace = (element: Element, config: ISearchOption, edit: Protyle, isAll: boolean) => {
|
||||
if (config.method === 1 || config.method === 2) {
|
||||
showMessage(window.siyuan.languages._kernel[132]);
|
||||
return;
|
||||
|
|
@ -1278,7 +1095,8 @@ const replace = (element: Element, config: ISearchOption, edit: Protyle, isAll:
|
|||
});
|
||||
};
|
||||
|
||||
const inputEvent = (element: Element, config: ISearchOption, inputTimeout: number, edit: Protyle, rmCurrentCriteria = false) => {
|
||||
export const inputEvent = (element: Element, config: ISearchOption, edit: Protyle, rmCurrentCriteria = false) => {
|
||||
let inputTimeout = parseInt(element.getAttribute("data-timeout") || "0");
|
||||
clearTimeout(inputTimeout);
|
||||
inputTimeout = window.setTimeout(() => {
|
||||
if (rmCurrentCriteria) {
|
||||
|
|
@ -1338,10 +1156,10 @@ const inputEvent = (element: Element, config: ISearchOption, inputTimeout: numbe
|
|||
});
|
||||
}
|
||||
}, Constants.TIMEOUT_INPUT);
|
||||
return inputTimeout;
|
||||
element.setAttribute("data-timeout", inputTimeout.toString());
|
||||
};
|
||||
|
||||
const getAttr =(block:IBlock) => {
|
||||
const getAttr = (block: IBlock) => {
|
||||
let attrHTML = "";
|
||||
if (block.name) {
|
||||
attrHTML += `<span class="b3-list-item__meta fn__flex" style="max-width: 30%"><svg class="b3-list-item__hinticon"><use xlink:href="#iconN"></use></svg><span class="b3-list-item__hinttext">${block.name}</span></span>`;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue