add all recommended to watchlist.
This commit is contained in:
parent
1f73ba4f94
commit
b558dff138
3 changed files with 105 additions and 10 deletions
|
|
@ -939,8 +939,15 @@
|
||||||
padding: 12px 16px;
|
padding: 12px 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.recommended-search-container {
|
.recommended-actions-bar {
|
||||||
padding: 0 16px;
|
padding: 12px 16px 0;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommended-add-all-btn {
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.recommended-card-watchlist-btn {
|
.recommended-card-watchlist-btn {
|
||||||
|
|
|
||||||
|
|
@ -33742,12 +33742,18 @@ function renderRecommendedArtistsModal(modal, artists) {
|
||||||
<span class="playlist-modal-close" onclick="closeRecommendedArtistsModal()">×</span>
|
<span class="playlist-modal-close" onclick="closeRecommendedArtistsModal()">×</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="playlist-modal-body">
|
<div class="playlist-modal-body">
|
||||||
<div class="recommended-search-container">
|
<div class="recommended-actions-bar">
|
||||||
<input type="text"
|
<div class="recommended-search-container">
|
||||||
class="recommended-search-input"
|
<input type="text"
|
||||||
id="recommended-search-input"
|
class="recommended-search-input"
|
||||||
placeholder="Search recommended artists..."
|
id="recommended-search-input"
|
||||||
oninput="filterRecommendedArtists()">
|
placeholder="Search recommended artists..."
|
||||||
|
oninput="filterRecommendedArtists()">
|
||||||
|
</div>
|
||||||
|
<button class="recommended-add-all-btn" id="recommended-add-all-btn"
|
||||||
|
onclick="addAllRecommendedToWatchlist(this)">
|
||||||
|
Add All to Watchlist
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="recommended-artists-grid" id="recommended-artists-grid">
|
<div class="recommended-artists-grid" id="recommended-artists-grid">
|
||||||
${artists.map(artist => {
|
${artists.map(artist => {
|
||||||
|
|
@ -33811,6 +33817,50 @@ function renderRecommendedArtistsModal(modal, artists) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function addAllRecommendedToWatchlist(btn) {
|
||||||
|
if (!_recommendedArtistsCache || _recommendedArtistsCache.length === 0) return;
|
||||||
|
if (btn.classList.contains('all-added')) return;
|
||||||
|
|
||||||
|
const originalText = btn.textContent;
|
||||||
|
btn.disabled = true;
|
||||||
|
btn.textContent = 'Adding...';
|
||||||
|
|
||||||
|
try {
|
||||||
|
const artists = _recommendedArtistsCache.map(a => ({
|
||||||
|
artist_id: a.artist_id,
|
||||||
|
artist_name: a.artist_name
|
||||||
|
}));
|
||||||
|
|
||||||
|
const resp = await fetch('/api/watchlist/add-batch', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ artists })
|
||||||
|
});
|
||||||
|
const data = await resp.json();
|
||||||
|
|
||||||
|
if (data.success) {
|
||||||
|
btn.textContent = `All Added (${data.added} new)`;
|
||||||
|
btn.classList.add('all-added');
|
||||||
|
btn.disabled = true;
|
||||||
|
|
||||||
|
// Update all watchlist buttons in the modal to "Watching"
|
||||||
|
document.querySelectorAll('.recommended-card-watchlist-btn').forEach(wBtn => {
|
||||||
|
wBtn.classList.add('watching');
|
||||||
|
wBtn.textContent = 'Watching';
|
||||||
|
});
|
||||||
|
|
||||||
|
if (typeof updateWatchlistButtonCount === 'function') updateWatchlistButtonCount();
|
||||||
|
} else {
|
||||||
|
btn.textContent = originalText;
|
||||||
|
btn.disabled = false;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error adding all recommended to watchlist:', error);
|
||||||
|
btn.textContent = originalText;
|
||||||
|
btn.disabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function closeRecommendedArtistsModal() {
|
function closeRecommendedArtistsModal() {
|
||||||
const modal = document.getElementById('recommended-artists-modal');
|
const modal = document.getElementById('recommended-artists-modal');
|
||||||
if (modal) modal.style.display = 'none';
|
if (modal) modal.style.display = 'none';
|
||||||
|
|
|
||||||
|
|
@ -20352,11 +20352,49 @@ body {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.recommended-search-container {
|
.recommended-actions-bar {
|
||||||
padding: 0 28px;
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
padding: 16px 28px 0;
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.recommended-search-container {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommended-add-all-btn {
|
||||||
|
flex-shrink: 0;
|
||||||
|
padding: 10px 20px;
|
||||||
|
border-radius: 10px;
|
||||||
|
border: 1px solid rgba(var(--accent-rgb), 0.3);
|
||||||
|
background: rgba(var(--accent-rgb), 0.1);
|
||||||
|
color: rgb(var(--accent-rgb));
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
white-space: nowrap;
|
||||||
|
transition: background 0.2s ease, border-color 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommended-add-all-btn:hover {
|
||||||
|
background: rgba(var(--accent-rgb), 0.2);
|
||||||
|
border-color: rgba(var(--accent-rgb), 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommended-add-all-btn:disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommended-add-all-btn.all-added {
|
||||||
|
background: rgba(var(--accent-rgb), 0.08);
|
||||||
|
border-color: rgba(var(--accent-rgb), 0.2);
|
||||||
|
opacity: 0.7;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
.recommended-search-input {
|
.recommended-search-input {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 10px 16px;
|
padding: 10px 16px;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue