From 7dc556e16f56d18f2bb185ed5ac07d0bc18fee66 Mon Sep 17 00:00:00 2001 From: Shni Date: Wed, 15 Oct 2025 01:24:21 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20A=C3=B1adir=20soporte=20para=20navegaci?= =?UTF-8?q?=C3=B3n=20de=20fragmentos=20en=20el=20panel=20de=20control=20y?= =?UTF-8?q?=20mejorar=20la=20gesti=C3=B3n=20de=20roles=20de=20staff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/server.ts | 36 +++++++++++++++ src/server/views/pages/dashboard.ejs | 66 +++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/src/server/server.ts b/src/server/server.ts index 8f5da22..b3f130f 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -1192,6 +1192,42 @@ export const server = createServer( // ignore; fallback to no roles } // Render dashboard with selected guild context; show dashboard nav + // If caller requested a fragment, render only the page template (no layout) + const fragment = + url.searchParams.get("fragment") || url.searchParams.get("ajax"); + if (fragment) { + const pageFile = path.join(viewsDir, "pages", `${page}.ejs`); + const pageLocals = { + appName: pkg.name ?? "Amayo Bot", + user, + guilds, + selectedGuild: guildId, + selectedGuildId: guildId, + selectedGuildName, + guildConfig, + guildRoles, + page, + hideNavbar: false, + useDashboardNav: true, + }; + try { + const fragmentHtml = await ejs.renderFile(pageFile, pageLocals, { + async: true, + }); + res.writeHead( + 200, + applySecurityHeadersForRequest(req, { + "Content-Type": "text/html; charset=utf-8", + }) + ); + res.end(fragmentHtml); + return; + } catch (err) { + console.warn("Failed rendering page fragment:", err); + // fallthrough to full render + } + } + await renderTemplate(req, res, "dashboard", { appName: pkg.name ?? "Amayo Bot", user, diff --git a/src/server/views/pages/dashboard.ejs b/src/server/views/pages/dashboard.ejs index 0151ba5..853a262 100644 --- a/src/server/views/pages/dashboard.ejs +++ b/src/server/views/pages/dashboard.ejs @@ -44,6 +44,7 @@ <% } %> +
<% if (typeof page !== 'undefined' && page === 'settings' && selectedGuild) { %>
@@ -73,8 +74,20 @@ <% }) %> <% } else { %> - -
No se pudo obtener roles desde la API. Introduce IDs manualmente separadas por coma.
+ <% const fallbackStaff = (guildConfig && Array.isArray(guildConfig.staff) ? guildConfig.staff.map(String) : (guildConfig && guildConfig.staff ? String(guildConfig.staff).split(',') : [])) || []; %> + <% if (fallbackStaff.length) { %> +
+ +
+ + <% } else { %> + +
No se pudo obtener roles desde la API ni hay roles guardados. Introduce IDs manualmente separadas por coma.
+ <% } %> <% } %>
@@ -133,7 +146,56 @@ }); })(); + <% } %> +
+ +