diff --git a/renderer.js b/renderer.js index 7d2aec8..2a5c646 100644 --- a/renderer.js +++ b/renderer.js @@ -493,15 +493,32 @@ async function startLiveCountdown(folderObj, msLeft) { if (idx === -1) return 1; // fallback: erste Seite return Math.floor(idx / pageSize) + 1; } + async function getPageForCurrentCommit(folderObj, pageSize = 50) { //should probably be fused with the function above + // Holt alle Commits (nur die Hashes, schnell genug für moderne Maschinen) + const { head, total } = await window.electronAPI.getCommits(folderObj, 1, 100000); // Großer Wert, um alle zu holen (du kannst auch einen eigenen IPC machen, der NUR die Hashes returned) + const { commits } = await window.electronAPI.getCommits(folderObj, 1, total); + const idx = commits.findIndex(c => c.hash === head); + if (idx === -1) return 1; + return Math.floor(idx / pageSize) + 1; + } //let commitPage = 1; // Merker für die aktuelle Seite const PAGE_SIZE = 50; - // UI-Element für Pagination (in deinem Template anlegen, z.B. unter contentList) const paginationEl = document.createElement('div'); paginationEl.className = 'pagination flex justify-center items-center my-2 space-x-2'; + contentList.parentElement.insertBefore(paginationEl, contentList); // nur einmal beim Initialisieren - contentList.parentElement.insertBefore(paginationEl, contentList); // einmalig nach DOM load + // Speichere zuletzt angezeigten Folder/Seite + let lastFolderPath = null; + let lastPage = null; + + // Helper: gibt die Seite für einen Commit-Hash zurück + async function getCommitPageForHash(folderObj, hash, pageSize) { + const allHashes = await window.electronAPI.getAllCommitHashes(folderObj); // Muss in Main implementiert sein! + const idx = allHashes.findIndex(h => h.startsWith(hash)); + return idx === -1 ? 1 : Math.floor(idx / pageSize) + 1; + } async function renderContent(folderObj, page) { closeDropdown(); @@ -509,42 +526,40 @@ async function startLiveCountdown(folderObj, msLeft) { await updateInteractionBar(folderObj); titleEl.textContent = folder; - // --- Neuer Block: Ermittle die Seite des aktuellen Commits --- + // --- Seitenwahl beim Ordnerwechsel --- let usePage = page; - if (!usePage) { - // Wenn keine Seite angegeben, gehe auf die Seite des aktuellen HEAD - const { head } = await window.electronAPI.getCommits(folderObj, 1, 1); // head holen + if (!usePage || folder !== lastFolderPath) { + // Wenn keine Seite gegeben oder Ordner gewechselt: Seite für aktuellen HEAD suchen + const { head } = await window.electronAPI.getCommits(folderObj, 1, 1); // nur für den Hash! usePage = await getCommitPageForHash(folderObj, head, PAGE_SIZE); } - // Holt die paginierten Commits! - const { head, commits, total, page: currentPage, pageSize, pages } = - await window.electronAPI.getCommits(folderObj, page, PAGE_SIZE); + lastFolderPath = folder; + lastPage = usePage; - commitPage = currentPage; // speichere aktuelle Seite + // Paginierte Commits holen + const { head, commits, total, page: currentPage, pageSize, pages } = + await window.electronAPI.getCommits(folderObj, usePage, PAGE_SIZE); if (!commits || !commits.length) { contentList.innerHTML = '
No commits found.
'; paginationEl.innerHTML = ''; return; - } - contentList.innerHTML = commits.map(c => { - // Prüfe, ob der Commit in der Rewrite-Queue ist: - const isQueued = folderObj.llmCandidates && folderObj.llmCandidates.some(fullHash => - fullHash.startsWith(c.hash) - ); - if(isQueued) console.log("hi"); - // Für random-Winkel (zwischen -10 und +15 Grad, z.B.) - return ` -
  • + } + + // Commit-Liste rendern + contentList.innerHTML = commits.map(c => { + const isQueued = folderObj.llmCandidates && folderObj.llmCandidates.some(fullHash => + fullHash.startsWith(c.hash) + ); + return ` +
  • ${c.hash} - ${new Date(c.date).toLocaleString()} - + ${new Date(c.date).toLocaleString()}
    ${c.message}
    - - -
  • `;}).join(''); + `; + }).join(''); - // --- PAGINATION --- - if (pages > 1) { - paginationEl.innerHTML = ` - - Seite ${currentPage} / ${pages} - - `; - - paginationEl.querySelector('#page-prev').onclick = () => renderContent(folderObj, currentPage - 1); - paginationEl.querySelector('#page-next').onclick = () => renderContent(folderObj, currentPage + 1); - paginationEl.style.display = 'flex'; - } else { - paginationEl.innerHTML = ''; - paginationEl.style.display = 'none'; - } - + // --- PAGINATION --- + if (pages > 1) { + paginationEl.innerHTML = ` + + Seite ${currentPage} / ${pages} + + `; + paginationEl.querySelector('#page-prev').onclick = () => renderContent(folderObj, currentPage - 1); + paginationEl.querySelector('#page-next').onclick = () => renderContent(folderObj, currentPage + 1); + paginationEl.style.display = 'flex'; + } else { + paginationEl.innerHTML = ''; + paginationEl.style.display = 'none'; + } // Diff-Buttons prüfen und ggf. deaktivieren contentList.querySelectorAll('.diff-btn').forEach(async btn => { - const hash = btn.dataset.hash; + const hash = btn.dataset.hash; const diffText = await window.electronAPI.diffCommit(folderObj, hash); if (!diffText.trim()) { btn.disabled = true; @@ -626,14 +637,13 @@ async function startLiveCountdown(folderObj, msLeft) { // Diff-Toggle & Highlighting contentList.querySelectorAll('.diff-btn').forEach(btn => { btn.addEventListener('click', async () => { - const li = btn.closest('li'); - const hash = btn.dataset.hash; - const svg = btn.querySelector('svg'); + const li = btn.closest('li'); + const hash = btn.dataset.hash; + const svg = btn.querySelector('svg'); const container = li.querySelector('.diff-container'); - const pre = container.querySelector('pre'); + const pre = container.querySelector('pre'); if (!pre.innerHTML.trim()) { - // fetch und HTML-Snippet bauen const diff = await window.electronAPI.diffCommit(folderObj, hash); const escaped = diff .replace(/&/g, '&') @@ -653,7 +663,7 @@ async function startLiveCountdown(folderObj, msLeft) { } const isOpen = container.classList.toggle('open'); - if (isOpen) { + if (isOpen) { container.style.maxHeight = container.scrollHeight + 'px'; } else { container.style.maxHeight = '0'; @@ -678,23 +688,21 @@ async function startLiveCountdown(folderObj, msLeft) { }); }); - // Checkout-Button + // Checkout-Button: Seite neu bestimmen! contentList.querySelectorAll('.checkout-btn').forEach(btn => { btn.addEventListener('click', async () => { const hash = btn.dataset.hash; await window.electronAPI.checkoutCommit(folderObj, hash); - // Finde die Seite des neuen HEADs (das ist jetzt der aktuelle Commit) - const headCommit = hash; - const page = await getCommitPageForHash(folderObj, headCommit, PAGE_SIZE); + const page = await getCommitPageForHash(folderObj, hash, PAGE_SIZE); await renderContent(folderObj, page); }); }); - + // Copy-Diff-Button contentList.querySelectorAll('.diff-container').forEach(container => { const btn = container.querySelector('.copy-diff-btn'); const pre = container.querySelector('pre'); - const originalSVG = btn.innerHTML; + const originalSVG = btn.innerHTML; const checkSVG = `