From 71454946e58237e1568a4ad77b322682920d7cb4 Mon Sep 17 00:00:00 2001 From: "Claude (Chronicler #61)" Date: Sun, 5 Apr 2026 10:07:51 +0000 Subject: [PATCH] fix: Remove EJS includes for express-ejs-layouts compatibility express-ejs-layouts doesn't support nested includes. Changed scheduler.ejs to inline the table HTML. Changed routes to return raw HTML for HTMX partials instead of rendering. Signed-off-by: Claude (Chronicler #61) --- .../arbiter-3.0/src/routes/admin/scheduler.js | 103 ++++++++++++++++-- .../arbiter-3.0/src/views/admin/scheduler.ejs | 54 ++++++++- 2 files changed, 149 insertions(+), 8 deletions(-) diff --git a/services/arbiter-3.0/src/routes/admin/scheduler.js b/services/arbiter-3.0/src/routes/admin/scheduler.js index f72041b..6235a5b 100644 --- a/services/arbiter-3.0/src/routes/admin/scheduler.js +++ b/services/arbiter-3.0/src/routes/admin/scheduler.js @@ -40,7 +40,52 @@ router.get('/table-only', async (req, res) => { ORDER BY s.node, s.sort_order `); - res.render('admin/partials/scheduler-table', { servers: serversResult.rows }); + const servers = serversResult.rows; + + let html = ` + + + + + + + + + + + `; + + if (servers.length === 0) { + html += ``; + } else { + servers.forEach(server => { + const nodeClass = server.node === 'TX1' ? 'bg-fire/20 text-fire' : 'bg-frost/20 text-frost'; + let statusHtml; + if (server.sync_status === 'SUCCESS') { + statusHtml = `● Synced`; + } else if (server.sync_status === 'FAILED') { + statusHtml = `✕ Error`; + } else { + statusHtml = `○ Pending`; + } + const skipClass = server.skip_restart ? 'bg-red-600 text-white' : 'bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-300'; + const skipText = server.skip_restart ? 'Skipped' : 'Active'; + + html += ` + + + + + + + `; + }); + } + + html += `
ServerNodeRestart Time (UTC)StatusSkip
No servers imported yet. Click "Import Servers" to populate from Pterodactyl.
${server.server_name}${server.node}${server.effective_time || 'Not set'}${statusHtml} + +
`; + res.send(html); } catch (err) { res.status(500).send('Error loading table'); } @@ -167,12 +212,56 @@ router.get('/audit/:node', async (req, res) => { await sleep(200); // Rate limiting } - res.render('admin/partials/audit-modal', { - node, - results, - totalRogue, - serverCount: results.length - }); + let html = `
+
`; + + if (totalRogue > 0) { + const nukePayload = []; + results.forEach(r => r.rogueSchedules.forEach(s => nukePayload.push({ + serverId: r.serverId, scheduleId: s.id, scheduleName: s.name + }))); + + html += `

⚠ Conflicts Detected

+

+ Found ${totalRogue} rogue restart schedule(s) across + ${results.length} server(s) on ${node}. + These must be removed before Trinity can take control. +

+
+
    `; + + results.forEach(result => { + html += `
  • + ${result.serverName} +
      `; + result.rogueSchedules.forEach(sched => { + html += `
    • - "${sched.name}" (Cron: ${sched.cron})
    • `; + }); + html += `
  • `; + }); + + html += `
+
+ +
+ + +
+
`; + } else { + html += `

✓ All Clear

+

No conflicts found on ${node}. Trinity is ready to take control.

+
+ +
`; + } + + html += `
`; + res.send(html); } catch (err) { console.error('Audit error:', err); res.status(500).send('Error running audit'); diff --git a/services/arbiter-3.0/src/views/admin/scheduler.ejs b/services/arbiter-3.0/src/views/admin/scheduler.ejs index 9116acb..41dddc2 100644 --- a/services/arbiter-3.0/src/views/admin/scheduler.ejs +++ b/services/arbiter-3.0/src/views/admin/scheduler.ejs @@ -62,7 +62,59 @@
- <%- include('scheduler/table', { servers: servers }) %> + + + + + + + + + + + + + <% if (servers.length === 0) { %> + + + + <% } else { %> + <% servers.forEach((server, i) => { %> + + + + + + + + + <% }) %> + <% } %> + +
ServerNodeRestart Time (UTC)StatusSkip
+ No servers imported yet. Click "Import Servers" to populate from Pterodactyl. +
+ + <%= server.server_name %> + + <%= server.node %> + + <%= server.effective_time || 'Not set' %> + <% if (server.sync_status === 'SUCCESS') { %> + ● Synced + <% } else if (server.sync_status === 'FAILED') { %> + ✕ Error + <% } else { %> + ○ Pending + <% } %> + + +