Pages

CSS / revoir

 Grid :  https://mozilladevelopers.github.io/playground/css-grid/02-first-grid/


Grid

La technologie CSS Grid est une révolution dans la conception de sites !

Grid est intégrée progressivement par les leaders du marché.

Notion de grille

Pensez aux villes américaines, voici un plan de Manhattan dans les années 18xx.


Pour réaliser cette grille, on définit :

  1. des zones, ce qui définit des quartiers.

  2. puis on y affecte des élements, ce qui place les maisons !


Ne perdons pas une minute et passons à l'action en créant notre première grille.


En action

Allez dans le simulateur de grid ( simu )

Nous allons:

  1. définir un plan, 

  2. placez notre code HTML dans les différentes zones définies par le quadrillage.


Définir un plan

dans le conteneur du simulateur tapez

  1. .conteneur {

  2.         display :grid;

  3.         grid-template-rows: 50px 1fr 30px;

  4.         grid-template-columns: 150px 1fr;

  5.         

  6.  }

Ce code définit le quadrillage suivant : 




Définir le placement

  1. .conteneur {

  2.         display :grid;

  3.         grid-template-areas: "head head"

  4.                               "nav  main"

  5.                               "nav  foot";




  6.         grid-template-rows: 50px 1fr 30px;

  7.         grid-template-columns: 150px 1fr;

  8.  }



Associer le placement

Il ne reste plus qu'à associer le code HTML à une zone en indiquant tout simplement son nom.

Par exemple : it2 sera associé à la zone nav.

  1.      #it2 {

  2.        grid-area: nav;

  3. }  


