diff --git a/app/src/boot/globalEvent/searchKeydown.ts b/app/src/boot/globalEvent/searchKeydown.ts
index 3995433b6..072e36223 100644
--- a/app/src/boot/globalEvent/searchKeydown.ts
+++ b/app/src/boot/globalEvent/searchKeydown.ts
@@ -3,7 +3,7 @@ import * as path from "path";
/// #endif
import {matchHotKey} from "../../protyle/util/hotKey";
import {fetchPost} from "../../util/fetch";
-import {openFileById} from "../../editor/util";
+import {checkFold, openFileById} from "../../editor/util";
import {Constants} from "../../constants";
import {newFileByName} from "../../util/newFile";
import {App} from "../../index";
@@ -90,19 +90,18 @@ export const searchKeydown = (app: App, event: KeyboardEvent) => {
if (!isAsset) {
if (matchHotKey(window.siyuan.config.keymap.editor.general.insertRight.custom, event)) {
const id = currentList.getAttribute("data-node-id");
- fetchPost("/api/block/checkBlockFold", {id}, (foldResponse) => {
+ checkFold(id, (zoomIn, action) => {
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
+ action,
+ zoomIn
});
if (dialog) {
dialog.destroy({focus: "false"});
}
- });
+ })
return true;
}
const id = currentList.getAttribute("data-node-id");
@@ -197,18 +196,17 @@ export const searchKeydown = (app: App, event: KeyboardEvent) => {
replace(element, config, edit, false);
} else {
const id = currentList.getAttribute("data-node-id");
- fetchPost("/api/block/checkBlockFold", {id}, (foldResponse) => {
+ checkFold(id, (zoomIn, action) => {
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
+ action,
+ zoomIn
});
if (dialog) {
dialog.destroy({focus: "false"});
}
- });
+ })
}
} else {
/// #if !BROWSER
diff --git a/app/src/constants.ts b/app/src/constants.ts
index 97b01d710..917304a18 100644
--- a/app/src/constants.ts
+++ b/app/src/constants.ts
@@ -75,9 +75,9 @@ export abstract class Constants {
public static readonly CB_GET_ALL = "cb-get-all"; // 获取所有块
public static readonly CB_GET_BACKLINK = "cb-get-backlink"; // 悬浮窗为传递型需展示上下文
public static readonly CB_GET_UNUNDO = "cb-get-unundo"; // 不需要记录历史
- public static readonly CB_GET_SCROLL = "cb-get-scroll"; // 滚动到指定位置
+ public static readonly CB_GET_SCROLL = "cb-get-scroll"; // 滚动到指定位置,用于直接打开文档,必有 rootID
public static readonly CB_GET_CONTEXT = "cb-get-context"; // 包含上下文
- public static readonly CB_GET_ROOTSCROLL = "cb-get-rootscroll"; // 如果为 rootID 就滚动到指定位置
+ public static readonly CB_GET_ROOTSCROLL = "cb-get-rootscroll"; // 如果为 rootID 就滚动到指定位置,必有 rootID
public static readonly CB_GET_HTML = "cb-get-html"; // 直接渲染,不需要再 /api/block/getDocInfo,否则搜索表格无法定位
public static readonly CB_GET_HISTORY = "cb-get-history"; // 历史渲染
diff --git a/app/src/editor/index.ts b/app/src/editor/index.ts
index fa5e5a166..f2ee93a01 100644
--- a/app/src/editor/index.ts
+++ b/app/src/editor/index.ts
@@ -19,7 +19,7 @@ export class Editor extends Model {
app: App,
tab: Tab,
blockId: string,
- rootId?: string, // 使用 rootId 会优先使用本地 filepositon 定位
+ rootId: string,
mode?: TEditorMode,
action?: string[],
}) {
@@ -38,7 +38,7 @@ export class Editor extends Model {
private initProtyle(options: {
blockId: string,
action?: string[]
- rootId?: string,
+ rootId: string,
mode?: TEditorMode,
}) {
this.editor = new Protyle(this.app, this.element, {
diff --git a/app/src/editor/util.ts b/app/src/editor/util.ts
index 039577e95..c5f8bc3a6 100644
--- a/app/src/editor/util.ts
+++ b/app/src/editor/util.ts
@@ -28,6 +28,15 @@ import {Search} from "../search";
import {App} from "../index";
import {newCardModel} from "../card/newCardTab";
+export const checkFold = (id: string, cb: (zoomIn: boolean, action: string[]) => void) => {
+ if (!id) {
+ return;
+ }
+ fetchPost("/api/block/checkBlockFold", {id}, (foldResponse) => {
+ cb(foldResponse.data, foldResponse.data ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_ROOTSCROLL])
+ });
+}
+
export const openFileById = async (options: {
app: App,
id: string,
@@ -472,6 +481,7 @@ const newTab = (options: IOpenFileOptions) => {
app: options.app,
tab,
blockId: options.id,
+ rootId: options.rootID,
action: [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS],
});
} else {
@@ -479,6 +489,7 @@ const newTab = (options: IOpenFileOptions) => {
app: options.app,
tab,
blockId: options.id,
+ rootId: options.rootID,
mode: options.mode,
action: options.action,
});
@@ -538,7 +549,7 @@ export const updatePanelByEditor = (options: {
updateOutline(models, options.protyle, options.reload);
updateBacklinkGraph(models, options.protyle);
options.protyle.app.plugins.forEach(item => {
- item.eventBus.emit("switch-protyle", {protyle:options.protyle});
+ item.eventBus.emit("switch-protyle", {protyle: options.protyle});
});
}
};
diff --git a/app/src/layout/Wnd.ts b/app/src/layout/Wnd.ts
index 511d212fd..a3cb753ab 100644
--- a/app/src/layout/Wnd.ts
+++ b/app/src/layout/Wnd.ts
@@ -466,7 +466,7 @@ export class Wnd {
openFileById({
app: this.app,
id: keepCursorId,
- action: [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_ROOTSCROLL]
+ action: [Constants.CB_GET_FOCUS, Constants.CB_GET_SCROLL]
});
}
currentTab.headElement.removeAttribute("keep-cursor");
diff --git a/app/src/layout/dock/Bookmark.ts b/app/src/layout/dock/Bookmark.ts
index df7e2d48f..964289baa 100644
--- a/app/src/layout/dock/Bookmark.ts
+++ b/app/src/layout/dock/Bookmark.ts
@@ -5,8 +5,7 @@ import {setPanelFocus} from "../util";
import {getDockByType} from "../tabUtil";
import {fetchPost} from "../../util/fetch";
import {updateHotkeyTip} from "../../protyle/util/compatibility";
-import {openFileById} from "../../editor/util";
-import {Constants} from "../../constants";
+import {checkFold, openFileById} from "../../editor/util";
import {hasClosestByClassName} from "../../protyle/util/hasClosest";
import {openBookmarkMenu} from "../../menus/bookmark";
import {App} from "../../index";
@@ -84,44 +83,54 @@ export class Bookmark extends Model {
return;
}
}
- const id = element.getAttribute("data-node-id");
- if (id) {
- fetchPost("/api/block/checkBlockFold", {id}, (foldResponse) => {
- openFileById({
- app,
- id,
- action: foldResponse.data ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_ROOTSCROLL],
- zoomIn: foldResponse.data
- });
+ const id = element.getAttribute("data-node-id")
+ checkFold(id, (zoomIn, action: string[]) => {
+ openFileById({
+ app,
+ id,
+ action,
+ zoomIn
});
- }
+ });
},
rightClick: (element: HTMLElement, event: MouseEvent) => {
openBookmarkMenu(element, event, this);
},
- ctrlClick(element: HTMLElement) {
- openFileById({
- app,
- id: element.getAttribute("data-node-id"),
- keepCursor: true,
- action: [Constants.CB_GET_CONTEXT, Constants.CB_GET_ROOTSCROLL]
- });
+ ctrlClick: (element: HTMLElement) => {
+ const id = element.getAttribute("data-node-id")
+ checkFold(id, (zoomIn, action: string[]) => {
+ openFileById({
+ app,
+ id,
+ keepCursor: true,
+ action,
+ zoomIn
+ });
+ })
},
- altClick(element: HTMLElement) {
- openFileById({
- app,
- id: element.getAttribute("data-node-id"),
- position: "right",
- action: [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_ROOTSCROLL]
- });
+ altClick: (element: HTMLElement,) => {
+ const id = element.getAttribute("data-node-id")
+ checkFold(id, (zoomIn, action: string[]) => {
+ openFileById({
+ app,
+ id,
+ position: "bottom",
+ action,
+ zoomIn
+ });
+ })
},
- shiftClick(element: HTMLElement) {
- openFileById({
- app,
- id: element.getAttribute("data-node-id"),
- position: "bottom",
- action: [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_ROOTSCROLL]
- });
+ shiftClick: (element: HTMLElement) => {
+ const id = element.getAttribute("data-node-id")
+ checkFold(id, (zoomIn, action: string[]) => {
+ openFileById({
+ app,
+ id,
+ position: "bottom",
+ action,
+ zoomIn
+ });
+ })
},
blockExtHTML: '',
topExtHTML: '',
diff --git a/app/src/layout/dock/Graph.ts b/app/src/layout/dock/Graph.ts
index 9d483e328..3342a9bf0 100644
--- a/app/src/layout/dock/Graph.ts
+++ b/app/src/layout/dock/Graph.ts
@@ -7,7 +7,7 @@ import {addScript} from "../../protyle/util/addScript";
import {BlockPanel} from "../../block/Panel";
import {fullscreen} from "../../protyle/breadcrumb/action";
import {fetchPost} from "../../util/fetch";
-import {isCurrentEditor, openFileById} from "../../editor/util";
+import {checkFold, isCurrentEditor, openFileById} from "../../editor/util";
import {updateHotkeyTip} from "../../protyle/util/compatibility";
import {openGlobalSearch} from "../../search/util";
import {App} from "../../index";
@@ -652,19 +652,25 @@ export class Graph extends Model {
return;
}
if (window.siyuan.shiftIsPressed) {
- openFileById({
- app: this.app,
- id: node.id,
- position: "bottom",
- action: [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_ROOTSCROLL]
- });
+ checkFold(node.id, (zoomIn, action: string[]) => {
+ openFileById({
+ app: this.app,
+ id: node.id,
+ position: "bottom",
+ action,
+ zoomIn
+ });
+ })
} else if (window.siyuan.altIsPressed) {
- openFileById({
- app: this.app,
- id: node.id,
- position: "right",
- action: [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_ROOTSCROLL]
- });
+ checkFold(node.id, (zoomIn, action: string[]) => {
+ openFileById({
+ app: this.app,
+ id: node.id,
+ position: "right",
+ action,
+ zoomIn
+ });
+ })
} else if (window.siyuan.ctrlIsPressed) {
window.siyuan.blockPanels.push(new BlockPanel({
app: this.app,
@@ -674,11 +680,14 @@ export class Graph extends Model {
nodeIds: [node.id],
}));
} else {
- openFileById({
- app: this.app,
- id: node.id,
- action: [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_ROOTSCROLL]
- });
+ checkFold(node.id, (zoomIn, action: string[]) => {
+ openFileById({
+ app: this.app,
+ id: node.id,
+ action,
+ zoomIn
+ });
+ })
}
});
}, 1000);
diff --git a/app/src/layout/tabUtil.ts b/app/src/layout/tabUtil.ts
index 3d1beb44d..05d14de5c 100644
--- a/app/src/layout/tabUtil.ts
+++ b/app/src/layout/tabUtil.ts
@@ -235,7 +235,8 @@ export const copyTab = (app: App, tab: Tab) => {
model = new Editor({
app,
tab: newTab,
- blockId: tab.model.editor.protyle.block.id
+ blockId: tab.model.editor.protyle.block.id,
+ rootId: tab.model.editor.protyle.block.rootID
});
} else if (tab.model instanceof Asset) {
model = new Asset({
diff --git a/app/src/mobile/editor.ts b/app/src/mobile/editor.ts
index b408431dd..a7394d544 100644
--- a/app/src/mobile/editor.ts
+++ b/app/src/mobile/editor.ts
@@ -60,6 +60,7 @@ export const openMobileFileById = (app: App, id: string, action = [Constants.CB_
} else {
window.siyuan.mobile.editor = new Protyle(app, document.getElementById("editor"), {
blockId: id,
+ rootId: data.data.rootID,
action,
render: {
scroll: true,
diff --git a/app/src/mobile/util/initFramework.ts b/app/src/mobile/util/initFramework.ts
index 0abd376de..1e48b1062 100644
--- a/app/src/mobile/util/initFramework.ts
+++ b/app/src/mobile/util/initFramework.ts
@@ -20,6 +20,7 @@ import {syncGuide} from "../../sync/syncGuide";
import {Inbox} from "../../layout/dock/Inbox";
import {App} from "../../index";
import {setTitle} from "../../dialog/processSystem";
+import {checkFold} from "../../editor/util";
export const initFramework = (app: App, isStart: boolean) => {
setInlineStyle();
@@ -134,7 +135,9 @@ export const initFramework = (app: App, isStart: boolean) => {
} else {
fetchPost("/api/block/getRecentUpdatedBlocks", {}, (response) => {
if (response.data.length !== 0) {
- openMobileFileById(app, response.data[0].id, [Constants.CB_GET_HL, Constants.CB_GET_CONTEXT, Constants.CB_GET_ROOTSCROLL]);
+ checkFold(response.data[0].id, (zoomIn) => {
+ openMobileFileById(app, response.data[0].id, zoomIn ? [Constants.CB_GET_ALL, Constants.CB_GET_HL] : [Constants.CB_GET_HL, Constants.CB_GET_CONTEXT, Constants.CB_GET_ROOTSCROLL]);
+ });
} else {
setEmpty(app);
}
diff --git a/app/src/protyle/index.ts b/app/src/protyle/index.ts
index 552490811..5195f48bc 100644
--- a/app/src/protyle/index.ts
+++ b/app/src/protyle/index.ts
@@ -228,44 +228,22 @@ export class Protyle {
removeLoading(this.protyle);
return;
}
- const filePosition = window.siyuan.storage[Constants.LOCAL_FILEPOSITION][options.blockId] ||
- window.siyuan.storage[Constants.LOCAL_FILEPOSITION][options.rootId];
+
if (this.protyle.options.mode !== "preview" &&
- !mergedOptions.action.includes(Constants.CB_GET_ALL) &&
- (mergedOptions.action.includes(Constants.CB_GET_SCROLL) || mergedOptions.action.includes(Constants.CB_GET_ROOTSCROLL)) &&
- filePosition) {
+ options.rootId && window.siyuan.storage[Constants.LOCAL_FILEPOSITION][options.rootId] &&
+ (
+ mergedOptions.action.includes(Constants.CB_GET_SCROLL) ||
+ (mergedOptions.action.includes(Constants.CB_GET_ROOTSCROLL) && options.rootId === options.blockId)
+ )
+ ) {
getDocByScroll({
protyle: this.protyle,
- scrollAttr: filePosition,
+ scrollAttr: window.siyuan.storage[Constants.LOCAL_FILEPOSITION][options.rootId],
mergedOptions,
cb: () => {
this.afterOnGet(mergedOptions);
}
});
- } else if (this.protyle.options.mode !== "preview" &&
- (mergedOptions.action.includes(Constants.CB_GET_SCROLL) || mergedOptions.action.includes(Constants.CB_GET_ROOTSCROLL))) {
- fetchPost("/api/block/getDocInfo", {
- id: options.blockId
- }, (response) => {
- if (!mergedOptions.action.includes(Constants.CB_GET_SCROLL) &&
- response.data.rootID !== options.blockId && mergedOptions.action.includes(Constants.CB_GET_ROOTSCROLL)) {
- // 打开根文档保持上一次历史,否则按照原有 action 执行 https://github.com/siyuan-note/siyuan/issues/9082
- this.getDoc(mergedOptions);
- return;
- }
- if (window.siyuan.storage[Constants.LOCAL_FILEPOSITION][response.data.rootID]) {
- getDocByScroll({
- protyle: this.protyle,
- scrollAttr: window.siyuan.storage[Constants.LOCAL_FILEPOSITION][response.data.rootID],
- mergedOptions,
- cb: () => {
- this.afterOnGet(mergedOptions);
- }
- });
- } else {
- this.getDoc(mergedOptions);
- }
- });
} else {
this.getDoc(mergedOptions);
}
diff --git a/app/src/search/util.ts b/app/src/search/util.ts
index 90ebc75d9..ce7a39118 100644
--- a/app/src/search/util.ts
+++ b/app/src/search/util.ts
@@ -5,7 +5,7 @@ import * as path from "path";
import {Constants} from "../constants";
import {escapeAriaLabel, escapeGreat, escapeHtml} from "../util/escape";
import {fetchPost} from "../util/fetch";
-import {openFile, openFileById} from "../editor/util";
+import {checkFold, openFile, openFileById} from "../editor/util";
import {showMessage} from "../dialog/message";
import {reloadProtyle} from "../protyle/util/reload";
import {MenuItem} from "../menus/Menu";
@@ -865,19 +865,18 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
} else {
if (event.altKey) {
const id = target.getAttribute("data-node-id");
- fetchPost("/api/block/checkBlockFold", {id}, (foldResponse) => {
+ checkFold(id, (zoomIn, action) => {
openFileById({
app,
id,
- action: foldResponse.data ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL] :
- (id === target.getAttribute("data-root-id") ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ROOTSCROLL] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT]),
- zoomIn: foldResponse.data,
+ action,
+ zoomIn,
position: "right"
});
if (closeCB) {
closeCB();
}
- });
+ })
} else if (!target.classList.contains("b3-list-item--focus")) {
searchPanelElement.querySelector(".b3-list-item--focus").classList.remove("b3-list-item--focus");
target.classList.add("b3-list-item--focus");
@@ -906,18 +905,17 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
/// #endif
} else {
const id = target.getAttribute("data-node-id");
- fetchPost("/api/block/checkBlockFold", {id}, (foldResponse) => {
+ checkFold(id, (zoomIn, action) => {
openFileById({
app,
id,
- action: foldResponse.data ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL] :
- (id === target.getAttribute("data-root-id") ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ROOTSCROLL] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT]),
- zoomIn: foldResponse.data
+ action,
+ zoomIn
});
if (closeCB) {
closeCB();
}
- });
+ })
}
}
window.siyuan.menus.menu.remove();
diff --git a/app/src/util/backForward.ts b/app/src/util/backForward.ts
index 2e183f2f2..a69c433fc 100644
--- a/app/src/util/backForward.ts
+++ b/app/src/util/backForward.ts
@@ -57,6 +57,7 @@ const focusStack = async (app: App, stack: IBackStack) => {
app: app,
tab,
blockId: stack.zoomId || stack.protyle.block.rootID,
+ rootId: stack.protyle.block.rootID,
action: stack.zoomId ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL] : [Constants.CB_GET_FOCUS]
});
tab.addModel(editor);