-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsong-script.js
141 lines (103 loc) · 3.36 KB
/
song-script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Song Class: Represents a song
class Song {
constructor(title, artist) {
this.title = title;
this.artist = artist;
}
}
// UI Class: Handle UI tasks
class UI {
static displaySongs() {
const songs = Store.getSongs();
songs.forEach((song) => UI.addSongToList(song));
}
static addSongToList(song) {
const list = document.querySelector('#song-list');
const row = document.createElement('tr');
row.innerHTML = `
<td class="text-light">${song.title}</td>
<td class="text-light">${song.artist}</td>
<td><a href="#" class="btn btn-danger btn-sm delete">X</a></td>
`;
list.appendChild(row);
}
static deleteSong(el) {
if(el.classList.contains('delete')) {
el.parentElement.parentElement.remove();
}
}
static showAlert(message, className) {
const div = document.createElement('div');
div.className = `alert alert-${className}`;
div.appendChild(document.createTextNode(message));
const container = document.querySelector('.container');
const form = document.querySelector('#song-form');
container.insertBefore(div, form);
// Vanish in 3 seconds
setTimeout(() => document.querySelector('.alert').remove(), 3000);
}
static clearFields() {
document.querySelector('#title').value = '';
document.querySelector('#artist').value = '';
}
}
// Store Class: Handles Storage
class Store {
static getSongs() {
let songs;
if(localStorage.getItem('songs') === null) {
songs = [];
} else {
songs = JSON.parse(localStorage.getItem('songs'));
}
return songs;
}
static addSong(song) {
const songs = Store.getSongs();
songs.push(song);
localStorage.setItem('songs', JSON.stringify(songs));
}
static removeSong(title) {
const songs = Store.getSongs();
songs.forEach((song, index) => {
if(song.title === title) {
songs.splice(index, 1);
}
});
localStorage.setItem('songs', JSON.stringify(songs));
}
}
// Event: Display Songs
document.addEventListener('DOMContentLoaded', UI.displaySongs);
// Event: Add a song
document.querySelector('#song-form').addEventListener('submit', (e) => {
//Prevent Actual submit
e.preventDefault();
//Get Form Values
const title = document.querySelector('#title').value;
const artist = document.querySelector('#artist').value;
//Validate
if(title === '' || artist === '') {
UI.showAlert('Please fill in all fields', danger);
} else {
//Instantiate song
const song = new Song(title, artist);
//Add song to UI
UI.addSongToList(song);
//Add song to store
Store.addSong(song);
//Show success message
UI.showAlert('Song Added', 'success');
//Clear fields
UI.clearFields();
}
})
// Event: Remove a song
document.querySelector('#song-list').addEventListener('click', (e) => {
//Remove song from UI
UI.deleteSong(e.target);
//Remove song from store
Store.removeSong(e.target.parentElement.previousElementSibling.previousElementSibling.textContent);
//Show success message
UI.showAlert('Song Removed', 'success');
});