Simulação de sistema bancário armazenando dados localmente no dispositivo feito com html css e javascript JSON




Simulação de sistema bancário armazenando dados localmente no dispositivo feito com html css e  javascript JSON



CÓDIGO FONTE :

<!DOCTYPE html>
<html lang="pt-br">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="./style.css" />
    <title>Controle de despesas</title>



<style>

/*@import url('https://fonts.googleapis.com/css?family=Lato&display=swap');*/

:root {
  --box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
}

* {
  box-sizing: border-box;
  color: #ffffff;
}

body {
  background-color: #202033;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-height: 100vh;
  margin: 0;
  font-family: 'Lato', sans-serif;
}

.container {
  margin: 0px auto;
  width: 80%;
}
.mai{
  position: relative;
  display: flex;
  width: 100%;
  height: 200px;
  justify-content: center;
  align-items: center;
}
.form-control{
  background-color: #38364b;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
  width: 100%;
  border-radius: 20px;
}
.form1{
  position: relative;
  background-color: #38364b;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 150px;
  width: 100%;
  border-radius: 20px;
}
#text,#amount{
  width: 300px;
  display: flex;
}
h1 {
  letter-spacing: 1px;
  margin: 0;
  color: #2e75cc;
}

h3 {
  border-bottom: 1px solid #bbb;
  padding-bottom: 10px;
  margin: 20px 0 10px;
}

h4 {
  margin: 0;
  text-transform: uppercase;
}

.inc-exp-container{
  background-color:#38364b;
  box-shadow: var(--box-shadow);
  padding: 30px;
  display: flex;
  justify-content: space-between;
  margin: 10px 0;
  width: 50%;
}

.inc-exp-container > div {
  flex: 1;
  text-align: center;
}

.inc-exp-container,mai > div:first-of-type {
  border-right: 1px solid #dedede;
}

.money {
  font-size: 20px;
  letter-spacing: 1px;
  margin: 5px 0;
}

.money.plus {
  color: #2ecc71;
}

.money.minus {
  color: #c0392b;
}

label {
  display: inline-block;
  margin: 10px 0;
}

input[type='text'],
input[type='number'] {
  border: 1px solid #222224;
  border-radius: 2px;
  display: block;
  font-size: 16px;
  padding: 10px;
  width: 100%;
  background:#38364b;
  outline: none;
  border-radius: 20px;
}

.btn {
  cursor: pointer;
  background-color: #9c88ff;
  box-shadow: var(--box-shadow);
  color: #fff;
  border: 0;
  display: block;
  font-size: 16px;
  margin: 10px 0 20px;
  padding: 10px;
  width: 100%;
  border-radius: 20px;
}
.btn:hover{
  box-shadow: rgb(73, 75, 94) 1px 1px 5px;
}

.btn:focus,
.delete-btn:focus {
  outline: 0;
}

.transactions {
  list-style-type: none;
  padding: 0;
  margin-bottom: 40px;
}

.transactions li {
  background-color: #fff;
  box-shadow: var(--box-shadow);
  color: #333;
  display: flex;
  justify-content: space-between;
  position: relative;
  padding: 10px;
  margin: 10px 0;
}

.transactions li.plus {
  border-right: 5px solid #00ff6a;
 
}

.transactions li.minus {
  border-right: 5px solid #c0392b;
 
}

.delete-btn {
  cursor: pointer;
  background-color: #e74c3c;
  border: 0;
  color: #fff;
  font-size: 20px;
  line-height: 20px;
  padding: 2px 5px;
  position: absolute;
  top: 50%;
  left: 0;
  transform: translate(-100%, -50%);
  opacity: 0;
  transition: opacity 0.3s ease;
}

.transactions li:hover .delete-btn {
  opacity: 1;
}


