-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.js
130 lines (98 loc) · 3.46 KB
/
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
// DOM Elements.
const balance = document.getElementById("balance");
const money_plus = document.getElementById("money-plus");
const money_minus = document.getElementById("money-minus");
const list = document.getElementById("list");
const form = document.getElementById("form");
const text = document.getElementById("text");
const amount = document.getElementById("amount");
const localStorageTransactions = JSON.parse(
localStorage.getItem("transactions")
);
let transactions =
localStorage.getItem("transactions") !== null ? localStorageTransactions : [];
// Function to add transaction.
addTransaction = (event) => {
event.preventDefault();
if (text.value.trim() === "" || amount.value.trim() === "") {
// Gets the snackbar.
const notification = document.getElementById("snackbar");
// Adds the "show" class to snackbar.
notification.className = "show";
// After 3 seconds, removes the show class from snackbar.
setTimeout(() => {
notification.className = notification.className.replace("show", "");
}, 3000);
} else {
const transaction = {
id: generateID(),
text: text.value,
amount: +amount.value,
};
transactions.push(transaction);
addTransactionToDOM(transaction);
updateValues();
updateLocalStorage();
text.value = "";
amount.value = "";
}
};
// Function to generate a random ID.
generateID = () => {
return Math.floor(Math.random() * 100000000);
};
// Function to add transaction to DOM list.
addTransactionToDOM = (transaction) => {
// Gets sign of the amount dependent on if the number is less than or greater than zero.
const sign = transaction.amount < 0 ? "-" : "+";
const item = document.createElement("li");
// Adds class based on negative or positive value.
item.classList.add(transaction.amount < 0 ? "minus" : "plus");
item.innerHTML = `${transaction.text} <span>${sign}${Math.abs(
transaction.amount
)}</span> <button class="delete-btn" onclick="deleteTransaction(${
transaction.id
})">x</button>`;
list.appendChild(item);
};
// Function to update the balance, income, and expense.
updateValues = () => {
const amounts = transactions.map((transaction) => transaction.amount);
const total = amounts.reduce((acc, item) => (acc += item), 0).toFixed(2);
const income = amounts
.filter((item) => item > 0)
.reduce((acc, item) => (acc += item), 0)
.toFixed(2);
const expense = (
amounts.filter((item) => item < 0).reduce((acc, item) => (acc += item), 0) *
-1
).toFixed(2);
balance.innerText = `$${total}`;
money_plus.innerText = `$${income}`;
money_minus.innerText = `$${expense}`;
balanceColorChange(total);
};
// Function to make a color change to the balance dependent on negative or positive value.
balanceColorChange = (total) => {
balance.classList.remove("minus");
balance.classList.add(total < 0 ? "minus" : "plus");
};
// Function to delete transaction (by id).
deleteTransaction = (id) => {
transactions = transactions.filter((transaction) => transaction.id !== id);
updateLocalStorage();
init();
};
// Function to update the transactions to localStorage.
updateLocalStorage = () => {
localStorage.setItem("transactions", JSON.stringify(transactions));
};
// Function to initialize application.
init = () => {
list.innerHTML = "";
transactions.forEach(addTransactionToDOM);
updateValues();
};
init();
// Event listener for the "Add Transaction" button.
form.addEventListener("submit", addTransaction);