This commit is contained in:
2026-08-09 02:22:22 +02:00
parent 3179d15b42
commit b10ddac6f3
28 changed files with 689 additions and 66 deletions

View File

@@ -11480,6 +11480,125 @@ document.addEventListener('click', (e) => {
return;
}
// Info Modal: Regenerate Thumbnail button
const rethumbBtn = e.target.closest('#info-rethumb-btn');
if (rethumbBtn) {
e.preventDefault();
const itemId = rethumbBtn.dataset.itemId || document.getElementById('info-title-input')?.dataset.itemId;
if (!itemId) return;
rethumbBtn.disabled = true;
const origText = rethumbBtn.innerHTML;
rethumbBtn.innerHTML = '<i class="fa-solid fa-spinner fa-spin"></i> Regenerating...';
const csrf = window.f0ckSession?.csrf_token;
fetch(`/api/v2/items/${itemId}/rethumb`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': csrf
}
})
.then(r => r.json())
.then(data => {
rethumbBtn.disabled = false;
rethumbBtn.innerHTML = origText;
if (data.success) {
if (window.flashMessage) window.flashMessage('THUMBNAIL REGENERATED');
else if (window.showFlash) window.showFlash('Thumbnail regenerated');
// Cache-bust thumbnails on page
const timestamp = Date.now();
document.querySelectorAll(`img[src*="/t/${itemId}.webp"]`).forEach(img => {
const url = new URL(img.src, window.location.origin);
url.searchParams.set('t', timestamp);
img.src = url.toString();
});
document.querySelectorAll(`.thumb[data-bg*="/t/${itemId}.webp"]`).forEach(thumb => {
const bg = thumb.dataset.bg;
if (bg) {
const url = new URL(bg, window.location.origin);
url.searchParams.set('t', timestamp);
thumb.style.setProperty('--thumb-bg', `url('${url.toString()}')`);
}
});
} else {
if (window.flashError) window.flashError(data.msg || 'Regeneration failed');
else alert(data.msg || 'Regeneration failed');
}
})
.catch(err => {
rethumbBtn.disabled = false;
rethumbBtn.innerHTML = origText;
console.error('Error regenerating thumbnail:', err);
if (window.flashError) window.flashError('Network error');
});
return;
}
// Info Modal: Set Expiry button
const setExpiryBtn = e.target.closest('#info-set-expiry-btn');
if (setExpiryBtn) {
e.preventDefault();
const select = document.getElementById('info-expiry-select');
const itemId = setExpiryBtn.dataset.itemId || select?.dataset.itemId || document.getElementById('info-title-input')?.dataset.itemId;
if (!itemId || !select) return;
const selectedExpiry = select.value;
setExpiryBtn.disabled = true;
select.disabled = true;
const origText = setExpiryBtn.innerHTML;
setExpiryBtn.innerHTML = '<i class="fa-solid fa-spinner fa-spin"></i>';
const csrf = window.f0ckSession?.csrf_token;
fetch(`/api/v2/items/${itemId}/expiry`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': csrf
},
body: JSON.stringify({ expiry: selectedExpiry })
})
.then(r => r.json())
.then(data => {
setExpiryBtn.disabled = false;
select.disabled = false;
setExpiryBtn.innerHTML = origText;
if (data.success) {
const label = document.getElementById('info-expiry-label');
if (label) {
if (data.expires_at) {
label.innerHTML = `<i class="fa-solid fa-clock"></i> ${data.expires_in || ('in ' + new Date(data.expires_at * 1000).toLocaleString())}`;
label.setAttribute('title', new Date(data.expires_at * 1000).toLocaleString());
label.style.color = '#ffaa00';
} else {
label.innerHTML = '<i class="fa-solid fa-clock-slash" style="color: var(--text-muted, #888);"></i> Never';
label.removeAttribute('title');
label.style.color = '';
}
}
if (data.purged) {
if (window.flashMessage) window.flashMessage('ITEM EXPIRED AND PURGED');
setTimeout(() => {
window.location.href = '/';
}, 1200);
} else {
if (window.flashMessage) window.flashMessage('EXPIRATION UPDATED');
}
} else {
if (window.flashError) window.flashError(data.msg || 'Failed to update expiry');
}
})
.catch(err => {
setExpiryBtn.disabled = false;
select.disabled = false;
setExpiryBtn.innerHTML = origText;
console.error('Error setting expiry:', err);
if (window.flashError) window.flashError('Network error');
});
return;
}
// Close when clicking outside modal content
const infoModal = document.getElementById('info-modal');
if (infoModal && e.target === infoModal) {