diff --git a/src/services/workspaces/getWorkspaceMenuTemplate.ts b/src/services/workspaces/getWorkspaceMenuTemplate.ts index b2cef32b..98a8549c 100644 --- a/src/services/workspaces/getWorkspaceMenuTemplate.ts +++ b/src/services/workspaces/getWorkspaceMenuTemplate.ts @@ -23,7 +23,7 @@ interface IWorkspaceMenuRequiredServices { wiki: Pick; wikiGitWorkspace: Pick; window: Pick; - workspace: Pick; + workspace: Pick; workspaceView: Pick< IWorkspaceViewService, | 'wakeUpWorkspaceView' @@ -114,12 +114,28 @@ export async function getWorkspaceMenuTemplate( label: t('ContextMenu.SyncNow') + (isOnline ? '' : `(${t('ContextMenu.NoNetworkConnection')})`), enabled: isOnline, click: async () => { - const hasChanges = await service.git.commitAndSync(workspace, { remoteUrl: gitUrl, userInfo }); - if (hasChanges) { - if (isSubWiki && mainWikiID !== null) { - await service.workspaceView.restartWorkspaceViewService(mainWikiID); - await service.view.reloadViewsWebContents(mainWikiID); - } else { + if (isSubWiki) { + const hasChanges = await service.git.commitAndSync(workspace, { remoteUrl: gitUrl, userInfo }); + if (hasChanges) { + if (mainWikiID === null) { + await service.workspaceView.restartWorkspaceViewService(id); + await service.view.reloadViewsWebContents(id); + } else { + // reload main workspace to reflect change (do this before watch-fs stable) + await service.workspaceView.restartWorkspaceViewService(mainWikiID); + await service.view.reloadViewsWebContents(mainWikiID); + } + } + } else { + // sync all sub workspace + const mainHasChanges = await service.git.commitAndSync(workspace, { remoteUrl: gitUrl, userInfo }); + const subHasChangesPromise = service.workspace.getSubWorkspacesAsListSync(id).map(async (workspace) => { + const hasChanges = await service.git.commitAndSync(workspace, { remoteUrl: gitUrl, userInfo }); + return hasChanges; + }); + const subHasChange = (await Promise.all(subHasChangesPromise)).some(Boolean); + const hasChange = mainHasChanges || subHasChange; + if (hasChange) { await service.workspaceView.restartWorkspaceViewService(id); await service.view.reloadViewsWebContents(id); } diff --git a/src/services/workspaces/index.ts b/src/services/workspaces/index.ts index 4786008b..14cf4f05 100644 --- a/src/services/workspaces/index.ts +++ b/src/services/workspaces/index.ts @@ -220,6 +220,13 @@ export class Workspace implements IWorkspaceService { return Object.values(this.workspaces).sort(workspaceSorter); } + public getSubWorkspacesAsListSync(workspaceID: string): IWorkspace[] { + const workspace = this.getSync(workspaceID); + if (workspace === undefined) return []; + if (workspace.isSubWiki) return []; + return this.getWorkspacesAsListSync().filter((w) => w.mainWikiID === workspaceID).sort(workspaceSorter); + } + public async get(id: string): Promise { return this.getSync(id); } diff --git a/src/services/workspaces/interface.ts b/src/services/workspaces/interface.ts index fde056c5..d6cf26c6 100644 --- a/src/services/workspaces/interface.ts +++ b/src/services/workspaces/interface.ts @@ -181,6 +181,7 @@ export interface IWorkspaceService { getMetaData: (id: string) => Promise>; getNextWorkspace: (id: string) => Promise; getPreviousWorkspace: (id: string) => Promise; + getSubWorkspacesAsListSync(workspaceID: string): IWorkspace[]; getWorkspaces(): Promise>; getWorkspacesAsList(): Promise; remove(id: string): Promise;