</style>


  </head>
  <body>
    <h2>Controle de despesas</h2>

    <div class="container">
      <h4>Saldo atual</h4>
     
      <h1 id="balance" class="balance">KZ 0.00</h1>


      <div class="mai"><!--#####################1-->

            <div class="inc-exp-container">
              <div>
                <h4>Receitas</h4>
                <p id="money-plus" class="money plus">+KZ0.00</p>
              </div>

              <div>
                <h4>Despesas</h4>
                <p id="money-minus" class="money minus">-KZ0.00</p>
              </div>
            </div>
    </div><!--#####################1-->
      <h3>Transações</h3>
      <br>
      <ul id="transactions" class="transactions"> </ul>

      <h3>Adicionar transação</h3>
     
      <form id="form" >


        <div class="form1"><!--#####################2-->


        <div class="form-control">
          <label for="text">Nome </label>
          <input autofocus type="text" id="text" placeholder="Nome da transação" />
        </div>

        <div class="form-control">
          <label for="amount">Valor </label>
          <input type="number" id="amount" placeholder="Valor da transação" />
        </div>
      </div><!--##################### 2-->

        <button class="btn">Adicionar</button>
      </form>
    </div>

    <script>


const transactionUl = document.querySelector('#transactions')
const incomeDisplay = document.querySelector('#money-plus')
const expenseDisplay = document.querySelector('#money-minus')
const balanceDisplay = document.querySelector('#balance')
const form = document.querySelector('#form')
const inputTransactionNome = document.querySelector('#text')
const inputTransactionAmount = document.querySelector('#amount')




/*let transactions =
[

    {  id: 1, nome: 'bolo de brigadeiro', amount: -20 },
    {  id: 2, nome: 'salário ', amount: 300 },
    {  id: 3, nome: 'torta de frango', amount: -10 },
    {  id: 4, nome: 'violão', amount: 150 }
]
*/


const localStorageTransactions = JSON.parse(localStorage.getItem('transactions'))
let transactions = localStorage.getItem('transactions') !== null ? localStorageTransactions:[]


const removeTransaction = ID =>
{
    transactions = transactions.filter(transaction => transaction.id !== ID)
    updateLocalStorage()
    init()
}


const addTransactionIntDOM = transaction =>
{
    const operator = transaction.amount < 0 ?  '-' : '+'
    const CSSClass = transaction.amount < 0 ? 'minus' : 'plus'
    const amountWithouOperator = Math.abs(transaction.amount)
    const li = document.createElement('li')

    li.classList.add(CSSClass)
    li.innerHTML = `
    ${transaction.nome} <span style="color: black;">${operator} kz ${amountWithouOperator}</span>
    <button class="delete-btn" onclick="removeTransaction(${transaction.id})" >x</button>
    `
    transactionUl.prepend(li)
}

const updateBalanceValue = () =>
{
    const transactionAmounts = transactions.map(transaction => transaction.amount)
    const total   = transactionAmounts.reduce((accumulator, transaction) => accumulator + transaction,0).toFixed(2)
    const income  = transactionAmounts.filter(value => value > 0).reduce((accumulator, value) => accumulator + value, 0).toFixed(2)
    const expense = transactionAmounts.filter(value => value < 0).reduce((accumulator, value) => accumulator + value, 0).toFixed(2)

    balanceDisplay.textContent = `KZ ${total}`
    incomeDisplay.textContent = `KZ ${income}`
    expenseDisplay.textContent = `KZ ${Math.abs(expense)}`
   
}

const init = () =>
{
    transactionUl.innerHTML =  ' '
    transactions.forEach(addTransactionIntDOM)
    updateBalanceValue()
}


init()


const updateLocalStorage = () =>
{
    localStorage.setItem('transactions', JSON.stringify(transactions))
}

const generateID = () =>Math.round(Math.random() * 1000)

form.addEventListener('submit', event =>
{
    event.preventDefault()
    const transictionNome = inputTransactionNome.value.trim()
    const transictionAmount = inputTransactionAmount.value.trim()
   
    if ( transictionNome === '' || transictionAmount === '')
    {
        return
    }

    const transaction = { id: generateID(), nome: transictionNome, amount: Number(transictionAmount)}
   

    transactions.push(transaction)
    init()
    updateLocalStorage()

    inputTransactionAmount.value = ''
    inputTransactionNome.value = ''
})


</script>
  </body>
</html>



Postar um comentário

0 Comentários

Ad Code