From e56136f4fc5ac12735f332f1cde8f3748103ef1d Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 17 May 2026 15:16:44 +0300 Subject: Add in-progress frontend actions --- web/js/views/media-grid.js | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) (limited to 'web/js/views/media-grid.js') diff --git a/web/js/views/media-grid.js b/web/js/views/media-grid.js index e82ae98..542277e 100644 --- a/web/js/views/media-grid.js +++ b/web/js/views/media-grid.js @@ -76,7 +76,15 @@ export async function loadMedia() { const setIds = state.selectedSetIds.length > 1 ? state.selectedSetIds.join(',') : ''; const singleSetId = state.selectedSetIds.length === 1 ? state.selectedSetIds[0] : null; - if (!singleSetId && !setIds && !callbacks.isShuffle?.() && !hasActiveFilters()) { + if (state.virtualSet === 'in-progress') { + breadcrumb?.classList.add('hidden'); + syncMediaPage('virtual:in-progress'); + const data = await API.inProgress(); + const list = Array.isArray(data) ? data : data?.media || []; + setMedia(list); + const page = renderGrid(list, 'No in-progress media.'); + resultCount.textContent = resultText(list.length, page); + } else if (!singleSetId && !setIds && !callbacks.isShuffle?.() && !hasActiveFilters()) { breadcrumb?.classList.add('hidden'); setMedia([]); syncMediaPage('sets'); @@ -176,6 +184,13 @@ export function mediaWithBrowsePath(media, path) { export function navigateBack() { if (!state.folderPath) { + if (state.virtualSet) { + state.virtualSet = ''; + state.mediaPage = 0; + callbacks.onVirtualSetCleared?.(); + loadMedia(); + return; + } if (state.selectedSetId || state.selectedSetIds.length) { state.selectedSetId = null; state.selectedSetIds = []; @@ -349,13 +364,13 @@ function renderFolder(folder, index) { `; } -function renderGrid(items) { +function renderGrid(items, emptyMessage = 'No results.') { const grid = document.getElementById('media-grid'); if (!grid) return; if (!items.length) { const page = paginateItems([], state.mediaPage); state.mediaPage = page.page; - grid.innerHTML = `

No results.

`; + grid.innerHTML = `

${escapeHtml(emptyMessage)}

`; clearSelection(); return page; } @@ -409,6 +424,8 @@ function bindMediaItems(grid) { const downloadBtn = el.querySelector('[data-action="download"]'); const tagBtn = el.querySelector('[data-action="tags"]'); const thumbBtn = el.querySelector('[data-action="regen-thumb"]'); + const finishedBtn = el.querySelector('[data-action="mark-finished"]'); + const notStartedBtn = el.querySelector('[data-action="mark-not-started"]'); playBtn?.addEventListener('click', (e) => { e.stopPropagation(); selectByElement(el); @@ -439,9 +456,24 @@ function bindMediaItems(grid) { e.stopPropagation(); callbacks.regenThumb?.(el.dataset.id); }); + finishedBtn?.addEventListener('click', async (e) => { + e.stopPropagation(); + await callbacks.markAsFinished?.(el.dataset.id); + }); + notStartedBtn?.addEventListener('click', async (e) => { + e.stopPropagation(); + await callbacks.markAsNotStarted?.(el.dataset.id); + }); }); } +function renderProgressActions() { + return ` + + + `; +} + function renderItem(m, index) { const sizeText = fmtSize(m.file_size_bytes); const flattenedFolder = m.flattened_folder ? 'true' : 'false'; @@ -455,6 +487,7 @@ function renderItem(m, index) { + ${renderProgressActions()} @@ -479,6 +512,7 @@ function renderItem(m, index) { + ${renderProgressActions()} @@ -500,6 +534,7 @@ function renderItem(m, index) { + ${renderProgressActions()} -- cgit v1.2.3