# Petit memo js
### Bonnes pratiques :
#### Général
- Variables en ``camelCase``
- Noms de fonctions ``explicites``
- Espaces autours des opérateurs ``=+-*/``
- Indentation à 3 espaces
#### Spécifique IB :
- Eviter champs formule en page de liste (ralentis le changement de la page)
<b><span style="color:red">PLUS D'INFOS SUR LE WIKI</span></b> ← c'est pas un lien cliquable
### Fonctions utiles
#### On ready :
```js
$(function(){
console.log("Hello world")
})
```
#### Event listener :
```js
$("#origine-0").on('event1 event2', () => {
console.log("Hello")
})
```
Events :
| Mouse | Keyboard | Form | Document/Window |
|--------------|-----------------|-------------|-------------------------|
| click | keypress | submit | load |
| dblclick | keydown | change | resize |
| mouseenter | keyup | focus | scroll |
| mouseleave | | blur | unload |
#### Array to associative array
```js
function traiterResultatRequete(arrayChamps, arrayResult){
var res = {}
for(var j=0; j<arrayChamps.length; j++){
res[arrayChamps[j]] = arrayResult[j] != null ? arrayResult[j] : '';
}
return res
}
```
##### Exemple :
```js
var champsARequeter = [
"id",
"status",
"clientNom",
"clientPrenom",
];
rbf_selectQuery("SELECT "+champsARequeter.join(", ")+" FROM object WHERE id=12345",1000,function(res){
var resAssociative = traiterResultatRequete(champsARequeter, res);
/*
res : [
"12345",
"V",
"BON",
"Jean"
]
resAssociative :
{
"id": "12345",
"status": "V",
"clientNom": "BON",
"clientPrenom": "Jean"
}
*/
}
);
```
#### Object sort :
```js
const personne = [
{ "nom": "Dupont", "prenom": "Jean", "age": 25 },
{ "nom": "Durand", "prenom": "Pierre", "age": 30 },
{ "nom": "Cerise", "prenom": "Adèle", "age": 35 },
{ "nom": "Fruit", "prenom": "Antoine", "age": 35 },
]
// Fonctionne aussi sur les nombres (ordre croissant)
function triAlphabetique(arr, cle) {
arr.sort(function (a, b) {
if (a[cle] < b[cle]) {
return -1;
}
if (a[cle] > b[cle]) {
return 1;
}
return 0;
});
return arr;
}
triAlphabetique(personne, "prenom");
// Return
[
{"nom": "Dupont","prenom": "Jean","age": 25},
{"nom": "Durand","prenom": "Pierre","age": 30},
{"nom": "Cerise","prenom": "Adèle","age": 35},
{"nom": "Fruit","prenom": "Antoine","age": 35}
]
```
#### No callback :
```js
async function main(){
let resultatAwait = await new Promise(resolve => {
setTimeout(() => {
resolve("Hello");
}, 1000)
})
console.log(resultatAwait);
console.log("World")
}
main()
```
#### IIFE (solution alternative aux promise / callback dans boucle for)
```js
const names = [
"John",
"Paul",
]
// Console log 2 undefined car au moment du timeout le for sera fini et i sera egal a 1
for(var i = 0; i < names.length; i++) {
setTimeout(function() {
console.log(names[i])
}, 1000)
}
// Solution, utiliser IIFE (Immediately Invoked Function Expression)
for(var i = 0; i < names.length; i++) {
((name) => {
setTimeout(function() {
console.log(name)
}, 1000)
})(names[i])
}
```
<br>
<br>
<br>
<br>
<br>
---
---
---
#### Progress bar
```js
<!-- SCRIPT IMPORT QUERY A SUPPRIMER -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<!-- STYLE A SUPPRIMER -->
<style>:root {--primary-color: #5D2C7B;}</style>
<!-- HTML PROGRESSBAR -->
<div style="display: flex;justify-content: center;align-items: center;width: 100vw;height: 100vh;position: fixed;left: 0px;top: 0px;background-color: #fafafa;">
<div id="spinnerParsing" style="text-align: center;align-content: center;margin: auto;">
<span class="fas fa-spinner fa-spin" style="font-size:60px;margin-top:60px;" aria-hidden="true"></span>
<p class="patience" style="text-align:center;padding-top:40px;font-size:14px;">Veuillez patienter ...</p>
</div>
</div>
<div style="display: flex;justify-content: center;align-items: center;width: 100vw;height: 100vh;position: fixed;left: 0px;top: 124px;">
<div id="progressBarConversion" style="width: 40%;background-color: grey;">
<div id="conversionBar" style="width: 0%;height: 30px;background-color: var(--primary-color);">
<div id="textProgressBar" style="position: absolute;color: #FFF;padding: 8px;left: calc(50% - 150px);text-align: center;width: 300px;">Action en cours de traitement</div>
</div>
</div>
</div>
<!-- SCRIPT PROGRESSBAR -->
<script>
var nbElementTraite = 0;
var nbTotalElement = -50;
var pourcentActuel = 0;
var urlRedirection = ""
$(function() {
auChargement()
})
function auChargement(){
console.log("AuChargement")
lancerTraitement()
}
async function lancerTraitement(){
console.log("LancerTraitement")
// Query des elements a traiter, le setTimeout peut être remplacé par un selectQuery et resolve() le retour de la query
let resultatRequeteDesElementsATraiter = await new Promise(resolve => {
setTimeout(() => {
resolve([981651,819561,516816,849586,849955,681815,491687,851981,998453,137510]);
}, 2000)
})
nbTotalElement = resultatRequeteDesElementsATraiter.length || 0;
startProgressBar()
// Actions de la query a traiter
for(let i in resultatRequeteDesElementsATraiter){
console.log("Lancement du traitement de l'element "+resultatRequeteDesElementsATraiter[i]+" en async")
// idPersonne = resultatRequeteDesElementsATraiter[i]
// pour test :
idPersonne = i
/* Version async pour executer dans l'ordre */
// Simuler un selectValue("SELECT nom FROM personnes WHERE id="+idPersonne)
let nomPersonne = await new Promise(resolve => {
setTimeout((idPersonne) => {
nbElementTraite++
let namearray = ["Jean","Bon","Paul","Pierre","John","Cyril","Julien","Frank","Antoine","Fabrice"]
resolve(namearray[idPersonne]);
}, Math.floor(Math.random() * 10000) + 1000, idPersonne)
})
/* Version non async. Boucle sur tous les elements puis les elements sont traités un par un
setTimeout(function(){
nbElementTraite++
console.log("Traitement d'un element")
}, Math.floor(Math.random() * 10000) + 1000);
*/
console.log("Personne : "+nomPersonne+" traité")
}
}
function startProgressBar(){
setDureeSecurite(nbTotalElement)
var progressBarInterval = setInterval(function(){
if(nbTotalElement != null){
var pourcent = (nbElementTraite / nbTotalElement) * 100
console.log("Pourcent : "+pourcent)
if(pourcent > pourcentActuel){
changeProgressBarValue(pourcent)
}
if(nbElementTraite == nbTotalElement){
changeProgressBarValue(100, "Redirection en cours...")
nbTotalElement = null
clearInterval(progressBarInterval)
setTimeout(function(){
alert("Redirection")
window.location.href = urlRedirection;
}, 300)
}
}else{
clearInterval(progressBarInterval)
}
}, 300); // progressInterval
}
function changeProgressBarValue(goal, text){
pourcentActuel = goal
$('#conversionBar').animate({ width: goal+"%" }, 400);
if(text){
$('#textProgressBar').text(text)
}
}
// Sécurité si traitement trop long
function setDureeSecurite(nbElements){
let dureeSecurite = nbElements * 15000 // 15 secondes par element
console.log("dureeSecurite = "+dureeSecurite)
setTimeout(function() {
if (nbElementTraite < nbElements) {
// alert("Le traitement a été interrompu car trop long. Veuillez réessayer plus tard.")
alert("Redirection sécurité")
window.location.href = urlRedirection
}
}, dureeSecurite)
}
</script>
```