From bd6161bd31732b7ef66e2768af7e95dc90a353f3 Mon Sep 17 00:00:00 2001 From: Nystik <236107-Nystik@users.noreply.gitlab.com> Date: Fri, 3 Apr 2026 12:19:24 +0200 Subject: [PATCH] add "open workspace in tab" command --- plugin/src/main.js | 9 +++++++++ plugin/src/workspace-picker.js | 31 +++++++++++++++++++++++++++++++ src/shims/workspace.js | 12 ++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 plugin/src/workspace-picker.js diff --git a/plugin/src/main.js b/plugin/src/main.js index 391a967..d6772bb 100644 --- a/plugin/src/main.js +++ b/plugin/src/main.js @@ -3,6 +3,7 @@ const { showFilePicker, addFileMenuItems, addFolderMenuItems } = require("./file const { patchSettingsModal, unpatchSettingsModal } = require("./settings/inject"); const pluginRegistry = require("./plugin-registry"); const { initStatusBar } = require("./status-bar"); +const { WorkspacePickerModal } = require("./workspace-picker"); window.__obsidianAPI = require("obsidian"); @@ -18,6 +19,14 @@ class IgnisBridgePlugin extends Plugin { showFilePicker(this.app); }); + this.addCommand({ + id: "open-workspace-in-new-tab", + name: "Open workspace in new tab", + callback: () => { + new WorkspacePickerModal(this.app).open(); + }, + }); + this.registerEvent( this.app.workspace.on("file-menu", (menu, file) => { if (file instanceof TFile) { diff --git a/plugin/src/workspace-picker.js b/plugin/src/workspace-picker.js new file mode 100644 index 0000000..6700cdb --- /dev/null +++ b/plugin/src/workspace-picker.js @@ -0,0 +1,31 @@ +const { FuzzySuggestModal } = require("obsidian"); + +class WorkspacePickerModal extends FuzzySuggestModal { + constructor(app) { + super(app); + this.setPlaceholder("Open workspace in new tab"); + } + + getItems() { + const plugin = this.app.internalPlugins.plugins.workspaces; + + if (!plugin || !plugin.enabled || !plugin.instance) { + return []; + } + + return Object.keys(plugin.instance.workspaces); + } + + getItemText(item) { + return item; + } + + onChooseItem(item) { + const url = new URL(window.location.href); + + url.searchParams.set("workspace", item); + window.open(url.toString(), "_blank"); + } +} + +module.exports = { WorkspacePickerModal }; diff --git a/src/shims/workspace.js b/src/shims/workspace.js index 0b30c31..d9f8a42 100644 --- a/src/shims/workspace.js +++ b/src/shims/workspace.js @@ -178,6 +178,18 @@ export function initWorkspacePatch() { return data; }); + // Relay watcher events for workspaces.json to the plugin's config change handler, + // so creating/deleting workspaces in one tab updates the menu in other tabs. + fsShim.watch(".obsidian", (eventType, filename) => { + if (filename === "workspaces.json") { + plugin.loadData().then((data) => { + if (data) { + instance.workspaces = data.workspaces || {}; + } + }); + } + }); + console.log("[ignis] Workspaces plugin patched, workspace:", window.__workspaceName || "(none)"); });