-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
99 lines (75 loc) · 2.89 KB
/
script.js
File metadata and controls
99 lines (75 loc) · 2.89 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
const balanceEl = document.getElementById("balance");
const incomeAmountEl = document.getElementById("income-amount");
const expenseAmountEl = document.getElementById("expense-amount");
const transactionListEl = document.getElementById("transaction-list");
const transactionFormEl = document.getElementById("transaction-form");
const descriptionEl = document.getElementById("description");
const amountEl = document.getElementById("amount");
let transactions = JSON.parse(localStorage.getItem("transactions")) || [];
transactionFormEl.addEventListener("submit", addTransaction);
function addTransaction(e) {
e.preventDefault();
// get form values
const description = descriptionEl.value.trim();
const amount = parseFloat(amountEl.value);
transactions.push({
id: Date.now(),
description,
amount,
});
localStorage.setItem("transactions", JSON.stringify(transactions));
updateTransactionList();
updateSummary();
transactionFormEl.reset();
}
function updateTransactionList() {
transactionListEl.innerHTML = "";
const sortedTransactions = [...transactions].reverse();
sortedTransactions.forEach((transaction) => {
const transactionEl = createTransactionElement(transaction);
transactionListEl.appendChild(transactionEl);
});
}
function createTransactionElement(transaction) {
const li = document.createElement("li");
li.classList.add("transaction");
li.classList.add(transaction.amount > 0 ? "income" : "expense");
li.innerHTML = `
<span>${transaction.description}</span>
<span>
${formatCurrency(transaction.amount)}
<button class="delete-btn" onclick="removeTransaction(${transaction.id})">x</button>
</span>
`;
return li;
}
function updateSummary() {
// 100, -50, 200, -200 => 50
const balance = transactions.reduce((acc, transaction) => acc + transaction.amount, 0);
const income = transactions
.filter((transaction) => transaction.amount > 0)
.reduce((acc, transaction) => acc + transaction.amount, 0);
const expenses = transactions
.filter((transaction) => transaction.amount < 0)
.reduce((acc, transaction) => acc + transaction.amount, 0);
// update ui => todo: fix the formatting
balanceEl.textContent = formatCurrency(balance);
incomeAmountEl.textContent = formatCurrency(income);
expenseAmountEl.textContent = formatCurrency(expenses);
}
function formatCurrency(number) {
return new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
}).format(number);
}
function removeTransaction(id) {
// filter out the one we wanted to delete
transactions = transactions.filter((transaction) => transaction.id !== id);
localStorage.setItem("transcations", JSON.stringify(transactions));
updateTransactionList();
updateSummary();
}
// initial render
updateTransactionList();
updateSummary();