-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.js
273 lines (208 loc) · 7.48 KB
/
main.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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
//Este objeto tem a funcionalidade de ligar e desligar o modal
const modal = {
open() {
//Abrir modal
document.querySelector('.modal-overlay').classList.add('active')
//Adicionar a class active ao modal
},
close() {
//Remover o modal
document.querySelector('.modal-overlay').classList.remove('active')
}
}
// Este objeto armazena as informações na localStorage do browser
const Storage = {
// Pegar
get() {
// parse é a funcionalidade que vai pegar a minhas strings e transformar elas em uma array ou objeto para array
return JSON.parse(localStorage.getItem('dev.finances: transaction')) || []
},
// Setar
set(transaction) {
//Ele vai transformar as minhas transaction em uma string
localStorage.setItem('dev.finances: Transaction', JSON.stringify(transaction))
}
}
// Meus dados da tabela
const Transaction = {
all: Storage.get(),
// Adiconar uma transação
add(transaction) {
Transaction.all.push(transaction)
App.reload()
},
// remove uma transação (index) é uma imagem de formato circular com um traço vermelho em que toda vez que clicar nele a tabela é desfeita
remove(index) {
Transaction.all.splice(index, 1)
App.reload()
},
// Somando as contas
incomes() {
let income = 0
// Pega cada transação
Transaction.all.forEach(transaction => {
// Se ela for maior que zero
if (transaction.amount > 0) {
// Soma a uma variavel e retonar a variavel
income += transaction.amount
}
})
return income
},
// subtraindo as contas
expenses() {
let expense = 0
// Pega cada transação
Transaction.all.forEach(transaction => {
// Se ela for maior que zero
if (transaction.amount < 0) {
// Como estou subtraindo os sinais nesse caso são inverso, o mais para fronte e os
expense += transaction.amount
}
})
return expense
},
// totalizando as
total() {
return Transaction.incomes() + Transaction.expenses()
}
}
//Substituir os dados do HTML com os dados do JS
const DOM = {
//To adicionando as tabela no tbody do HTML
transactionContainer: document.querySelector('#data-table tbody'),
addTransaction(transaction, index) {
const tr = document.createElement('tr')
tr.innerHTML = DOM.innerHTMLTransaction(transaction, index)
tr.dataset.index = index
//Elemento criado pelo HTML
DOM.transactionContainer.appendChild(tr)
},
innerHTMLTransaction(transaction, index) {
//verifica se o numero é maior que 0, se sim, é ganho(income), senão e perda(expense)
const CSSclass = transaction.amount > 0 ? 'income' : 'expense'
const amount = Utils.formatCurrency(transaction.amount)
// Modelo padrão da tabela HTMl, quando toda vez for adicionar algo novo, esse esqueleto de tabela é feito assim gerando outra tabela da mesma forma
const html = `
<td class="description">${transaction.description}</td>
<td class="${CSSclass}">${amount}</td>
<td class="date">${transaction.date}</td>
<td>
<img onclick="Transaction.remove(${index})" src="./assets/assets/minus.svg" alt="Remover Transação">
</td>
`
return html
},
// Mostrar os valores atualizados
updateBalance() {
//
document.getElementById('incomeDisplay').innerHTML = Utils.formatCurrency(Transaction.incomes())
document.getElementById('expenseDisplay').innerHTML = Utils.formatCurrency(Transaction.expenses())
document.getElementById('totalDisplay').innerHTML = Utils.formatCurrency(Transaction.total())
},
clearTransaction() {
DOM.transactionContainer.innerHTML = ''
}
}
const Utils = {
formatAmount(value) {
value = Number(value) * 100
return value
},
// Forma as datas
formatDate(date) {
const splittedDate = date.split('-')
return `${splittedDate[2]}/${splittedDate[1]} ${splittedDate[0]}`
},
formatCurrency(value) {
// To fazendo uma lógica na qual to forçando o dato (value) para ser um Number, e com isso to dizendo que se o (value) for menor que 0, add um -(negativo), caso não, não add nada
const signal = Number(value) < 0 ? '-' : ''
// O "/\D/g" é uma caracteristica prorpia da expressão regular que pega todo o conteudo de string e transformando em puro numero
value = String(value).replace(/\D/g, '')
// Adiciona o ponto ao final do valor recebido
value = Number(value) / 100
// Formatando a moeda para BRL (Real)
value = value.toLocaleString('pt-BR', {
style: 'currency',
currency: 'BRL',
})
return signal + value
}
}
const Form = {
// Esta forma eu to linkando com os inputs lá do HTML
description: document.querySelector('input#description'),
amount: document.querySelector('input#amount'),
date: document.querySelector('input#date'),
// Toda vez em que eu acessar o getValue eu vou ter todos os valores
getValues() {
return {
description: Form.description.value,
amount: Form.amount.value,
date: Form.date.value,
}
},
// Vai validar os dados
validateFields() {
const { description, amount, date } = Form.getValues()
if (description.trim() === '' ||
amount.trim() === '' ||
date.trim() === '') {
// Lança um erro caso o usuario não coloque todos os dados
throw new Error('Por favor, preencha todas as informações')
}
},
// Formata os valores adicionadas
formatValues() {
let { description, amount, date } = Form.getValues()
amount = Utils.formatAmount(amount)
date = Utils.formatDate(date)
return {
description,
amount,
date
}
},
// Salva a transação
saveTransaction(transaction) {
transaction.add(transaction)
},
// Limpando os campos a transação
clearFields() {
Form.description.value = ''
Form.amount.value = ''
Form.date.value = ''
},
submit(event) {
// Quando chegar aqui ele não vai gerar varios numeros ao lado da URL
event.preventDefault()
// Aqui eu estou tratando o erro caso a pessoa não tenha colocado todas as informações do formulario, e este erro esta sendo lançando uma nova mensagem no validateFields -> if -> throw.
try {
// Verificar se todas as informações foram preenchidas
Form.validateFields()
// formatar os dados para salvar
const transaction = Form.formatValues()
// Salvar
Transaction.add(transaction)
// apagar os dados do formulario
Form.clearFields()
// modal feche
modal.close()
} catch (e) {
alert("Error: " + e.message)
}
}
}
const App = {
init() {
Transaction.all.forEach(DOM.addTransaction)
DOM.updateBalance()
Storage.set(Transaction.all)
},
// Toda vez que acontece algo na transaction ele recarrega, assim dando um reload()
reload() {
DOM.clearTransaction()
App.init()
}
}
App.init()