series management tuning and import archive extraction troubleshooting
This commit is contained in:
@@ -105,7 +105,9 @@
|
||||
|
||||
if (state.selectedIds.has(id)) {
|
||||
state.selectedIds.delete(id);
|
||||
state.selectionOrder = state.selectionOrder.filter(x => x !== id);
|
||||
// Remove from order array without creating new array (preserves window.selectionOrder reference)
|
||||
const idx = state.selectionOrder.indexOf(id);
|
||||
if (idx !== -1) state.selectionOrder.splice(idx, 1);
|
||||
item.classList.remove('selected');
|
||||
removeOrderBadge(item);
|
||||
} else {
|
||||
@@ -124,7 +126,8 @@
|
||||
|
||||
function clearSelection() {
|
||||
state.selectedIds.clear();
|
||||
state.selectionOrder = [];
|
||||
// Clear array without creating new one (preserves window.selectionOrder reference)
|
||||
state.selectionOrder.length = 0;
|
||||
document.querySelectorAll('.img-clickable.selected').forEach(el => {
|
||||
el.classList.remove('selected');
|
||||
removeOrderBadge(el);
|
||||
@@ -308,6 +311,7 @@
|
||||
|
||||
if (data.ok) {
|
||||
loadCommonTags(); // Refresh common tags
|
||||
refreshSelectedItemsTags(); // Update tag display on gallery items
|
||||
} else {
|
||||
console.error('Failed to add tag:', data.error);
|
||||
}
|
||||
@@ -329,6 +333,7 @@
|
||||
|
||||
if (data.ok) {
|
||||
loadCommonTags(); // Refresh common tags
|
||||
refreshSelectedItemsTags(); // Update tag display on gallery items
|
||||
} else {
|
||||
console.error('Failed to remove tag:', data.error);
|
||||
}
|
||||
@@ -509,6 +514,65 @@
|
||||
return div.innerHTML;
|
||||
}
|
||||
|
||||
// ---------------------------
|
||||
// Tag Refresh for Gallery Items
|
||||
// ---------------------------
|
||||
function getTagDisplayName(name, kind) {
|
||||
// Strip prefix for known prefixed kinds
|
||||
if (['artist', 'character', 'series', 'fandom', 'rating'].includes(kind)) {
|
||||
return name.includes(':') ? name.split(':', 2)[1] : name;
|
||||
}
|
||||
// Regular tags get a # prefix
|
||||
return '#' + name;
|
||||
}
|
||||
|
||||
async function refreshItemTags(imageId) {
|
||||
// Find the gallery item
|
||||
const item = document.querySelector(`.img-clickable[data-id="${imageId}"]`);
|
||||
if (!item) return;
|
||||
|
||||
try {
|
||||
const r = await fetch(`/image/${imageId}/tags`);
|
||||
const data = await r.json();
|
||||
|
||||
if (!data.ok) return;
|
||||
|
||||
// Filter out archive tags (they're not shown)
|
||||
const visibleTags = (data.tags || []).filter(t => t.kind !== 'archive');
|
||||
|
||||
// Find or create tag overlay
|
||||
let overlay = item.querySelector('.tag-overlay');
|
||||
|
||||
if (visibleTags.length === 0) {
|
||||
// No visible tags - remove overlay if exists
|
||||
if (overlay) overlay.remove();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!overlay) {
|
||||
overlay = document.createElement('div');
|
||||
overlay.className = 'tag-overlay';
|
||||
item.appendChild(overlay);
|
||||
}
|
||||
|
||||
// Render tags
|
||||
overlay.innerHTML = visibleTags.map(t => {
|
||||
const displayName = getTagDisplayName(t.name, t.kind);
|
||||
const encodedName = encodeURIComponent(t.name);
|
||||
return `<a class="tag-chip" href="/gallery?tag=${encodedName}" title="Filter by ${escapeHtml(t.name)}" onclick="event.stopPropagation()">${escapeHtml(displayName)}</a>`;
|
||||
}).join('');
|
||||
|
||||
} catch (e) {
|
||||
console.error('Failed to refresh tags for image', imageId, e);
|
||||
}
|
||||
}
|
||||
|
||||
async function refreshSelectedItemsTags() {
|
||||
// Refresh tags for all currently selected items
|
||||
const ids = Array.from(state.selectedIds);
|
||||
await Promise.all(ids.map(id => refreshItemTags(id)));
|
||||
}
|
||||
|
||||
// Initialize on DOM ready
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', init);
|
||||
@@ -516,10 +580,11 @@
|
||||
init();
|
||||
}
|
||||
|
||||
// Expose global API for other scripts (like series editor)
|
||||
// Expose global API for other scripts (like series editor, modal)
|
||||
window.selectedImages = state.selectedIds;
|
||||
window.selectionOrder = state.selectionOrder; // Ordered array of selected IDs
|
||||
window.clearSelection = clearSelection;
|
||||
window.enableSelectMode = enableSelectMode;
|
||||
window.disableSelectMode = disableSelectMode;
|
||||
window.refreshItemTags = refreshItemTags; // Refresh tags display on a single gallery item
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user