Files
overlord/Overlord-Server/public/assets/nav/plugins-loader.js
T
2026-08-24 09:35:03 -05:00

58 lines
1.7 KiB
JavaScript

import { dropdownItem, sidebarChild } from "./template.js";
export async function loadPluginNavItems(activeMap) {
try {
const res = await fetch("/api/plugins");
if (!res.ok) return;
const data = await res.json();
const plugins = data.plugins;
if (!plugins || !Array.isArray(plugins)) return;
const navPlugins = plugins.filter(
(p) => p && typeof p === "object" && p.navbar && p.enabled
);
if (navPlugins.length === 0) return;
const isSidebar = document.querySelector(".sb-group[data-group='plugin_apps']");
const wg = document.querySelector(".nav-dd-wrapper[data-group='plugin_apps']");
const container = isSidebar ? document.querySelector(".sb-group[data-group='plugin_apps']") : wg;
if (!container) return;
const childContainer = isSidebar
? container.querySelector(".sb-group-children")
: container.querySelector(".nav-dd-menu");
if (!childContainer) return;
const itemsHtml = navPlugins.map((p) => {
const pluginId = String(p.id || "").trim();
if (
!/^[A-Za-z0-9_-][A-Za-z0-9._-]{0,127}$/.test(pluginId) ||
pluginId.includes("..") ||
pluginId.endsWith(".")
) return "";
const linkId = `plugin-nav-${pluginId}`;
activeMap[`/plugins/${pluginId}`] = linkId;
const childObj = {
href: `/plugins/${pluginId}`,
label: p.navbar.label || p.name,
icon: p.navbar.icon || "fa-cube",
iconColor: "text-slate-300",
linkId: linkId,
};
return isSidebar ? sidebarChild(childObj) : dropdownItem(childObj);
}).join("");
childContainer.innerHTML = itemsHtml;
container.classList.remove("hidden");
} catch (err) {
console.error("Failed to load plugin nav items", err);
}
}