(model, viewMode = null, thumbPriority = THUMB_PRIORITY_BACKGROUND)
| 17547 | // Use autoSaveMultipleModels which handles bulk update |
| 17548 | await autoSaveMultipleModels('printed', isChecked); |
| 17549 | }); |
| 17550 | |
| 17551 | console.log('Multi-printed checkbox event listener attached'); |
| 17552 | } else { |
| 17553 | console.error('Multi-printed checkbox not found'); |
| 17554 | } |
| 17555 | |
| 17556 | // Add event listener for the Clear Selection button |
| 17557 | const clearSelectionButton = document.getElementById('clear-selection-button'); |
| 17558 | if (clearSelectionButton) { |
| 17559 | clearSelectionButton.addEventListener('click', () => { |
| 17560 | console.log('Clear Selection button clicked'); |
| 17561 | if (isMultiSelectMode) { |
| 17562 | selectedModels.clear(); |
| 17563 | document.querySelectorAll('.file-item.selected').forEach(item => { |
| 17564 | item.classList.remove('selected'); |
| 17565 | }); |
| 17566 | |
| 17567 | // Clear all multi-edit form fields |
| 17568 | clearMultiEditFormFields(); |
| 17569 | |
| 17570 | // Refresh the tag dropdown options |
| 17571 | populateTagSelect('multi-tag-select', 'multi-tags'); |
| 17572 | |
| 17573 | updateSelectedCount(); // Update the count display |
| 17574 | |
| 17575 | console.log('Selection cleared'); |
| 17576 | } |
| 17577 | }); |
| 17578 | console.log('Clear Selection button event listener attached'); |
| 17579 | } else { |
| 17580 | console.error('Clear Selection button not found'); |
| 17581 | } |
| 17582 | }); |
| 17583 | |
| 17584 | // ==================== NEW CODE: Virtual Grid Implementation ==================== |
| 17585 | |
| 17586 | /** |
| 17587 | * Grid queries omit the full `thumbnail` blob (only hasThumbnail is sent), so multi-image |
| 17588 | * models are discovered asynchronously via getAllThumbnails. This upgrades a detailed |
| 17589 | * card from a plain image to the left/right carousel + count badge. |
| 17590 | */ |
| 17591 | function upgradeGridItemToThumbnailCarousel(thumbnailContainer, model, validThumbnails, thumbSize, parseThumbnails) { |
| 17592 | const fileItem = thumbnailContainer.closest('.file-item'); |
| 17593 | const isCarouselView = |
| 17594 | fileItem && |
| 17595 | (fileItem.classList.contains('file-item-detailed') || fileItem.classList.contains('file-item-preview')); |
| 17596 | if (!isCarouselView) return; |
| 17597 | if (!validThumbnails || validThumbnails.length < 2) return; |
| 17598 | if (fileItem.querySelector('.thumbnail-nav-left')) return; |
| 17599 | |
| 17600 | const parent = thumbnailContainer.parentNode; |
| 17601 | if (!parent) return; |
| 17602 | |
| 17603 | const thumbnailWrapper = document.createElement('div'); |
| 17604 | thumbnailWrapper.className = 'thumbnail-wrapper'; |
| 17605 | thumbnailWrapper.style.position = 'relative'; |
| 17606 | thumbnailWrapper.style.width = thumbSize.width; |
no test coverage detected