diff --git a/app/src/dialog/processSystem.ts b/app/src/dialog/processSystem.ts index 064dc38b4..26a375a57 100644 --- a/app/src/dialog/processSystem.ts +++ b/app/src/dialog/processSystem.ts @@ -15,6 +15,53 @@ import {escapeHtml} from "../util/escape"; import {getWorkspaceName} from "../util/noRelyPCFunction"; import {needSubscribe} from "../util/needSubscribe"; import {redirectToCheckAuth} from "../util/pathName"; +import {getAllModels} from "../layout/getAll"; +import {reloadProtyle} from "../protyle/util/reload"; + +export const reloadSync = (data:{upsertRootIDs: string[], removeRootIDs: string[]}) => { + const allModels = getAllModels() + allModels.editor.forEach(item => { + if (data.upsertRootIDs.includes(item.editor.protyle.block.rootID)) { + reloadProtyle(item.editor.protyle) + } else if (data.removeRootIDs.includes(item.editor.protyle.block.rootID)) { + item.parent.parent.removeTab(item.parent.id, false, false, false); + } + }) + allModels.graph.forEach(item => { + item.searchGraph(false); + }) + allModels.outline.forEach(item => { + if (item.type === "local" && data.removeRootIDs.includes(item.blockId)) { + item.parent.parent.removeTab(item.parent.id, false, false, false); + } else if (item.type !== "local" || data.upsertRootIDs.includes(item.blockId)){ + fetchPost("/api/outline/getDocOutline", { + id: item.blockId, + }, response => { + item.update(response); + }); + } + }) + allModels.backlink.forEach(item => { + if (item.type === "local" && data.removeRootIDs.includes(item.rootId)) { + item.parent.parent.removeTab(item.parent.id, false, false, false); + } else { + item.refresh(); + } + }) + allModels.files.forEach(item => { + item.init(false); + }) + allModels.bookmark.forEach(item => { + item.update(); + }) + allModels.tag.forEach(item => { + item.update(); + }) + // NOTE asset 无法获取推送地址,先不处理 + allModels.search.forEach(item => { + item.parent.panelElement.querySelector("#searchRefresh").dispatchEvent(new CustomEvent("input")); + }) +} export const lockScreen = () => { if (window.siyuan.config.readonly) { diff --git a/app/src/index.ts b/app/src/index.ts index 3d4d545db..a9c945528 100644 --- a/app/src/index.ts +++ b/app/src/index.ts @@ -17,7 +17,7 @@ import { processSync, progressBackgroundTask, progressLoading, - progressStatus, + progressStatus, reloadSync, setTitle, transactionError } from "./dialog/processSystem"; @@ -53,6 +53,9 @@ class App { msgCallback: (data) => { if (data) { switch (data.cmd) { + case "syncMergeResult": + reloadSync(data.data); + break; case "readonly": window.siyuan.config.editor.readOnly = data.data; updateEditModeElement(); diff --git a/app/src/layout/dock/Backlink.ts b/app/src/layout/dock/Backlink.ts index 28de6bb82..941846d02 100644 --- a/app/src/layout/dock/Backlink.ts +++ b/app/src/layout/dock/Backlink.ts @@ -452,7 +452,7 @@ export class Backlink extends Model { } } - private refresh() { + public refresh() { const element = this.element.querySelector('.block__icon[data-type="refresh"] svg'); element.classList.add("fn__rotate"); fetchPost("/api/ref/refreshBacklink", { diff --git a/app/src/layout/dock/Files.ts b/app/src/layout/dock/Files.ts index 10a338b80..77b63923d 100644 --- a/app/src/layout/dock/Files.ts +++ b/app/src/layout/dock/Files.ts @@ -636,7 +636,7 @@ export class Files extends Model { } } - private init(init = true) { + public init(init = true) { let html = ""; let closeHtml = ""; window.siyuan.notebooks.forEach((item) => { diff --git a/app/src/layout/dock/Tag.ts b/app/src/layout/dock/Tag.ts index 4c68c0268..4ce255934 100644 --- a/app/src/layout/dock/Tag.ts +++ b/app/src/layout/dock/Tag.ts @@ -184,7 +184,7 @@ export class Tag extends Model { setPanelFocus(this.element); } - private update() { + public update() { const element = this.element.querySelector('.block__icon[data-type="refresh"] svg'); if (element.classList.contains("fn__rotate")) { return; diff --git a/app/src/layout/getAll.ts b/app/src/layout/getAll.ts index 81a7c754f..78ec37b68 100644 --- a/app/src/layout/getAll.ts +++ b/app/src/layout/getAll.ts @@ -6,6 +6,9 @@ import {Outline} from "./dock/Outline"; import {Backlink} from "./dock/Backlink"; import {Asset} from "../asset"; import {Search} from "../search"; +import {Files} from "./dock/Files"; +import {Bookmark} from "./dock/Bookmark"; +import {Tag} from "./dock/Tag"; export const getAllModels = () => { const models: IModels = { @@ -14,7 +17,11 @@ export const getAllModels = () => { asset: [], outline: [], backlink: [], - search: [] + search: [], + inbox: [], + files: [], + bookmark: [], + tag: [] }; const getTabs = (layout: Layout) => { for (let i = 0; i < layout.children.length; i++) { @@ -33,6 +40,12 @@ export const getAllModels = () => { models.asset.push(model); } else if (model instanceof Search) { models.search.push(model); + } else if (model instanceof Files) { + models.files.push(model); + } else if (model instanceof Bookmark) { + models.bookmark.push(model); + } else if (model instanceof Tag) { + models.tag.push(model); } } else { getTabs(item as Layout); diff --git a/app/src/types/index.d.ts b/app/src/types/index.d.ts index 0c0b5a41c..748d6c2d7 100644 --- a/app/src/types/index.d.ts +++ b/app/src/types/index.d.ts @@ -651,6 +651,10 @@ declare interface IModels { graph: import("../layout/dock/Graph").Graph[], outline: import("../layout/dock/Outline").Outline[] backlink: import("../layout/dock/Backlink").Backlink[] + inbox: import("../layout/dock/Inbox").Inbox[] + files: import("../layout/dock/Files").Files[] + bookmark: import("../layout/dock/Bookmark").Bookmark[] + tag: import("../layout/dock/Tag").Tag[] asset: import("../asset").Asset[] search: import("../search").Search[] }