document.addEventListener('DOMContentLoaded', function() { const selectionGrid = document.getElementById('selection-grid'); const filterButtons = document.querySelectorAll('.filter-buttons .filter-btn'); const orientationButtons = document.querySelectorAll('.orientation-filters .filter-btn'); const resolutionFilter = document.getElementById('resolution-filter'); const selectAllBtn = document.getElementById('select-all'); const deselectAllBtn = document.getElementById('deselect-all'); const downloadSelectedBtn = document.getElementById('download-selected'); const actionModal = document.getElementById('action-modal'); const closeActionModal = document.getElementById('close-action-modal'); const actionButtons = actionModal.querySelectorAll('.action-btn'); const modalPreviewImg = document.getElementById('modal-preview-img'); const modalMessage = document.getElementById('modal-message'); const resetBtn = document.getElementById('reset-db'); const resetModal = document.getElementById('reset-modal'); const confirmResetBtn = document.getElementById('confirm-reset'); const cancelResetBtn = document.getElementById('cancel-reset'); const resetMessage = document.getElementById('reset-message'); let currentFilter = 'all'; let currentOrientation = 'all'; let currentResolution = 'all'; let selectedItems = []; let currentSelectionId = null; const loadSelections = () => { selectionGrid.innerHTML = `
Loading selections...
`; fetch('/selections') .then(response => response.json()) .then(data => { if (data.selections && data.selections.length > 0) { populateResolutionFilter(data.selections); renderSelections(data.selections); } else { selectionGrid.innerHTML = '
No selections found
'; } }) .catch(error => { console.error('Error loading selections:', error); selectionGrid.innerHTML = `
Error loading selections: ${error.message}
`; }); }; const populateResolutionFilter = (selections) => { const resolutions = [...new Set(selections.map(s => s.resolution))].sort(); resolutionFilter.innerHTML = ''; resolutions.forEach(resolution => { const option = document.createElement('option'); option.value = resolution; option.textContent = resolution; resolutionFilter.appendChild(option); }); }; const renderSelections = (selections) => { selectionGrid.innerHTML = ''; const filteredSelections = selections.filter(s => (currentFilter === 'all' || s.action === currentFilter) && (currentOrientation === 'all' || s.orientation === currentOrientation) && (currentResolution === 'all' || s.resolution === currentResolution) ); if (filteredSelections.length === 0) { selectionGrid.innerHTML = '
No selections match the current filters
'; return; } filteredSelections.forEach(selection => { const item = document.createElement('div'); item.className = 'selection-item'; item.dataset.id = selection.id; item.innerHTML = `
Selected image
${getActionName(selection.action)}

${selection.image_path.split('/').pop()}

Resolution: ${selection.resolution}

`; selectionGrid.appendChild(item); }); }; const getActionName = (action) => { const names = { left: 'Discard', right: 'Keep', up: 'Favorite', down: 'Review' }; return names[action] || action; }; const updateDownloadButton = () => { downloadSelectedBtn.disabled = selectedItems.length === 0; downloadSelectedBtn.querySelector('.label').textContent = selectedItems.length > 0 ? `Download (${selectedItems.length})` : 'Download'; }; selectionGrid.addEventListener('click', (e) => { const target = e.target; const selectionItem = target.closest('.selection-item'); if (!selectionItem) return; const selectionId = selectionItem.dataset.id; const selection = { id: selectionId, image_path: selectionItem.querySelector('img').src }; if (target.classList.contains('selection-checkbox')) { if (target.checked) { selectionItem.classList.add('selected'); selectedItems.push(selection); } else { selectionItem.classList.remove('selected'); selectedItems = selectedItems.filter(item => item.id !== selectionId); } updateDownloadButton(); } else if (target.classList.contains('edit-btn')) { currentSelectionId = selectionId; modalPreviewImg.src = selection.image_path; actionModal.style.display = 'flex'; } else if (target.classList.contains('delete-btn')) { if (confirm('Are you sure you want to delete this selection?')) { // Implement delete functionality } } }); filterButtons.forEach(button => button.addEventListener('click', function() { filterButtons.forEach(btn => btn.classList.remove('active')); this.classList.add('active'); currentFilter = this.dataset.filter; loadSelections(); })); orientationButtons.forEach(button => button.addEventListener('click', function() { orientationButtons.forEach(btn => btn.classList.remove('active')); this.classList.add('active'); currentOrientation = this.dataset.orientation; loadSelections(); })); resolutionFilter.addEventListener('change', function() { currentResolution = this.value; loadSelections(); }); selectAllBtn.addEventListener('click', () => { document.querySelectorAll('.selection-checkbox').forEach(cb => cb.checked = true); selectedItems = Array.from(document.querySelectorAll('.selection-item')).map(item => ({id: item.dataset.id, image_path: item.querySelector('img').src})); document.querySelectorAll('.selection-item').forEach(item => item.classList.add('selected')); updateDownloadButton(); }); deselectAllBtn.addEventListener('click', () => { document.querySelectorAll('.selection-checkbox').forEach(cb => cb.checked = false); selectedItems = []; document.querySelectorAll('.selection-item').forEach(item => item.classList.remove('selected')); updateDownloadButton(); }); downloadSelectedBtn.addEventListener('click', () => { const paths = selectedItems.map(item => item.image_path); const query = paths.map(p => `paths=${encodeURIComponent(p)}`).join('&'); window.location.href = `/download-selected?${query}`; }); closeActionModal.addEventListener('click', () => actionModal.style.display = 'none'); actionButtons.forEach(button => button.addEventListener('click', function() { const action = this.dataset.action; // Implement update action functionality })); resetBtn.addEventListener('click', () => resetModal.style.display = 'flex'); confirmResetBtn.addEventListener('click', () => { // Implement reset database functionality }); cancelResetBtn.addEventListener('click', () => resetModal.style.display = 'none'); loadSelections(); });