From 88f93c1c5eb05c525d96dfb1d930aed5bf7e688c Mon Sep 17 00:00:00 2001
From: mikel
Date: Thu, 1 Feb 2024 12:12:15 +0100
Subject: [PATCH] commit3
---
CSS/main.css | 92 ++++++++++
HTML/Contactos.html | 21 ++-
HTML/Eventos.html | 19 +++
HTML/Productos.html | 22 ++-
HTML/Servicios.html | 19 +++
HTML/index.html | 29 +++-
JS/index.js | 306 ++++++++++++++++++++++++++++------
RECURSOS/Logo/fotoCarrito.png | Bin 0 -> 16990 bytes
8 files changed, 453 insertions(+), 55 deletions(-)
create mode 100644 RECURSOS/Logo/fotoCarrito.png
diff --git a/CSS/main.css b/CSS/main.css
index 756227a..a84506f 100644
--- a/CSS/main.css
+++ b/CSS/main.css
@@ -58,6 +58,73 @@
color: white;
}
+/*----------------------------Carrito Compra---------------------------*/
+
+.cestaCompra {
+ display: flex;
+ flex-direction: row;
+ position: fixed;
+ cursor: pointer;
+ right: 5px;
+ bottom: 100px;
+ z-index: 999;
+
+}
+
+.img-carrito img{
+
+ width: 40px;
+ height: 40px;
+
+}
+.desplegable-carrito {
+ display: none;
+ opacity: 0;
+ padding: 10px;
+}
+
+.img-carrito:hover ~ .desplegable-carrito{
+ display:block;
+ opacity: 1;
+ z-index: 999;
+
+ }
+
+ .cestaCompra:hover > .desplegable-carrito{
+ display:block;
+ opacity: 1;
+ z-index: 999;
+ background-color: white;
+ }
+ .cestaCompra:hover > .img-carrito{
+ opacity: 0;
+ }
+
+ .articulo-carrito {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ }
+
+ .articulo-carrito p{
+ margin: 0 5px;
+ padding-top: 5px;
+ align-self: center;
+ }
+
+
+
+ .listaCarrito {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ }
+
+.infoArticulo {
+ display: flex;
+ flex-direction: column;
+ padding: 5px;
+}
/*----------------------------Boton Arriba------------------*/
.btn-up {
@@ -299,13 +366,25 @@
border-style: solid;
margin: 0;
font-weight: bold;
+ align-self: center;
}
.productos-disponibles {
color: #576c57;
}
+.contenedor-boton-añadir {
+ display: flex;
+ align-items: center;
+}
+.añadirProd {
+ margin: 10px;
+ border-radius: 25%;
+ width: 80px;
+ height: 60px;
+ text-overflow: ellipsis;
+}
.item-lista-productos .container-carousel .btn-left,
.item-lista-productos .container-carousel .btn-right {
@@ -677,6 +756,10 @@
}
+
+
+
+
.dropdown:hover > ul {
display:block;
opacity: 1;
@@ -1045,6 +1128,15 @@ button.boton-enviar-form {
.info-producto{
margin: 0;
padding: 0;
+ display: flex;
+ flex-direction: column;
+
+ }
+ .descripcion-producto{
+ display: flex;
+ flex-direction: row;
+ text-align: center;
+ justify-content: center;
}
.slider-section-prod {
padding: 0;
diff --git a/HTML/Contactos.html b/HTML/Contactos.html
index ab81432..5de5a88 100644
--- a/HTML/Contactos.html
+++ b/HTML/Contactos.html
@@ -39,6 +39,25 @@
+
+
+
+
+
+
+
+
Total: €
+
Vaciar
+
Tramitar
+
+
+
+
+
+
+
+
@@ -68,7 +87,7 @@
Contacta con La Forja
- Lorem ipsum dolor sit amet consectetur adipisicing elit. Officia, reprehenderit
- nostrum totam autem enim molestias dignissimos error perferendis veniam exercitationem
- aliquam temporibus libero magnam? Nihil cumque corporis error voluptatum molestias.
+
Somos una Asociación Cultural cuyos fines son el desarrollo y el fomento de actividades relacionadas con las artes plásticas, la pintura, los juegos de mesa y la promoción de eventos de tal índole.
+
- Lorem ipsum dolor sit amet consectetur adipisicing elit. Iste incidunt distinctio ipsa maxime dolore tenetur dolorem optio, minima perspiciatis minus voluptatibus nostrum asperiores eos a enim laborum, earum at adipisci.
+ Ponte en contacto con nosotros para saber más de nuestras actividades y eventos.
diff --git a/JS/index.js b/JS/index.js
index 5d2b019..00ac3fe 100644
--- a/JS/index.js
+++ b/JS/index.js
@@ -3,9 +3,13 @@
/* posteriormente la información a cargar estará en una DB, la idea es más adelante hacer
una página de backoffice desde donde el admin gestionará los cambios
(adición, eliminación o modificación de productos, eventos...) */
- const infoProductos = [
+
+
+ let cestaCompra = [];
+
+ const infoProductos = [
{
- numeroproducto: 1,
+ numeroproducto: 0,
titulo: "Primaris Invictor Tactical Warsuit",
img1: "../RECURSOS/Productos/Invictor300px.jpg",
img2: "../RECURSOS/Productos/InvictorLado300px.jpg",
@@ -13,10 +17,10 @@
alt:"Invictor",
textodescrip: "Armadura de combate de los Ángeles Oscuros completamente pintada con un alto grado de detalle y personalización.",
disponibles: 1,
- precio: "150,00"
+ precio: 150.00
},
{
- numeroproducto: 2,
+ numeroproducto: 1,
titulo: "Termagantes Tiránidos",
img1: "../RECURSOS/Productos/TermagantesFront300px.jpg",
img2: "../RECURSOS/Productos/TermagantesLado300px.jpg",
@@ -24,10 +28,10 @@
alt: "Termagantes",
textodescrip: "Unidad Básica de 10 Termagantes listos para la batalla. Especialistas en cuerpo a cuerpo, pese a no ser de élite aprovechan su gran número.",
disponibles: 1,
- precio: "139,00"
+ precio: 139.00
},
{
- numeroproducto: 3,
+ numeroproducto: 2,
titulo: "Primaris Inceptor Squad",
img1: "../RECURSOS/Productos/Inceptor300px.jpg",
img2: "../RECURSOS/Productos/InceptorLado300px.jpg",
@@ -35,10 +39,10 @@
alt: "Inceptores",
textodescrip: "Unidad de 3 Primaris Inceptors Ángeles Oscuros en armadura gravis equipados con armas de plasma.",
disponibles: 1,
- precio: "149,00"
+ precio: 149.00
},
{
- numeroproducto: 4,
+ numeroproducto: 3,
titulo: "Teniente Primaris Ángel Oscuro",
img1: "../RECURSOS/Productos/Teniente300px.jpg",
img2: "../RECURSOS/Productos/TenienteLadoDos300px.jpg",
@@ -46,10 +50,10 @@
alt: "Teniente",
textodescrip: "Teniente Primaris de los Ángeles Oscuros equipado con arma de energía y pistola de plasma.",
disponibles: 1,
- precio: "85,00"
+ precio: 85.00
},
{
- numeroproducto: 5,
+ numeroproducto: 4,
titulo: "Guerreros Tiránidos",
img1: "../RECURSOS/Productos/TyranidWarriorUnoFront300px.jpg",
img2: "../RECURSOS/Productos/TyranidWarriorUno300px.jpg",
@@ -57,7 +61,7 @@
alt: "Guerrero Tiranido",
textodescrip: "Versátil unidad de 2 guerreros y 1 primus. Bio-armas de disparo a distancicia y garras y látigo para el cuerpo a cuerpo.",
disponibles: 1,
- precio: "129,00"
+ precio: 129.00
}
]
@@ -158,7 +162,7 @@ const cargado = () => {
//--------------------- CONFIGURACIÓN CARRITO COMPRA -------------------------------------
-
+ renderizarCesta();
//--------------------- CONFIGURACIÓN CONTENEDOR SERVICIOS -------------------------------------
@@ -183,54 +187,258 @@ const cargado = () => {
})
})
+
+
}
-
-
-
-
//--------------------- CONFIGURACIÓN CONTENEDOR PRODUCTOS --------------------------------
-const genListaProd = () => {
- let contenedorProd = document.getElementById("contenedorProductos2");
-
- for (let i = 0; i < infoProductos.length; i++){
-
- contenedorProd.innerHTML += `
-
-
- ${infoProductos[i].titulo}
-
-
-
-
-
-
-
-
+ function guardarEnCarrito() {
-
-
-
-
-
<
-
>
-
-
-
- `}
+ let prodAñadido = this.event.target.getAttribute("marcador");
+ let controlCesta = cestaCompra.includes(prodAñadido);
+ leerCesta();
+ if ( cestaCompra.length == 0 || !controlCesta) {
+ cestaCompra.push(prodAñadido);
+
+ try {
+ localStorage.setItem('numProd', JSON.stringify(cestaCompra));
+ renderizarCesta();
+
+ } catch (e) {
+ return "Error al guardar el item en el localStorage: " + e.message;
+ }
+ }
+
+
+ }
+
+ function borrarArticulo() {
+ let prodABorrar = this.event.target.getAttribute("marcador");
+ let indice = cestaCompra.indexOf(prodABorrar);
+ cestaCompra.splice(indice, 1);
+ try {
+ localStorage.setItem('numProd', JSON.stringify(cestaCompra));
+ renderizarCesta();
+
+ } catch (e) {
+ return "Error al guardar el item en el localStorage: " + e.message;
+ }
+ }
+
+ function renderizarCesta(){
+
+ leerCesta()
+ let elCarrito = document.getElementById("carrito");
+ let elPrecioTotal = document.getElementById("total");
+ elCarrito.textContent = "";
+ elPrecio = 0;
+ for (i = 0; i < cestaCompra.length; i++) {
+ let numeroControl = cestaCompra[i];
+ let articuloCarrito = document.createElement("li");
+ elCarrito.appendChild(articuloCarrito);
+ articuloCarrito.setAttribute("class", "articulo-carrito");
+
+ let contenedorArticuloCarrito = document.createElement("figure");
+ articuloCarrito.appendChild(contenedorArticuloCarrito);
+ contenedorArticuloCarrito.setAttribute("class", "img-carrito");
+
+ let imagenArticuloCarrito = document.createElement("img");
+ contenedorArticuloCarrito.appendChild(imagenArticuloCarrito);
+ imagenArticuloCarrito.setAttribute("src", infoProductos[numeroControl].img1);
+ imagenArticuloCarrito.setAttribute("alt", "imagen");
+
+ let textoArticulocarrito = document.createElement("p");
+ articuloCarrito.appendChild(textoArticulocarrito);
+ textoArticulocarrito.innerText = infoProductos[numeroControl].titulo;
+
+ let infoArticulo = document.createElement("div");
+ articuloCarrito.appendChild(infoArticulo);
+ infoArticulo.setAttribute("class", "infoArticulo")
+
+ let precioArticuloCarrito = document.createElement("p");
+ infoArticulo.appendChild(precioArticuloCarrito);
+ precioArticuloCarrito.innerText = infoProductos[numeroControl].precio + " €";
+ elPrecio = elPrecio + infoProductos[numeroControl].precio
+
+ let botonBorrarArticulo = document.createElement("button");
+ infoArticulo.appendChild(botonBorrarArticulo);
+ botonBorrarArticulo.innerText = "Eliminar";
+ botonBorrarArticulo.setAttribute("type", "button");
+ botonBorrarArticulo.setAttribute("onclick", "borrarArticulo()");
+ botonBorrarArticulo.setAttribute("marcador", infoProductos[numeroControl].numeroproducto);
+
+ }
+ elPrecioTotal.textContent = elPrecio
+ }
+
+
+
+ function eliminarCesta() {
+ localStorage.removeItem("numProd");
+ let elCarrito = document.getElementById("carrito");
+ elCarrito.textContent = "";
+ cestaCompra = [];
+ }
+
+ function leerCesta() {
+
+
+ var lecturaCesta = JSON.parse(localStorage.getItem('numProd'));
+ if (lecturaCesta === null) {
+ cestaCompra = [];
+ } else {
+ cestaCompra = lecturaCesta;
+ }
+
+
+
+ }
+ let textoInputPedido = "";
+
+
+ function tramitarPedido(){
+
+ window.location.href = "./Contactos.html";
+ alert("Solicita Informacion aqui")
+ }
+
+ /** function tramitarEncargo() {
+ let asuntoPedido = document.getElementById("formSubject");
+ asuntoPedido.value = "Solicitud Compra Productos";
+ console.log(asuntoPedido.value)
+ let inputPedido = document.getElementById("formComment");
+ textoPedido();
+ inputPedido.innerText = textoInputPedido;
+
+ console.log(asuntoPedido.value)
+ }
+
+
+ function textoPedido(){
+ let textoInputPedido = `Hola me gustaria saber la disponibilidad de: `;
+ let precioPedido = 0;
+ console.log(textoInputPedido)
+ for (i = 0; i < cestaCompra.length; i++) {
+ let numControl = cestaCompra[i];
+ console.log(numControl)
+ let nombreProd = infoProductos[numControl].titulo;
+ let precioPedido = precioPedido + infoProductos[numControl].precio;
+ textoInputPedido = textoInputPedido + `${nombreProd}, `
+ }
+ textoInputPedido = textoInputPedido + `el precio total seria de: ${precioPedido} €. Muchas gracias.`
+ return textoInputPedido;
+ }*/
+
+const genListaProd = () => {
+
+
+ let contenedorProd = document.getElementById("contenedorProductos2");
+
+ for (let i = 0; i < infoProductos.length; i++){
+
+ let itemListaProd = document.createElement("li");
+ contenedorProd.appendChild(itemListaProd);
+ itemListaProd.setAttribute("class", "item-lista-productos");
+
+ let tituloProd = document.createElement("h3");
+ itemListaProd.appendChild(tituloProd);
+ var textotitulo = document.createTextNode(infoProductos[i].titulo)
+ tituloProd.appendChild(textotitulo);
+
+ let contenedorCarrousel = document.createElement("div");
+ itemListaProd.appendChild(contenedorCarrousel);
+ contenedorCarrousel.setAttribute("class", "container-carousel")
+
+ let carruselesProd = document.createElement("div");
+ contenedorCarrousel.appendChild(carruselesProd);
+ carruselesProd.setAttribute("class", "carruseles-prod");
+
+ let fotoUnoProd = document.createElement("figure");
+ carruselesProd.appendChild(fotoUnoProd);
+ fotoUnoProd.setAttribute("class", "slider-section-prod")
+
+ let imgUno = document.createElement("img");
+ fotoUnoProd.appendChild(imgUno);
+ imgUno.setAttribute("src", infoProductos[i].img1)
+ imgUno.setAttribute("alt", infoProductos[i].alt)
+
+ let fotoDosProd = document.createElement("figure");
+ carruselesProd.appendChild(fotoDosProd);
+ fotoDosProd.setAttribute("class", "slider-section-prod")
+
+ let imgDos = document.createElement("img");
+ fotoDosProd.appendChild(imgDos);
+ imgDos.setAttribute("src", infoProductos[i].img2)
+ imgDos.setAttribute("alt", infoProductos[i].alt)
+
+ let fotoTresProd = document.createElement("figure");
+ carruselesProd.appendChild(fotoTresProd);
+ fotoTresProd.setAttribute("class", "slider-section-prod")
+
+ let imgTres = document.createElement("img");
+ fotoTresProd.appendChild(imgTres);
+ imgTres.setAttribute("src", infoProductos[i].img3)
+ imgTres.setAttribute("alt", infoProductos[i].alt)
+
+ let btnIzq = document.createElement("button");
+ contenedorCarrousel.appendChild(btnIzq);
+ btnIzq.setAttribute("type", "button");
+ btnIzq.setAttribute("class", "btn-left");
+ btnIzq.setAttribute("onclick", "moveToLeft()");
+ btnIzq.innerText = " < "
+
+ let btnDcha = document.createElement("button");
+ contenedorCarrousel.appendChild(btnDcha);
+ btnDcha.setAttribute("type", "button");
+ btnDcha.setAttribute("class", "btn-right");
+ btnDcha.setAttribute("onclick", "moveToRight()");
+ btnDcha.innerText = " > "
+
+ let listaInfoProd = document.createElement("ul");
+ itemListaProd.appendChild(listaInfoProd);
+ listaInfoProd.setAttribute("class", "info-producto")
+
+ let descProd = document.createElement("li");
+ listaInfoProd.appendChild(descProd);
+ descProd.setAttribute("class", "descripcion-producto");
+
+ let textoProd = document.createElement("p");
+ descProd.appendChild(textoProd);
+ textoProd.setAttribute("class", "texto-descrip-prod")
+ textoProd.innerText = infoProductos[i].textodescrip
+
+ let dispoProd = document.createElement("p");
+ descProd.appendChild(dispoProd);
+ dispoProd.setAttribute("class", "productos-disponibles")
+ dispoProd.innerText = "Disponibles: " + infoProductos[i].disponibles
+
+ let precioProd = document.createElement("li");
+ listaInfoProd.appendChild(precioProd);
+ precioProd.setAttribute("class", "precio-producto");
+ precioProd.innerText = infoProductos[i].precio.toFixed(2) + "€";
+
+ let liBotonAñadir = document.createElement("li");
+ listaInfoProd.appendChild(liBotonAñadir);
+ liBotonAñadir.setAttribute("class", "contenedor-boton-añadir");
+
+ let botonAñadir = document.createElement("button");
+ liBotonAñadir.appendChild(botonAñadir);
+ botonAñadir.setAttribute("type", "button");
+ botonAñadir.setAttribute("class", "añadirProd");
+ botonAñadir.setAttribute("marcador", infoProductos[i].numeroproducto);
+ botonAñadir.setAttribute("onclick", "guardarEnCarrito()");
+ botonAñadir.innerText = "Añadir a Cesta";
+
}
+
+}
+
/** más adelante se creará un botón para añadir a un carrito y un contenedor para los articulos del carrito
con sus correspondientes botones para quitar el producto, un espacio donde figure la suma de las cantidades, etc. */
diff --git a/RECURSOS/Logo/fotoCarrito.png b/RECURSOS/Logo/fotoCarrito.png
new file mode 100644
index 0000000000000000000000000000000000000000..93046e4e0b019fea484c24d2f5dc9d2703e0ec36
GIT binary patch
literal 16990
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
BX