<!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); } }