{% from "song-macros.html" import song_info, song_details %}
<div class="song-list">
-{% for song in songs %}
- <div class="song" data-song="{{ song.json() }}">
- <div class="song-main">
- <div class="song-list-pfp-container">
- {%- if song.user_has_pfp %}
- <!-- Profile Picture -->
- <img class="small-pfp" src="/pfp/{{ song.userid }}" onerror="this.style.display = 'none'" width="32" height="32" />
- {%- endif %}
- </div>
+ <div class="song-list-controls">
+ <label><input type="checkbox" name="shuffle" onchange="shuffleSongList(event)">Shuffle</label>
+ </div>
+
+ <div class="song-list-songs">
+ {% for song in songs %}
+ <div class="song" data-song="{{ song.json() }}">
+ <div class="song-main">
+ <div class="song-list-pfp-container">
+ {%- if song.user_has_pfp %}
+ <!-- Profile Picture -->
+ <img class="small-pfp" src="/pfp/{{ song.userid }}" onerror="this.style.display = 'none'" width="32" height="32" />
+ {%- endif %}
+ </div>
- {{ song_info(song) | indent(12) }}
+ {{ song_info(song) | indent(12) }}
- <div class="song-buttons">
- <!-- Details Button -->
- <button onclick="return showDetails(event)" class="song-list-button details-toggle" title="Toggle Details">
- <img class="lsp_btn_show02" alt="Show Details">
- </button>
+ <div class="song-buttons">
+ <!-- Details Button -->
+ <button onclick="return showDetails(event)" class="song-list-button details-toggle" title="Toggle Details">
+ <img class="lsp_btn_show02" alt="Show Details">
+ </button>
- <!-- Play Button -->
- <button onclick="return play(event)" class="song-list-button" title="Play">
- <img class="lsp_btn_play02" alt="Play">
- </button>
+ <!-- Play Button -->
+ <button onclick="return play(event)" class="song-list-button" title="Play">
+ <img class="lsp_btn_play02" alt="Play">
+ </button>
+ </div>
</div>
+ {{ song_details(song, current_user_playlists) | indent(8) }}
</div>
- {{ song_details(song, current_user_playlists) | indent(8) }}
+ {% endfor %}
</div>
-{% endfor %}
</div>
<script>
}
return false;
}
+
+function shuffleSongList(event) {
+ var songList = event.target.closest(".song-list");
+ var songs = songList.querySelector(".song-list-songs");
+ if (event.target.checked) {
+ // Store original list so it can be restored later
+ songList.dataset.original = songs.innerHTML;
+
+ // Shuffle
+ var songElements = [];
+ while (songs.firstElementChild) {
+ songElements.push(songs.lastElementChild);
+ songs.removeChild(songs.lastElementChild);
+ }
+ for (let i = songElements.length - 1; i >= 0; i --) {
+ const j = Math.floor(Math.random() * (i + 1));
+ [songElements[i], songElements[j]] = [songElements[j], songElements[i]];
+ }
+ for (const child of songElements) {
+ songs.appendChild(child);
+ }
+ }
+ else {
+ // Unshuffle
+ if (songList.dataset.original) {
+ songs.innerHTML = songList.dataset.original;
+ }
+ }
+}
</script>