From 59d7c3559c3a2c2f2076756f6bc0009afa608e57 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Tue, 10 Mar 2026 22:48:54 +0100 Subject: [PATCH] feat(clickTtHttpPageRoutes, ClickTtView): implement proxy navigation script and enhance URL selection - Added a new function to inject a navigation script into HTML responses, enabling seamless proxy navigation for links and form submissions. - Updated the ClickTtView component to include new preset URL options for HTTV and TTDE login, improving user experience by providing quick access to common links. - Adjusted form handling logic to support the new preset URLs, ensuring proper URL management during proxy interactions. --- backend/routes/clickTtHttpPageRoutes.js | 82 +++++++++++++++++++++++++ frontend/src/views/ClickTtView.vue | 26 ++++---- 2 files changed, 95 insertions(+), 13 deletions(-) diff --git a/backend/routes/clickTtHttpPageRoutes.js b/backend/routes/clickTtHttpPageRoutes.js index 2f2c3acc..2cecd490 100644 --- a/backend/routes/clickTtHttpPageRoutes.js +++ b/backend/routes/clickTtHttpPageRoutes.js @@ -159,6 +159,86 @@ function rewriteFormActionsInHtml(html, proxyBaseUrl, pageBaseUrl, sid) { } } +function injectProxyNavigationScript(html, proxyBaseUrl, pageBaseUrl, sid) { + if (!html || !proxyBaseUrl || !pageBaseUrl) return html; + + const script = ` +`; + + if (/<\/body>/i.test(html)) { + return html.replace(/<\/body>/i, `${script}`); + } + + return html + script; +} + /** * GET /api/clicktt/proxy * Proxy für iframe-Einbettung – liefert HTML direkt (ohne Auth, für iframe src). @@ -248,6 +328,7 @@ router.get('/proxy', async (req, res, next) => { html = rewriteLinksInHtml(html, proxyBase, effectivePageUrl, sid); html = rewriteFormActionsInHtml(html, proxyBase, effectivePageUrl, sid); html = rewriteMetaRefreshInHtml(html, proxyBase, effectivePageUrl, sid); + html = injectProxyNavigationScript(html, proxyBase, effectivePageUrl, sid); res.set({ 'Content-Type': 'text/html; charset=utf-8', @@ -344,6 +425,7 @@ router.post('/proxy', async (req, res, next) => { responseBody = rewriteLinksInHtml(responseBody, proxyBase, effectivePageUrl, sid); responseBody = rewriteFormActionsInHtml(responseBody, proxyBase, effectivePageUrl, sid); responseBody = rewriteMetaRefreshInHtml(responseBody, proxyBase, effectivePageUrl, sid); + responseBody = injectProxyNavigationScript(responseBody, proxyBase, effectivePageUrl, sid); } res.set({ diff --git a/frontend/src/views/ClickTtView.vue b/frontend/src/views/ClickTtView.vue index 91638605..fcd963ed 100644 --- a/frontend/src/views/ClickTtView.vue +++ b/frontend/src/views/ClickTtView.vue @@ -17,10 +17,12 @@ + + -
+
-
+
-
- - -
-
0; } + if (pageType.value.startsWith('preset:')) { + return true; + } if (pageType.value === 'clubInfo') { return clubId.value.trim().length > 0; } @@ -126,6 +124,8 @@ export default { if (pageType.value === 'url') { params.set('url', directUrl.value.trim()); + } else if (pageType.value.startsWith('preset:')) { + params.set('url', presetUrls[pageType.value]); } else { params.set('type', pageType.value); params.set('association', association.value);