OUJOOD.COM
đ§Ÿ Structure HTML dâaffichage du panier
Dans ce chapitre, nous allons :
- â EmpĂȘcher dâajouter plus dâunitĂ©s quâil nây en a en stock
- đ Afficher un message dâalerte en cas de dĂ©passement
- â Garder les boutons â â pour ajuster la quantitĂ©
<div id="liste-produits"></div> <p><strong>Total :</strong> <span id="total">0 âŹ</span></p> <div id="alerte" style="color: red; font-weight: bold;"></div>
<div id="liste-produits">: contiendra dynamiquement les lignes du panier (produit + boutons â â)<span id="total">: affichera le total actualisĂ© du panier<div id="alerte">: affichera un message dâerreur si le stock est dĂ©passĂ©
𧱠1. Définir la classe Produit
class Produit {
constructor(id, nom, prix, stock, description) {
this.id = id;
this.nom = nom;
this.prix = prix;
this.stock = stock;
this.description = description;
}
}
id: identifiant uniquenom: nom du produitprix: prix unitairestock: quantité maximum disponibledescription: texte optionnel (non utilisé ici)
đ§± 2. Classe Panier avec limite de stock
class Panier {
constructor() {
this.elements = [];
}
ajouterProduit(produit) {
const ligne = this.elements.find(p => p.produit.id === produit.id);
const alerte = document.getElementById("alerte");
alerte.textContent = "";
if (ligne) {
if (ligne.quantite >= produit.stock) {
alerte.textContent = \`â Stock insuffisant pour \${produit.nom}\`;
return;
}
ligne.quantite++;
} else {
if (produit.stock < 1) {
alerte.textContent = \`â Produit \${produit.nom} en rupture de stock\`;
return;
}
this.elements.push({ produit, quantite: 1 });
}
this.actualiserAffichage();
}
changerQuantite(id, operation) {
const ligne = this.elements.find(p => p.produit.id === id);
if (!ligne) return;
const alerte = document.getElementById("alerte");
alerte.textContent = "";
if (operation === "plus") {
if (ligne.quantite >= ligne.produit.stock) {
alerte.textContent = \`â Stock max atteint pour \${ligne.produit.nom}\`;
return;
}
ligne.quantite++;
} else if (operation === "moins") {
if (ligne.quantite > 1) {
ligne.quantite--;
} else {
this.retirerProduit(id);
return;
}
}
this.actualiserAffichage();
}
retirerProduit(id) {
this.elements = this.elements.filter(p => p.produit.id !== id);
this.actualiserAffichage();
}
total() {
return this.elements.reduce((t, l) => t + l.produit.prix * l.quantite, 0);
}
actualiserAffichage() {
const zone = document.getElementById("liste-produits");
const totalZone = document.getElementById("total");
zone.innerHTML = "";
if (this.elements.length === 0) {
zone.innerHTML = "<p>Panier vide</p>";
totalZone.textContent = "0 âŹ";
return;
}
this.elements.forEach(ligne => {
const div = document.createElement("div");
div.innerHTML = \`
<p>
<strong>\${ligne.produit.nom}</strong> - \${ligne.produit.prix.toFixed(2)} ⏠à \${ligne.quantite}
<button onclick="monPanier.changerQuantite(\${ligne.produit.id}, 'moins')">â</button>
<button onclick="monPanier.changerQuantite(\${ligne.produit.id}, 'plus')">â</button>
</p>
\`;
zone.appendChild(div);
});
totalZone.textContent = this.total().toFixed(2) + " âŹ";
}
}
ajouterProduit(): empĂȘche de dĂ©passer le stockchangerQuantite(): â â avec vĂ©rification du stockalerte.textContent: affiche un message si dĂ©passementactualiserAffichage(): rafraĂźchit le HTML
đ§Ș 3. Exemple dâutilisation
const clavier = new Produit(1, "Clavier", 49.99, 2); const souris = new Produit(2, "Souris", 29.99, 1); const monPanier = new Panier(); monPanier.ajouterProduit(clavier); monPanier.ajouterProduit(clavier); monPanier.ajouterProduit(souris);
- Ajoute deux fois le clavier (stock = 2, câest ok)
- Ajoute une fois la souris (stock = 1)
- Si on rĂ©appuie â pour la souris â message dâalerte
đ RĂ©sumĂ©
- â Stock vĂ©rifiĂ© avant toute action
- â Message dâerreur affichĂ© en cas de dĂ©passement
- â ExpĂ©rience utilisateur guidĂ©e, sans erreur silencieuse
đ§ Prochaine Ă©tape
Dans le chapitre suivant, nous ajouterons un **bouton â** pour supprimer un produit manuellement, avec une **confirmation de lâutilisateur**.
Souhaites-tu passer au Chapitre 5 du Module 3 : Suppression manuelle dâun article avec bouton â + confirmation ?