diff --git a/src/SortingField.ts b/src/SortingField.ts index 017caf7..ff9ea09 100644 --- a/src/SortingField.ts +++ b/src/SortingField.ts @@ -10,13 +10,13 @@ export class SortingField implements SortingFields _datasFieldNb: number; _order: "asc"|"desc"|undefined=undefined; - // Injection de la classe principale, mais uniquement si le nom des champs ont été importés et affichés correctement + // Injection de la classe principale, mais uniquement si les noms des champs ont été importés et affichés correctement constructor(converter: FreeDatas2HTML, datasFieldNb: number, fieldsDOMSelector: string="th") { if(converter.fields === undefined) throw new Error(errors.sortingFieldNeedDatas); - else if(! converter.checkFieldExist(Number(datasFieldNb))) - throw new Error(errors.sortingFieldFieldNotFound); + else if(! converter.checkFieldExist(datasFieldNb)) + throw new Error(errors.sortingFieldNotFound); else { const fields=document.querySelectorAll(fieldsDOMSelector); @@ -33,6 +33,11 @@ export class SortingField implements SortingFields } } + get converter() : FreeDatas2HTML + { + return this._converter; + } + get fieldsDOMSelector() : string { return this._fieldsDOMSelector; @@ -48,30 +53,23 @@ export class SortingField implements SortingFields return this._order; } - // Création du lien dans le HTML correspondant au champ de classement public field2HTML() : void { - if(this._converter === undefined || this._fieldsDOMSelector === "" || this._datasFieldNb === undefined) - throw new Error(errors.sortingField2HTMLFail); - else + const fields=document.querySelectorAll(this._fieldsDOMSelector); + let htmlContent=fields[this._datasFieldNb].innerHTML; + htmlContent=""+htmlContent+""; + fields[this._datasFieldNb].innerHTML=htmlContent; + const sortingElement=document.getElementById("freeDatas2HTMLSorting"+this._datasFieldNb), field=this; + sortingElement!.addEventListener("click", function(e) // "!" car je sais que sortingElement existe, puisque je viens de le créer ! { - const fields=document.querySelectorAll(this._fieldsDOMSelector); - let htmlContent=fields[this._datasFieldNb].innerHTML; - htmlContent=""+htmlContent+""; - fields[this._datasFieldNb].innerHTML=htmlContent; - const sortingElement=document.getElementById("freeDatas2HTMLSorting"+this._datasFieldNb), field=this; - sortingElement!.addEventListener("click", function(e) // je sais que sortingElement existe, car je viens de le créer ! - { - e.preventDefault(); - let order=field._order ; - if(order === undefined || order === "desc") - field._order="asc"; - else - field._order="desc"; - field._converter.datasSortedField=field; - field._converter.refreshView(); - }); - } + e.preventDefault(); + let order=field._order ; + if(order === undefined || order === "desc") + field._order="asc"; + else + field._order="desc"; + field._converter.datasSortedField=field; + field._converter.refreshView(); + }); } - } \ No newline at end of file diff --git a/src/errors.js b/src/errors.js index b2077f9..8ddb08d 100644 --- a/src/errors.js +++ b/src/errors.js @@ -33,7 +33,7 @@ module.exports = selectorSelectedIndexNotFound: "La valeur sélectionnée n'a pas été trouvée dans la liste des champs.", sortingField2HTMLFail: "Toutes les donnée nécessaires à la création du lien de classement n'ont pas été fournies.", sortingFieldNeedDatas: "Le création d'un champ de classement nécessite la transmission de la liste des champs.", - sortingFieldFieldNotFound: "Au moins un des champs devant permettre de classer les données n'existe pas dans le fichier.", + sortingFieldNotFound: "Au moins un des champs devant permettre de classer les données n'existe pas dans le fichier.", sortingFieldsNbFail: "Le nombre de champs trouvés dans le DOM ne correspond pas à celui des données à classer.", sortingFieldsNotInHTML: "Les champs pouvant servir à classer les données n'ont pas été trouvés dans le DOM.", }; \ No newline at end of file diff --git a/tests/sortingFieldSpec.ts b/tests/sortingFieldSpec.ts index 3308ce7..5d2af5a 100644 --- a/tests/sortingFieldSpec.ts +++ b/tests/sortingFieldSpec.ts @@ -1,5 +1,4 @@ -import { FreeDatas2HTML, Selector, SortingField } from "../src/freeDatas2HTML"; - +import { FreeDatas2HTML, SortingField } from "../src/freeDatas2HTML"; const errors=require("../src/errors.js"); const fixtures=require("./fixtures.js"); @@ -28,15 +27,15 @@ describe("Test des champs de classement.", () => it("Doit générer une erreur, si initialisé sans fournir la liste des champs servant à classer les données.", () => { converter=new FreeDatas2HTML("CSV"); - converter.parser.setRemoteSource({ url:"http://localhost:9876/datas/datas1.csv" }); + // Pas lancé converter.run() donc les données n'ont pas été parsées : expect(() => { return new SortingField(converter, 0); }).toThrowError(errors.sortingFieldNeedDatas); }); it("Doit générer une erreur, si initialisé avec un numéro du champ de classement n'existant pas dans les données.", () => { - expect(() => { return new SortingField(converter, 9); }).toThrowError(errors.sortingFieldFieldNotFound); - expect(() => { return new SortingField(converter, -1); }).toThrowError(errors.sortingFieldFieldNotFound); - expect(() => { return new SortingField(converter, 1.1); }).toThrowError(errors.sortingFieldFieldNotFound); + expect(() => { return new SortingField(converter, 9); }).toThrowError(errors.sortingFieldNotFound); + expect(() => { return new SortingField(converter, -1); }).toThrowError(errors.sortingFieldNotFound); + expect(() => { return new SortingField(converter, 1.1); }).toThrowError(errors.sortingFieldNotFound); }); it("Doit générer une erreur, si initialisé sans élements HTML textuels dans la page servant d'entêtes aux données.", () => @@ -44,7 +43,7 @@ describe("Test des champs de classement.", () => expect(() => { return new SortingField(converter, 0, "th.cols"); }).toThrowError(errors.sortingsFieldNotInHTML); }); - it("Doit générer une erreur, si le nombre d'éléments du DOM devant servir d'entêtes est différent du nombre de champs des données.", () => + it("Doit générer une erreur, si le nombre d'éléments trouvés dans le DOM pour les entêtes est différent du nombre de champs des données.", () => { expect(() => { return new SortingField(converter, 0, "td"); }).toThrowError(errors.sortingFieldsNbFail); }); @@ -57,8 +56,8 @@ describe("Test des champs de classement.", () => }); }); - describe("Création des liens permettant de classer les données affichées.", () => - { + describe("Création et action des liens permettant de classer les données affichées.", () => + { it("Doit générer un élement lien avec comme ancre l'élément HTML correspondant au nom de la colonne.", () => { let sortingField=new SortingField(converter, 0); @@ -69,62 +68,36 @@ describe("Test des champs de classement.", () => expect(getTH[0].innerHTML).toEqual(fixtures.sortingColumn1HTML); expect(getTH[2].innerHTML).toEqual(fixtures.sortingColumn2HTML); }); - }); - describe("Action des colonnes de classement en corrélation avec le convertiseur.", () => - { - it("Le 1er clic sur l'entête d'une des colonnes doit classer les données dans le sens ascendant, puis descendant et ainsi de suite.", async () => + it("Lorsqu'ils sont cliqués, doivent transmettre l'information au convertisseur + lui demander d'actualiser l'affichage.", () => { - let sortingField=new SortingField(converter, 2); - sortingField.field2HTML(); - converter.datasSortingFields=[sortingField]; - let getTHLink=document.querySelector("th a") as HTMLElement; - getTHLink.click();// tri ascendant - let getTR=document.querySelectorAll("tr"); - let txtDatasViewsElt=getTR[1].innerHTML; - expect(txtDatasViewsElt).toEqual("89ActiniumAcActinide≤ 1"); - getTHLink.click();// tri descendant - getTR=document.querySelectorAll("tr"); - txtDatasViewsElt=getTR[1].innerHTML; - expect(txtDatasViewsElt).toEqual("40ZirconiumZrMétal de transition> 100000"); - getTHLink.click();// de nouveau ascendant - getTR=document.querySelectorAll("tr"); - txtDatasViewsElt=getTR[1].innerHTML; - expect(txtDatasViewsElt).toEqual("89ActiniumAcActinide≤ 1"); + const sortingField1=new SortingField(converter, 2); + sortingField1.field2HTML(); + const sortingField2=new SortingField(converter, 3); + sortingField2.field2HTML(); + converter.datasSortingFields=[sortingField1, sortingField2]; + + let getTHLinks=document.querySelectorAll("th a") as NodeListOf; + spyOn(converter, "refreshView"); + getTHLinks[0].click();// tri ascendant 1er champ + expect(sortingField1.converter.datasSortedField).toEqual(sortingField1); + expect(sortingField1.converter.datasSortedField.order).toEqual("asc"); + expect(converter.refreshView).toHaveBeenCalledTimes(1); + + getTHLinks[1].click();// tri ascendant mais sur le second champ + expect(sortingField2.converter.datasSortedField).toEqual(sortingField2); + expect(sortingField2.converter.datasSortedField.order).toEqual("asc"); + expect(converter.refreshView).toHaveBeenCalledTimes(2); + + getTHLinks[0].click();// tri descendant sur le 1er champ + expect(sortingField1.converter.datasSortedField).toEqual(sortingField1); + expect(sortingField1.converter.datasSortedField.order).toEqual("desc"); + expect(converter.refreshView).toHaveBeenCalledTimes(3); + + getTHLinks[0].click();// de nouveau ascendant + expect(sortingField1.converter.datasSortedField).toEqual(sortingField1); + expect(sortingField1.converter.datasSortedField.order).toEqual("asc"); + expect(converter.refreshView).toHaveBeenCalledTimes(4); }); - - it("Prise en compte d'une fonction spécifique associée au champ de classement.", async () => - { - const mySort=(a: any, b: any, order: "asc"|"desc"="asc") => - { - const values=[ "> 100000", "> 1 et < 100 000", "≤ 1", "Traces", "Inexistant"]; - if(order === "desc") - values.reverse(); - if(values.indexOf(a) > values.indexOf(b)) - return -1; - else if(values.indexOf(a) < values.indexOf(b)) - return 1; - else - return 0; - }; - converter.datasSortingFunctions=[{ datasFieldNb: 4, sort:mySort }]; - let sortingField=new SortingField(converter, 4); - sortingField.field2HTML(); - converter.datasSortingFields=[sortingField]; - let getTHLink=document.querySelector("th a") as HTMLElement; - getTHLink.click();// tri ascendant - let getTR=document.querySelectorAll("tr"); - let txtDatasViewsElt=getTR[1].innerHTML; - expect(txtDatasViewsElt).toEqual("95AmériciumAmActinideInexistant"); - getTHLink.click();// tri descendant - getTR=document.querySelectorAll("tr"); - txtDatasViewsElt=getTR[1].innerHTML; - expect(txtDatasViewsElt).toEqual("1HydrogèneHNon-métal> 100000"); - getTHLink.click();// de nouveau ascendant - getTR=document.querySelectorAll("tr"); - txtDatasViewsElt=getTR[1].innerHTML; - expect(txtDatasViewsElt).toEqual("95AmériciumAmActinideInexistant"); - }); - }); - + }); }); \ No newline at end of file