-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
142 lines (111 loc) · 3.86 KB
/
app.js
File metadata and controls
142 lines (111 loc) · 3.86 KB
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
141
142
// Expense Class
class Expense {
constructor(expense, amount, desc) {
this.expense = expense;
this.amount = amount;
this.desc = desc;
}
}
// UI class
class UI {
static displayExpenses() {
const storedExpenses = Store.getExpenses();
const expenses = storedExpenses;
expenses.forEach((expense) => UI.addExpense(expense));
}
static addExpense(exp) {
const list = document.querySelector('#expense-list');
const row = document.createElement('tr');
row.innerHTML = `
<td>${exp.expense}</td>
<td>${exp.amount}</td>
<td>${exp.desc}</td>
<td><a href="#" class="btn btn-danger btn-sm delete">Delete</a></td>
`;
list.appendChild(row);
}
static deleteExpense(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("#expense-form");
container.insertBefore(div, form);
// Vanish in 3 seconds
setTimeout(() => document.querySelector(".alert").remove(), 3000);
}
static clearFields() {
document.querySelector("#expense").value = '';
document.querySelector("#amount").value = '';
document.querySelector("#description").value = '';
}
}
// Store class
class Store {
static getExpenses() {
let expenses;
if (localStorage.getItem('expenses') == null) {
expenses = [];
}
else {
expenses = JSON.parse(localStorage.getItem("expenses"));
}
return expenses;
}
static addExpense(exp) {
const expenses = Store.getExpenses();
expenses.push(exp);
localStorage.setItem('expenses', JSON.stringify(expenses));
}
static removeExpense(exp) {
const expenses = Store.getExpenses();
expenses.forEach((e, index) => {
if (e.expense == exp) {
expenses.splice(index, 1);
}
});
localStorage.setItem('expenses', JSON.stringify(expenses));
}
}
// Event: display expenses
document.addEventListener('DOMContentLoaded', UI.displayExpenses);
// Event: add an expense
document.querySelector("#expense-form").addEventListener('submit', (e) => {
// Prevent actual submit
e.preventDefault();
// Get form values
const exp = document.querySelector("#expense").value;
const amount = document.querySelector("#amount").value;
const desc = document.querySelector("#description").value;
// Validate
if (exp == '' || amount == '' || desc == '') {
UI.showAlert('Fill all fields', 'danger');
}
else {
// Instantiate expense
const expense = new Expense(exp, amount, desc);
//console.log(expense);
// Add expense to list;
UI.addExpense(expense);
// Add expense to store
Store.addExpense(expense);
// Show success message
UI.showAlert('Expense added', 'success');
// Clear fields
UI.clearFields();
}
});
// Event: remove expense
document.querySelector('#expense-list').addEventListener('click', (e) => {
// Remove expense form UI
UI.deleteExpense(e.target);
// Remove expense from Store
Store.removeExpense(e.target.parentElement.previousElementSibling.previousElementSibling.previousElementSibling.textContent);
// Show removed message
UI.showAlert('Expense Removed', 'success');
})