Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Projeto] Conclusão do curso

Concluí o curso agora e gostaria de compartilhar como ficou esse projeto. Fiz algumas mudanças em relação ao que foi feito ao longo do curso: uma delas foi criar um botão para remover todos os filtros de uma vez só, e a outra foi fazer com que os filtros de disponibilidade e de ordenação crescente dos preços não se anulassem, além de que, ao filtrar por categoria, esses filtros de disponibilidade e de ordenação não fossem esquecidos.

Segue o link do github com o projeto concluído: https://github.com/alberto-palmeira/alura-books-adicionar-livros

Segue abaixo os códigos, menos o css, já que não mudei nada.

HTML:

<!DOCTYPE html>
<html lang="pt-br">

<head>
  <meta metacharset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>AluraBooks</title>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css"
    integrity="sha512-NmLkDIU1C/C88wi324HBc+S2kLhi08PN5GDeUVVVC/BVt/9Izdsc9SVeVfA1UZbY3sHUlDSyRXhCzHfr6hmPPw=="
    crossorigin="anonymous" referrerpolicy="no-referrer" />
  <link rel="stylesheet" href="style.css" />
</head>
<header class="header">
  <h1><img src="imagens/Logo-1.png" /></h1>
</header>

<body>
  <section class="banner" data-filtro=""></section>
  <nav class="wrap">
    <ul class="nav">
      <li><button class="btn btn-front" href="#" id="btnFiltrarLivrosFront" value="front-end">LIVROS DE
          FRONT-END</button>
      </li>
      <li><button class="btn btn-back" href="#" id="btnFiltrarLivrosBack" value="back-end">LIVROS DE BACK-END</button>
      </li>
      <li><button class="btn btn-dados" href="#" id="btnFiltrarLivrosDados" value="dados">LIVROS DE DADOS</button></li>
      <li><button class="btn btn-disponiveis" href="#" id="btnLivrosDisponiveis" value="quantidade">LIVROS DISPONÍVEIS</button></li>
      <li><button class="btn btn-ordenacao" href="#" id="btnOrdenarPorPreco" value="ordenacao">ORDENAR POR PREÇO</button></li>
      <li><button class="btn btn-remove-fitro" href="#" id="btnRemoverFiltro" value="remover">REMOVER FILTRO</button></li>
    </ul>
  </nav>
  <section class="livros wrap" id="livros">
  </section>
  <section id="valor_total_livros_disponiveis">
    <!-- <div class="livros__disponiveis">
      <p>Todos os livros disponíveis por R$ <span id="valor">299,00</span></p>
    </div> -->
  </section>


  <footer class="rodape">
    <p>Alura - Mergulhe em tecnologia</p>
  </footer>
  <script src="js/main.js"></script>
  <script src="js/adiciona-livros.js"></script>
  <script src="js/aplica-desconto.js"></script>
  <script src="js/filtra-livros.js"></script>
  <script src="js/ordena-precos.js"></script>
</body>

</html>

main.js

// ---------- Funções ----------

async function getBuscarLivrosEndPoint () {
    const resposta = await fetch(endPointApi);
    livros = await resposta.json();
    livros = aplicaDesconto(livros);

    adicionaElementos(livros);
};

// ---------- Lógica ----------

let livros = [];
const endPointApi = 'https://guilhermeonrails.github.io/casadocodigo/livros.json';
getBuscarLivrosEndPoint();

adiciona-livros.js

// ---------- Funções ----------
function adicionaElementos(livros) {
    secaoLivros.innerHTML = '';

    livros.forEach(livro => {
        const disponibilidade = verificaDisponibilidade(livro);

        secaoLivros.innerHTML +=
        `<div class="livro">
            <img class="${disponibilidade}" src="${livro.imagem}" alt="${livro.alt}" />
            <h2 class="livro__titulo">
            ${livro.titulo}
            </h2>
            <p class="livro__descricao">${livro.autor}</p>
            <p class="livro__preco" id="preco">${livro.preco.toFixed(2)}</p>
            <div class="tags">
            <span class="tag">${livro.categoria}</span>
            </div>
        </div>`
    });
};

function verificaDisponibilidade(livro) {
    if (livro.quantidade > 0 ) {
        return 'livro__imagens';
    };

    return 'livro__imagens indisponivel';
};

// ---------- Lógica ----------

const secaoLivros = document.querySelector('#livros');

aplica-desconto.js

// ---------- Funções ----------

function aplicaDesconto(livros) {
    const desconto = 0.3;
    const livrosComDesconto = livros.map(elemento => {
        return {...elemento, preco: elemento.preco - (elemento.preco * desconto)} 
    });

    return livrosComDesconto;
};
3 respostas

filtra-livros.js

// ---------- Funções ----------

function filtraLivroTema(livros, tipoFiltro) {
    const resultadoFiltro = livros.filter(livro => livro.categoria === tipoFiltro);

    adicionaElementos(resultadoFiltro);
};

function filtraLivroQuantidade(livros) {
    const resultadoFiltro = livros.filter(livro => livro.quantidade > 0);

    adicionaElementos(resultadoFiltro);

    listaLivrosFiltroAplicado = resultadoFiltro;
};

function calculaValorLivrosDisponiveis (livros) {
    const valorInicial = 0;
    return livros.reduce((acumulador, valorAtual) => { 
        return acumulador + valorAtual.preco
    }, valorInicial);
};

function aplicaFiltroQuantidade(listaLivros) {
        filtraLivroQuantidade(listaLivros);

        const valorTotalLivrosDisponiveis = calculaValorLivrosDisponiveis(listaLivrosFiltroAplicado).toFixed(2);

        elementoValorTotalDosLivrosDisponiveis.innerHTML = `
            <div class="livros__disponiveis">
            <p>Todos os livros disponíveis por R$ <span id="valor">${valorTotalLivrosDisponiveis}</span></p>
            </div>
            `;
};

function aplicaFiltroPreco(listaLivros) {
    const livrosOrdenadosPreco = ordenaPrecosCrescentes(listaLivros);
    adicionaElementos(livrosOrdenadosPreco);
    listaLivrosFiltroAplicado = livrosOrdenadosPreco;
};

// ---------- Lógica ----------
let listaLivrosFiltroAplicado = '';
const botoesFiltro = document.querySelectorAll('.btn');
const elementoValorTotalDosLivrosDisponiveis = document.querySelector('#valor_total_livros_disponiveis');

botoesFiltro.forEach(botao => {

    botao.addEventListener('click', evento => {
        const tipoFiltro = evento.target.value;
        const categoria = ['front-end', 'back-end', 'dados'];

        if (tipoFiltro === 'quantidade' && listaLivrosFiltroAplicado.length == '') {
            aplicaFiltroQuantidade(livros);
        } else if (tipoFiltro === 'quantidade' && listaLivrosFiltroAplicado.length > 0) {
            aplicaFiltroQuantidade(listaLivrosFiltroAplicado);
        } else {
            elementoValorTotalDosLivrosDisponiveis.innerHTML = '';
        };

        if (categoria.includes(tipoFiltro) && listaLivrosFiltroAplicado.length == '') {
            filtraLivroTema(livros, tipoFiltro);
        };

        if (categoria.includes(tipoFiltro) && listaLivrosFiltroAplicado.length > 0) {
            filtraLivroTema(listaLivrosFiltroAplicado, tipoFiltro);
        };

        if (tipoFiltro === 'ordenacao' && listaLivrosFiltroAplicado.length == '') {
            aplicaFiltroPreco(livros);
        };

        if (tipoFiltro === 'ordenacao' && listaLivrosFiltroAplicado.length > 0) {
            aplicaFiltroPreco(listaLivrosFiltroAplicado);
        };

        if (tipoFiltro === 'remover') {
            adicionaElementos(livros);
            listaLivrosFiltroAplicado = '';
        };
    });
});

ordena-precos.js

// ---------- Funções ----------

function ordenaPrecosCrescentes (livros) {
    const livrosParaOrdenar = [...livros];
    const livrosOrdenados = livrosParaOrdenar.sort((a,b) => a.preco - b.preco);
    return livrosOrdenados;
};
solução!

Oi José, tudo bem?

Que incrível o seu projeto! Muito bom que você foi além do curso e fez novas implementações.

Vi que você também fez o deploy do projeto e testei aqui. Tudo certinho :D

Parabéns pela dedicação! É muito inspirador. Recomendo que você poste nas redes sociais e marque a Alura.

Um abraço e bons estudos.

Muito obrigado, Lorena!

Eu irei postar amanhã no LinkedIn e comentar sobre o projeto. E marcarei a Alura!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software