Je vous laisse compléter le code (... c'est si facile) pour obtenir une vision simplifiée de la topologie du site. 


JS / revoir

 

Cours JS

Lien : 👍 Cours JS


JS : basic

Retour sur la destructuration

Rappels destructuration sur les objets

const obj = { name:"dupont" }
const copyAdr = obj;

const copyVal = {...obj};

copyAdr.name = "cool"
console.log(obj,copyAdr,copyVal)

Equivalent pythontutor (l'opérateur ... est remplacé par Object.Assign)



Rappels destructuration sur les tableaux

const t= [1,2];
const copyAdr = t;
const copyVal = [...t];
copyAdr[0] = "cool"
copyVal.push = "new";
console.log(t,copyAdr,copyVal)

Equivalent pythontutor

const basket = [

  { name: "orange", price: 1, category: "fruit", quantity: 2 },
  { name: "poireau", price: 1, category: "vegetable", quantity: 3, origin: "USA"},
  { name: "ananas", price: 1, category: "fruit", quantity: 1, origin: "USA" },
  { name: "Pamplemousse", price: 12, category: "fruit", quantity: 4 },
  { name: "Carotte", price: 1, category: "vegetable", quantity: 5 }

]; 

Filtrer les articles par catégorie : Par exemple, sélectionner tous les fruits :

⛔Code avec for-i à ne plus utiliser
let fruits = [];
for (let i = 0; i < basket.length; i++) {
  if (basket[i].category === "fruit") {
    fruits.push(basket[i]);
  }
}
console.log(fruits);

🚫Code avec destructuration donné par GPT : à ne pas utiliser pour l'instant
let fruits = [];

for (const { category, ...rest } of basket) {
  if (category === "fruit") {
    fruits.push({ category, ...rest }); // Ajoute l'objet correspondant à la catégorie "fruit"
  }
}

✅ Il est préférable d'écrire le code suivant sans destructuration
let fruits = [];

for (const item of basket) {
  if (item.category === "fruit") {
    fruits.push({ ...item }); // Ajoute l'objet correspondant à la catégorie "fruit"
  }
}


🆘 faire un dessin du résultat ! 
Code équivalent dans pythontutor : code

👍code




Comparez le code précédent qui copie les fruits dans une nouvelle structure avec une recopie de l'adresse ! 

let fruits = [];

for (const item of basket) {
  if (item.category === "fruit") {
    fruits.push(item); // Ajoute l'objet correspondant à la catégorie "fruit"
  }
}


👍code


Résumé

for (const item of basket) {

  if (item.category === "fruit") {

    fruits.push( item );

  }

}

for (const item of basket) {

  if (item.category === "fruit") {

    fruits.push( {... item} );

  }

}

Les tableaux d'objets !

const basket = [

  { name: "orange", price: 1, category: "fruit", quantity: 2 },
  { name: "poireau", price: 1, category: "vegetable", quantity: 3, origin: "USA"},
  { name: "ananas", price: 1, category: "fruit", quantity: 1, origin: "USA" },
  { name: "Pamplemousse", price: 12, category: "fruit", quantity: 4 },
  { name: "Carotte", price: 1, category: "vegetable", quantity: 5 },
];

Voici quelques algorithmes utiles pour manipuler et analyser ce tableau en JavaScript. On ne dispose d'aucune méthode sur les tabkeaux.

1. Calculer le prix total de tous les articles :

⛔ for-i
let totalPrice = 0;
for (let i = 0; i < basket.length; i++) {
  totalPrice += basket[i].price * basket[i].quantity;
}
console.log(totalPrice);
✅ for-of + destructuration 
let totalPrice = 0;

for (const { price, quantity } of basket) {
  totalPrice += price * quantity; // Utilise directement les propriétés déstructurées
}

2. Filtrer les articles par catégorie : Par exemple, sélectionner tous les fruits :

⛔ for-i
let fruits = [];
for (let i = 0; i < basket.length; i++) {
  if (basket[i].category === "fruit") {
    fruits.push(basket[i]);
  }
}
console.log(fruits);
✅ for-of + recopie de la référence ! 
let fruits = [];

for (const item of basket) {
  if (item.category === "fruit") {
    fruits.push(item); // Ajoute la réf à la catégorie "fruit"
  }
}



🚫 Attention 
let fruits = [];

for (const item of basket) {
  if (item.category === "fruit") {
    fruits.push({ ...item }); // Ajoute l'objet correspondant à la catégorie "fruit"
  }
}
🧨 ici, on {...item} crée une copie (superficielle) de l'objet.

🥷Imaginez que chaque item du panier est un attribut détail

cconst basket = [ { category: "fruit", name: "pomme", details: { color: "rouge" } } ]; const copiedItem1 = { ...basket[0] }; const copiedItem2 = Object.assign({}, basket[0]); // copie superficielle également copiedItem1.details.color = "vert"; 🧨console.log(basket[0].details.color); // "vert" (modification aussi faite dans l'objet original)

3. Trouver le produit le plus cher :

⛔ for-i
let mostExpensive = basket[0];
for (let i = 1; i < basket.length; i++) {
  if (basket[i].price * basket[i].quantity > mostExpensive.price * mostExpensive.quantity) {
    mostExpensive = basket[i];
  }
}
console.log(mostExpensive);
let mostExpensive = basket[0];

for (const item of basket) {
  if (item.price * item.quantity >mostExpensive.price * mostExpensive.quantity) {
    mostExpensive = item;
  }
}
Attention à ce code
let mostExpensive = basket[0];

for (const { price, quantity, ...rest } of basket) {
  if (price * quantity > mostExpensive.price * mostExpensive.quantity) {
    mostExpensive = { price, quantity, ...rest }; // Met à jour le produit le plus cher
  }
}


5. Trouver les catégories
⛔ for-i, c'est terminé


function findUniqueCategories(basket) {
  let categories = [];

  for (const { category } of basket) {
    let exists = false;

    // Vérifie si la catégorie existe déjà dans le tableau
    for (const existingCategory of categories) {
      if (existingCategory === category) {
        exists = true;
        break;
      }
    }

    // Si la catégorie n'existe pas encore, on l'ajoute
    if (!exists) {
      categories.push(category);
    }
  }

  return categories;
}

6. Trouver les produits les plus chers par catégories
function findMostNumerousPerCategory(basket) {
  let categories = findUniqueCategories(basket); // Liste des catégories uniques
  let mostNumerous = [];

  for (const category of categories) {
    let maxItem = null;

    for (const item of basket) {
      if (
        item.category === category &&
        (!maxItem || item.quantity > maxItem.quantity)
      ) {
        maxItem = item;
      }
    }

    if (maxItem) mostNumerous.push(maxItem); // Ajoute l'élément le plus nombreux
  }

  return mostNumerous;
}

Il vous reste à faire une boucle sur les items pour ajouter dans la structure un attribut