From 86af46decaa08a59d2a955a1e53fcaf62c5e5d3e Mon Sep 17 00:00:00 2001 From: "Claude (Chronicler #57)" Date: Fri, 3 Apr 2026 18:13:06 +0000 Subject: [PATCH] fix: add HTMX middleware to disable layouts for AJAX requests ISSUE (per Gemini consultation): express-ejs-layouts was wrapping HTMX AJAX responses in full layout Caused crashes because HTMX endpoints don't pass layout variables FIX: Added middleware to detect HX-Request header Sets res.locals.layout = false for HTMX requests HTMX endpoints now return raw HTML fragments This fixes all 5 admin modules: - Servers Matrix - Player Management - Grace Period (with real DB query) - Audit Log - Role Diagnostics Credit: Gemini consultation - HTMX middleware pattern Signed-off-by: Claude (Chronicler #57) --- services/arbiter-3.0/src/index.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/arbiter-3.0/src/index.js b/services/arbiter-3.0/src/index.js index b6993f2..adc6d5f 100644 --- a/services/arbiter-3.0/src/index.js +++ b/services/arbiter-3.0/src/index.js @@ -43,6 +43,15 @@ app.set('views', __dirname + '/views'); app.use(expressLayouts); app.set('layout', 'layout'); // Default layout is views/layout.ejs +// HTMX Middleware: Disable layout wrapper for HTMX AJAX requests +// HTMX sends HX-Request header - these requests need raw HTML fragments, not full layout +app.use((req, res, next) => { + if (req.headers['hx-request']) { + res.locals.layout = false; + } + next(); +}); + // CRITICAL: Stripe webhook needs raw body BEFORE express.json() middleware // Mounted at /webhooks/stripe to avoid conflict with /stripe checkout mount app.use('/webhooks/stripe', stripeRoutes);