diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/public/app.js b/public/app.js new file mode 100644 index 0000000..e0ca093 --- /dev/null +++ b/public/app.js @@ -0,0 +1,298 @@ +// API Base URL +const API_BASE = window.location.origin; + +// Load dashboard stats on page load +document.addEventListener('DOMContentLoaded', () => { + loadDashboard(); + updateSubsonicUrl(); +}); + +// Switch between tabs +function switchTab(tabName) { + // Hide all tabs + document.querySelectorAll('.tab-content').forEach(tab => { + tab.classList.remove('active'); + }); + document.querySelectorAll('.tab').forEach(tab => { + tab.classList.remove('active'); + }); + + // Show selected tab + document.getElementById(tabName).classList.add('active'); + event.target.classList.add('active'); + + // Load data for the tab + if (tabName === 'tracks') loadTracks(); + if (tabName === 'albums') loadAlbums(); + if (tabName === 'playlists') loadPlaylists(); +} + +// Load dashboard statistics +async function loadDashboard() { + try { + const [tracksRes, albumsRes, playlistsRes] = await Promise.all([ + fetch(`${API_BASE}/api/tracks`), + fetch(`${API_BASE}/api/albums`), + fetch(`${API_BASE}/api/playlists`) + ]); + + const tracks = await tracksRes.json(); + const albums = await albumsRes.json(); + const playlists = await playlistsRes.json(); + + const singles = tracks.tracks.filter(t => t.isSingle).length; + + document.getElementById('totalTracks').textContent = tracks.tracks.length; + document.getElementById('totalAlbums').textContent = albums.albums.length; + document.getElementById('totalSingles').textContent = singles; + document.getElementById('totalPlaylists').textContent = playlists.playlists.length; + } catch (error) { + console.error('Error loading dashboard:', error); + } +} + +// Load all tracks +async function loadTracks() { + const trackList = document.getElementById('trackList'); + trackList.innerHTML = '