Add Download Now button to wishlist modal and library page download bubbles
This commit is contained in:
parent
41e895d254
commit
b90c270d54
3 changed files with 124 additions and 1 deletions
|
|
@ -4144,6 +4144,10 @@
|
||||||
onclick="closeAddToWishlistModal()">
|
onclick="closeAddToWishlistModal()">
|
||||||
Close
|
Close
|
||||||
</button>
|
</button>
|
||||||
|
<button class="wishlist-modal-btn wishlist-modal-btn-download" id="wishlist-download-now-btn"
|
||||||
|
onclick="handleWishlistDownloadNow()">
|
||||||
|
Download Now
|
||||||
|
</button>
|
||||||
<button class="wishlist-modal-btn wishlist-modal-btn-primary" id="confirm-add-to-wishlist-btn">
|
<button class="wishlist-modal-btn wishlist-modal-btn-primary" id="confirm-add-to-wishlist-btn">
|
||||||
Add to Wishlist
|
Add to Wishlist
|
||||||
</button>
|
</button>
|
||||||
|
|
|
||||||
|
|
@ -13440,6 +13440,46 @@ function closeAddToWishlistModal() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle "Download Now" button click from the Add to Wishlist modal.
|
||||||
|
* Captures modal data, closes the wishlist modal, then opens the download missing tracks modal.
|
||||||
|
*/
|
||||||
|
async function handleWishlistDownloadNow() {
|
||||||
|
if (!currentWishlistModalData) {
|
||||||
|
showToast('No album data available', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Capture data before closeAddToWishlistModal clears it
|
||||||
|
const { album, artist, tracks, albumType } = currentWishlistModalData;
|
||||||
|
|
||||||
|
// Close the wishlist modal
|
||||||
|
closeAddToWishlistModal();
|
||||||
|
|
||||||
|
// Build virtual playlist ID and name (same pattern as createArtistAlbumVirtualPlaylist)
|
||||||
|
const virtualPlaylistId = `artist_album_${artist.id}_${album.id}`;
|
||||||
|
const playlistName = `[${artist.name}] ${album.name}`;
|
||||||
|
|
||||||
|
// If a download process already exists for this album, just show the existing modal
|
||||||
|
if (activeDownloadProcesses[virtualPlaylistId]) {
|
||||||
|
const process = activeDownloadProcesses[virtualPlaylistId];
|
||||||
|
if (process.modalElement) {
|
||||||
|
process.modalElement.style.display = 'flex';
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open download missing modal (reuses existing function)
|
||||||
|
showLoadingOverlay('Loading album...');
|
||||||
|
await openDownloadMissingModalForArtistAlbum(
|
||||||
|
virtualPlaylistId, playlistName, tracks, album, artist, false
|
||||||
|
);
|
||||||
|
hideLoadingOverlay();
|
||||||
|
|
||||||
|
// Register download bubble (reuses existing artist bubble system)
|
||||||
|
registerArtistDownload(artist, album, virtualPlaylistId, albumType);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add all tracks from any download modal to the wishlist
|
* Add all tracks from any download modal to the wishlist
|
||||||
* Universal handler for all modal types (artist albums, playlists, YouTube, Tidal, etc.)
|
* Universal handler for all modal types (artist albums, playlists, YouTube, Tidal, etc.)
|
||||||
|
|
@ -13644,6 +13684,7 @@ window.downloadSelectedCategory = downloadSelectedCategory;
|
||||||
window.openAddToWishlistModal = openAddToWishlistModal;
|
window.openAddToWishlistModal = openAddToWishlistModal;
|
||||||
window.closeAddToWishlistModal = closeAddToWishlistModal;
|
window.closeAddToWishlistModal = closeAddToWishlistModal;
|
||||||
window.handleAddToWishlist = handleAddToWishlist;
|
window.handleAddToWishlist = handleAddToWishlist;
|
||||||
|
window.handleWishlistDownloadNow = handleWishlistDownloadNow;
|
||||||
window.addModalTracksToWishlist = addModalTracksToWishlist;
|
window.addModalTracksToWishlist = addModalTracksToWishlist;
|
||||||
|
|
||||||
// Helper functions
|
// Helper functions
|
||||||
|
|
@ -26165,6 +26206,7 @@ function updateArtistDownloadsSection() {
|
||||||
}
|
}
|
||||||
downloadsUpdateTimeout = setTimeout(() => {
|
downloadsUpdateTimeout = setTimeout(() => {
|
||||||
showArtistDownloadsSection();
|
showArtistDownloadsSection();
|
||||||
|
showLibraryDownloadsSection();
|
||||||
updateDashboardDownloads();
|
updateDashboardDownloads();
|
||||||
}, 300); // 300ms debounce
|
}, 300); // 300ms debounce
|
||||||
}
|
}
|
||||||
|
|
@ -27096,6 +27138,64 @@ function showArtistDownloadsSection() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show download bubbles on the Library page (mirrors showArtistDownloadsSection)
|
||||||
|
*/
|
||||||
|
function showLibraryDownloadsSection() {
|
||||||
|
const libraryContent = document.querySelector('.library-content');
|
||||||
|
if (!libraryContent) return;
|
||||||
|
|
||||||
|
let downloadsSection = document.getElementById('library-downloads-section');
|
||||||
|
|
||||||
|
// Create section if it doesn't exist
|
||||||
|
if (!downloadsSection) {
|
||||||
|
downloadsSection = document.createElement('div');
|
||||||
|
downloadsSection.id = 'library-downloads-section';
|
||||||
|
downloadsSection.className = 'artist-downloads-section';
|
||||||
|
|
||||||
|
// Insert before the artist grid
|
||||||
|
const artistGrid = document.getElementById('library-artists-grid');
|
||||||
|
if (artistGrid) {
|
||||||
|
libraryContent.insertBefore(downloadsSection, artistGrid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count active artists (reuses artistDownloadBubbles state)
|
||||||
|
const activeArtists = Object.keys(artistDownloadBubbles).filter(artistId =>
|
||||||
|
artistDownloadBubbles[artistId].downloads.length > 0
|
||||||
|
);
|
||||||
|
|
||||||
|
if (activeArtists.length === 0) {
|
||||||
|
downloadsSection.style.display = 'none';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadsSection.style.display = 'block';
|
||||||
|
downloadsSection.innerHTML = `
|
||||||
|
<div class="artist-downloads-header">
|
||||||
|
<h3 class="artist-downloads-title">Current Downloads</h3>
|
||||||
|
<p class="artist-downloads-subtitle">Active download processes</p>
|
||||||
|
</div>
|
||||||
|
<div class="artist-bubble-container">
|
||||||
|
${activeArtists.map(artistId => createArtistBubbleCard(artistDownloadBubbles[artistId])).join('')}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
// Add click handlers + glow effects
|
||||||
|
activeArtists.forEach(artistId => {
|
||||||
|
const bubbleCard = downloadsSection.querySelector(`[data-artist-id="${artistId}"]`);
|
||||||
|
if (bubbleCard) {
|
||||||
|
bubbleCard.addEventListener('click', () => openArtistDownloadModal(artistId));
|
||||||
|
const artist = artistDownloadBubbles[artistId].artist;
|
||||||
|
if (artist.image_url) {
|
||||||
|
extractImageColors(artist.image_url, (colors) => {
|
||||||
|
applyDynamicGlow(bubbleCard, colors);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create HTML for an artist bubble card
|
* Create HTML for an artist bubble card
|
||||||
*/
|
*/
|
||||||
|
|
@ -29949,6 +30049,9 @@ function initializeLibraryPage() {
|
||||||
// Load initial data
|
// Load initial data
|
||||||
loadLibraryArtists();
|
loadLibraryArtists();
|
||||||
|
|
||||||
|
// Show download bubbles if any exist
|
||||||
|
showLibraryDownloadsSection();
|
||||||
|
|
||||||
libraryPageState.isInitialized = true;
|
libraryPageState.isInitialized = true;
|
||||||
console.log("✅ Library page initialized successfully");
|
console.log("✅ Library page initialized successfully");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14183,7 +14183,6 @@ body {
|
||||||
|
|
||||||
/* Artist Downloads Section */
|
/* Artist Downloads Section */
|
||||||
.artist-downloads-section {
|
.artist-downloads-section {
|
||||||
max-width: 800px;
|
|
||||||
padding: 0 20px;
|
padding: 0 20px;
|
||||||
animation: fadeInUp 0.5s ease-out;
|
animation: fadeInUp 0.5s ease-out;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
@ -16735,6 +16734,23 @@ body {
|
||||||
border-color: rgba(255, 255, 255, 0.3);
|
border-color: rgba(255, 255, 255, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wishlist-modal-btn-download {
|
||||||
|
background: linear-gradient(135deg, #1db954, #1ed760);
|
||||||
|
color: #ffffff;
|
||||||
|
border: 1px solid rgba(29, 185, 84, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.wishlist-modal-btn-download:hover {
|
||||||
|
background: linear-gradient(135deg, #1ed760, #1db954);
|
||||||
|
transform: translateY(-1px);
|
||||||
|
box-shadow: 0 8px 24px rgba(29, 185, 84, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.wishlist-modal-btn-download:active {
|
||||||
|
transform: translateY(0);
|
||||||
|
box-shadow: 0 4px 12px rgba(29, 185, 84, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
.wishlist-modal-btn-primary {
|
.wishlist-modal-btn-primary {
|
||||||
background: linear-gradient(135deg, rgb(var(--accent-rgb)) 0%, rgb(var(--accent-light-rgb)) 100%);
|
background: linear-gradient(135deg, rgb(var(--accent-rgb)) 0%, rgb(var(--accent-light-rgb)) 100%);
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue