Solución ejercicio examen

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Bolsa de horas</title>
    <!-- Latest compiled and minified CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">

    <!-- Latest compiled JavaScript -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</head>

<body>
    <div class="container">
        <div class="row">
            <div class="col-md-4  ">
                <form>
                    <h3 class="mt-5 ">Datos del pedido</h3>
                    <div class="mb-3 mt-3">
                        <label for="cliente" class="form-label">Cliente:</label>
                        <input type="text" class="form-control" id="cliente" placeholder="Introduzca el nombre del cliente" name="cliente">
                      </div>
                      <div class="mb-3">
                        <label for="horas" class="form-label">Horas:</label>
                        <input type="number" class="form-control" id="horas" placeholder="Introduzca las horas" name="horas">
                      </div>
                      <div class="btn-group mb-3">
                        <button type="button" class="btn btn-primary tipoEmpleado">Junior</button>
                        <button type="button" class="btn btn-primary tipoEmpleado">Senior</button>
                        <button type="button" class="btn btn-primary tipoEmpleado">Master</button>
                      </div>
                      <div>
                      <button id="addPedido" type="button" class="btn btn-success ">Añadir</button>
                    </div>
               
                </form>
            </div>
            <div class="col-md-8 ">
                <h1 class="mt-3 display-3 ">Bolsa de horas</h1>
                <table class="table table-striped ">
                    <thead>
                        <tr>
                            <th>Nombre cliente</th>
                            <th>Horas contratadas</th>
                            <th>Horas restantes</th>
                            <th>Tipo empleado</th>
                            <th>Importe</th>
                            <th>Acciones</th>         
                        </tr>
                    </thead>
                    <tbody id="tabla">

                    </tbody>
                </table>
            </div>
        </div>
    </div>
    <script src="js/script.js"></script>
</body>

</html>
let estado = {} // Para guardar todos los componentes que me hacen falta

window.onload = function () {
    // Guardo todos los accesos a los elementos html que necesito
    // Me olvido del html para el resto del código
    estado.tabla=document.getElementById("tabla");
    estado.cliente=document.getElementById("cliente");
    estado.horas=document.getElementById("horas");
    estado.addPedido=document.getElementById("addPedido");
    estado.tipoEmpleado=document.getElementsByClassName("tipoEmpleado");
    estado.tipoSeleccionado=""
    estado.precios={"Junior":30,"Senior":60,"Master":80}
    asociarEventos("tipoEmpleado",clickEmpleado);
    estado.pedidos=[]
    estado.addPedido.addEventListener("click",addPedido);
    iniciar();
}
function iniciar() {
    // Rcupero los datos del storage esto se hace solo una vez
    getStorageData();
    pintarPedidos();
  
}
function addPedido(){
    // Recuperar los datos del formulario
    let horas=Number(estado.horas.value);
    let precio=estado.precios[estado.tipoSeleccionado] || 30;
    let pedido={
        nombre:estado.cliente.value,
        horas:horas,
        tipoEmpleado:estado.tipoSeleccionado, // TODO: a ver que hago con esto
        restantes:horas,
        importe:horas*precio
    }
    // Añadir al pedido el objeto
    estado.pedidos.push(pedido);
    // volver a pintar los datos
    pintarPedidos();
}
function consumir(){
    let idpedido=this.dataset.idpedido;
    estado.pedidos[idpedido].restantes--;
    if (estado.pedidos[idpedido].restantes<=0){
        estado.pedidos.splice(idpedido,1);
    }
    pintarPedidos();
}
function clickEmpleado(){
    
    for (let boton of estado.tipoEmpleado){
        boton.classList.remove("active");
    }
    this.classList.add("active");
    estado.tipoSeleccionado=this.innerHTML
}
// Una capa intermedia entre la función pura y nuestro programa
// Con el fin de que todo sea más escalable
function pintarPedidos() {
    setStorageData();
    pintarDatos(estado.pedidos, estado.tabla)
}

function pintarDatos(pedidos, destino) {
    lista = "";
    let totalHoras=0;
    let totalImporte=0;
    let i=0;
    for (let pedido of pedidos) {
        lista += `<tr>
        <td>${pedido.nombre}</td>
        <td>${pedido.horas}</td>
        <td>${pedido.restantes}</td>
        <td>${pedido.tipoEmpleado}</td>
        <td>${pedido.importe}</td>
        <td>
        <button data-idpedido="${i}" type="button" class="btn btn-danger btn-sm  consumir">
            Consumir
        </button>
      
        </td></tr>`;
        i++
        
        totalHoras+=pedido.restantes;
        totalImporte+=pedido.importe
    }
     lista += pedidos.length>0?`<tr><td></td><td>Horas</td>
     <td>${totalHoras}</td><td>Importe</td><td>${totalImporte}</td></tr>`:"";

    destino.innerHTML = lista;
    asociarEventos("consumir",consumir)
   
}
// Funciones de localStorage
function getStorageData(){
    let pedidos=localStorage.getItem("pedidos") || "[]";
    pedidos=JSON.parse(pedidos);
    estado.pedidos=pedidos
}
function setStorageData(){
    localStorage.setItem("pedidos",JSON.stringify(estado.pedidos))
}
function asociarEventos(clase,funcion){
    for (let boton of document.getElementsByClassName(clase)) {
        boton.addEventListener("click",funcion);
    }
}

Publicado por

Juan Pablo Fuentes

Formador de programación y bases de datos