diff --git a/public/app.js b/public/app.js index 31a58e9..3b2883e 100644 --- a/public/app.js +++ b/public/app.js @@ -934,6 +934,7 @@ document.addEventListener("DOMContentLoaded", () => { if (CURRENT_PAGE === 'wiki') initWikiPage(); if (CURRENT_PAGE === 'agents') initAgentsPage(); if (CURRENT_PAGE === 'usage') initUsagePage(); + if (CURRENT_PAGE === 'gitea') initGiteaPage(); }); // ============ GITEA DASHBOARD ============ @@ -1140,3 +1141,130 @@ if (document.querySelector('.gitea-dashboard')) { } }, 30000); } + +// ============ GITEA PAGE ============ +let giteaData = { repos: [], prs: [], activity: [] }; + +function initGiteaPage() { + loadGiteaData(); + + document.getElementById('refresh-gitea')?.addEventListener('click', loadGiteaData); + + // Tab switching + document.querySelectorAll('.tab-btn').forEach(btn => { + btn.addEventListener('click', (e) => { + const tab = e.target.dataset.tab; + document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active')); + document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active')); + e.target.classList.add('active'); + document.getElementById(`tab-${tab}`)?.classList.add('active'); + }); + }); +} + +async function loadGiteaData() { + try { + const [swarmRes, reviewsRes, activityRes] = await Promise.all([ + fetch('/api/gitea/swarm'), + fetch('/api/gitea/reviews'), + fetch('/api/gitea/activity') + ]); + + giteaData.repos = await swarmRes.json(); + giteaData.prs = await reviewsRes.json(); + giteaData.activity = await activityRes.json(); + + renderGiteaStats(); + renderGiteaRepos(); + renderGiteaPRs(); + renderGiteaActivity(); + } catch (err) { + console.error('Failed to load Gitea data:', err); + } +} + +function renderGiteaStats() { + document.getElementById('stat-repos').textContent = giteaData.repos.length; + + const totalPRs = giteaData.repos.reduce((sum, r) => sum + (r.open_prs || 0), 0); + document.getElementById('stat-prs').textContent = totalPRs; + + const pendingReviews = giteaData.prs.filter(p => p.review_required).length; + document.getElementById('stat-reviews').textContent = pendingReviews; +} + +function renderGiteaRepos() { + const grid = document.getElementById('repos-grid'); + if (!grid) return; + + if (!giteaData.repos.length) { + grid.innerHTML = '
No repositories found
'; + return; + } + + grid.innerHTML = giteaData.repos.map(repo => ` +${escapeHtml(repo.full_name || '')}
+ +No open pull requests
'; + return; + } + + list.innerHTML = allPRs.map(pr => ` +No recent activity
'; + return; + } + + list.innerHTML = giteaData.activity.slice(0, 20).map(activity => ` +Real-time repository and PR tracking
+Loading repositories...
-Loading pending reviews...
-Loading recent activity...
-