Files
ignis/plugin/src/settings/inject.js

118 lines
3.0 KiB
JavaScript
Raw Normal View History

2026-03-27 19:53:19 +01:00
const generalTab = require("./general-tab");
const serverPluginsTab = require("./server-plugins-tab");
const { createNavEl, createTab, createGroup } = require("./settings-ui");
const {
setupPluginTabs,
reconcilePluginTabs,
hideIgnisFromCommunityPlugins,
restoreCommunityPlugins,
2026-03-30 21:05:47 +02:00
clearOwnedPluginIds,
} = require("./plugin-tabs");
function removeExistingIgnisGroups(tabHeadersEl) {
const groups = tabHeadersEl.querySelectorAll(".vertical-tab-header-group");
for (const g of groups) {
const title = g.querySelector(".vertical-tab-header-group-title");
if (
title?.textContent === "Ignis" ||
title?.textContent === "Ignis Core Plugins"
) {
g.remove();
}
}
}
2026-03-30 21:05:47 +02:00
// All ignis-managed nav elements (both Ignis group and Ignis Core Plugins group).
// Collected here so the openTab patch can manage is-active across all of them.
const allIgnisNavEls = new Map(); // tab id -> nav element
function patchOpenTab(setting) {
if (setting._ignisOpenTabPatched) {
return;
}
const original = setting.openTab.bind(setting);
setting.openTab = function (tab) {
// Clear is-active from all ignis nav items.
for (const [, el] of allIgnisNavEls) {
el.removeClass("is-active");
}
original(tab);
// If the opened tab is one of ours, highlight it.
const navEl = allIgnisNavEls.get(tab.id);
if (navEl) {
navEl.addClass("is-active");
}
};
setting._ignisOpenTabPatched = true;
}
2026-03-28 14:52:41 +01:00
function injectIgnisSettings(setting, app) {
removeExistingIgnisGroups(setting.tabHeadersEl);
2026-03-30 21:05:47 +02:00
clearOwnedPluginIds();
allIgnisNavEls.clear();
patchOpenTab(setting);
2026-03-28 14:52:41 +01:00
const ignis = createGroup("Ignis");
2026-03-27 19:53:19 +01:00
const tabs = [
2026-03-28 14:58:17 +01:00
createTab("ignis-general", "General", generalTab.display, app, "flame"),
2026-03-28 14:52:41 +01:00
createTab(
"ignis-core-plugins",
"Core plugins",
serverPluginsTab.display,
app,
2026-03-28 14:58:17 +01:00
"blocks",
2026-03-28 14:52:41 +01:00
),
2026-03-27 19:53:19 +01:00
];
for (const tab of tabs) {
tab.navEl = createNavEl(tab, setting);
2026-03-28 14:52:41 +01:00
ignis.items.appendChild(tab.navEl);
2026-03-30 21:05:47 +02:00
allIgnisNavEls.set(tab.id, tab.navEl);
2026-03-27 19:53:19 +01:00
}
2026-03-28 14:52:41 +01:00
setting.tabHeadersEl.appendChild(ignis.group);
const corePlugins = createGroup("Ignis Core Plugins");
setting.tabHeadersEl.appendChild(corePlugins.group);
hideIgnisFromCommunityPlugins(setting);
2026-03-30 21:05:47 +02:00
setupPluginTabs(setting, corePlugins.items, allIgnisNavEls);
2026-03-27 19:53:19 +01:00
}
function patchSettingsModal(plugin) {
const original = plugin.app.setting.onOpen;
2026-03-27 23:11:19 +01:00
const app = plugin.app;
2026-03-27 19:53:19 +01:00
plugin._originalOnOpen = original;
plugin.app.setting.onOpen = function () {
original.call(this);
2026-03-27 23:11:19 +01:00
injectIgnisSettings(this, app);
2026-03-27 19:53:19 +01:00
};
}
function unpatchSettingsModal(plugin) {
if (plugin._originalOnOpen) {
plugin.app.setting.onOpen = plugin._originalOnOpen;
}
2026-03-30 21:05:47 +02:00
delete plugin.app.setting._ignisOpenTabPatched;
restoreCommunityPlugins(plugin.app.setting);
2026-03-30 21:05:47 +02:00
clearOwnedPluginIds();
2026-03-27 19:53:19 +01:00
}
2026-03-30 21:05:47 +02:00
window.__ignisReconcilePluginTabs = (setting) =>
reconcilePluginTabs(setting, allIgnisNavEls);
module.exports = { patchSettingsModal, unpatchSettingsModal, reconcilePluginTabs };