Browse Source

Relecture code des Selector, avant évolutions.

master
Fabrice PENHOËT 6 months ago
parent
commit
6532c04ca1
  1. 19
      src/Selector.ts
  2. 10
      tests/selectorSpec.ts

19
src/Selector.ts

@ -13,8 +13,8 @@ export class Selector implements Selectors
private _values: string[]=[];
private _name: string="";
// Injection de la classe principale, mais uniquement si des données ont été importées
// Le champ duquel le sélecteur tire ses données doit exister ?
// Injection de la classe principale, mais uniquement si des données ont été importées.
// Le champ duquel le sélecteur tire ses données doit exister.
constructor(converter: FreeDatas2HTML, datasFieldNb: number, elt: DOMElement, separator?: string)
{
if(converter.fields.length === 0 || converter.datas.length === 0)
@ -70,13 +70,13 @@ export class Selector implements Selectors
// Création du <select> dans le DOM correspondant au filtre
public filter2HTML(label:string="") : void
{
this._name=this._converter.fields![this._datasFieldNb]; // "!" car l'existence du champ est testé par le constructeur
this._name=this._converter.fields![this._datasFieldNb]; // "!", car l'existence du champ est testé par le constructeur.
for (let row of this._converter.datas)
{
let checkedValue;
if(this._separator === undefined)
{
checkedValue=row[this._name].trim(); // trim() évite des problèmes de classement des éléments du SELECT
checkedValue=row[this._name].trim(); // trim() évite des problèmes de classement des éléments du SELECT.
if(checkedValue !== "" && this._values.indexOf(checkedValue) === -1)
this._values.push(checkedValue);
}
@ -92,7 +92,7 @@ export class Selector implements Selectors
}
}
if(this._values.length === 0) // possible si uniquement des valeurs vides pour ce champ
if(this._values.length === 0) // possible, si uniquement des valeurs vides pour ce champ.
throw new Error(errors.selectorFieldIsEmpty);
else
{
@ -102,14 +102,15 @@ export class Selector implements Selectors
else
this._values.sort(compare());
// Création et injection du SELECT dans le DOM
// Création et injection du SELECT dans le DOM :
label=(label === "") ? this._name : label;
let selectorsHTML="<label for='freeDatas2HTML_"+this._datasViewElt.id+"'>"+label+" :</label><select name='freeDatas2HTML_"+this._datasViewElt.id+"' id='freeDatas2HTML_"+this._datasViewElt.id+"'><option value='0'>----</option>"; // l'option zéro permet d'actualiser l'affichage en ignorant ce filtre
let selectorsHTML="<label for='freeDatas2HTML_"+this._datasViewElt.id+"'>"+label+" :</label><select name='freeDatas2HTML_"+this._datasViewElt.id+"' id='freeDatas2HTML_"+this._datasViewElt.id+"'><option value='0'>----</option>"; // l'option zéro permet d'actualiser l'affichage en ignorant ce filtre.
for(let i=0; i< this._values.length; i++)
selectorsHTML+="<option value='"+(i+1)+"'>"+this._values[i]+"</option>";
selectorsHTML+="</select>";
this. _datasViewElt.eltDOM!.innerHTML=selectorsHTML;// "!" car l'existence de "eltDOM" est testé par le constructeur
this. _datasViewElt.eltDOM!.innerHTML=selectorsHTML;// "!", car l'existence de "eltDOM" est testé par le constructeur.
// Actualisation de l'affichage lorsqu'une valeur est sélectionnée :
const selectElement=document.getElementById("freeDatas2HTML_"+this._datasViewElt.id) as HTMLInputElement, mySelector=this;
selectElement.addEventListener("change", function(e)
{

10
tests/selectorSpec.ts

@ -29,7 +29,7 @@ describe("Test des sélecteurs de données", () =>
// Convertisseur non lancé :
converter=new FreeDatas2HTML("CSV");
expect(() => { return new Selector(converter, 0, { id:"selector1" }); }).toThrowError(errors.filterNeedDatas);
// Note : les parseurs vont générer une erreur en amont s'ils ne trouvent pas de noms de champs.
// Note : les parseurs vont générer une erreur en amont s'ils ne trouvent pas de noms de champs
// Par contre, ils acceptent de ne pas trouver de données :
converter.parser.datas2Parse="Z (numéro atomique),Élément,Symbole,Famille,Abondance des éléments dans la croûte terrestre (μg/k)";
await converter.run();
@ -49,7 +49,7 @@ describe("Test des sélecteurs de données", () =>
expect(selector.separator).toBeUndefined();
});
it("Si toutes les paramètres sont correctes, ils doivent être acceptés.", () =>
it("Si toutes les paramètres sont valides, ils doivent être acceptés.", () =>
{
expect(() => { selector=new Selector(converter, 2, { id:"selector1" }, ","); return true; }).not.toThrowError();
expect(selector.datasFieldNb).toEqual(2);
@ -198,7 +198,7 @@ describe("Test des sélecteurs de données", () =>
expect(selector.dataIsOk({ "Famille": "Hallo Eugène !" })).toBeFalse();
});
it("Doit retourner true, si une donnée testée correspond pas à la valeur sélectionnée pour ce filtre.", () =>
it("Doit retourner true, si une donnée testée correspond à la valeur sélectionnée pour ce filtre.", () =>
{
selectElement.value="4";
selectElement.dispatchEvent(new Event('change'));
@ -238,11 +238,11 @@ describe("Test des sélecteurs de données", () =>
selectElement.value="4";
selectElement.dispatchEvent(new Event('change'));
expect(selector.dataIsOk({ "Étiquettes": "Exemple3" })).toBeTrue();
// Même pas seule :
// Même quand elle n'est pas seule :
expect(selector.dataIsOk({ "Étiquettes": "Exemple3|Exemple1|Exemple9" })).toBeTrue();
expect(selector.dataIsOk({ "Étiquettes": "Exemple0|Exemple3|Exemple2" })).toBeTrue();
expect(selector.dataIsOk({ "Étiquettes": "Exemple0|Exemple4|Exemple3" })).toBeTrue();
// Y compris si entourée d'espaces :
// Ou entourée d'espaces :
expect(selector.dataIsOk({ "Étiquettes": "Exemple0|Exemple4| Exemple3 " })).toBeTrue();
expect(selector.dataIsOk({ "Étiquettes": " Exemple3 " })).toBeTrue();
});

Loading…
Cancel
Save