diff --git a/package.json b/package.json index 858f656..2cecfd8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "freedatas2html", - "version": "0.4.4", + "version": "0.4.5", "description": "Visualization of data from various sources (CSV, API, HTML...) with filters, classification, pagination, etc.", "main": "index.js", "scripts": { diff --git a/src/firstExample.ts b/src/firstExample.ts index c574357..6a46ac6 100644 --- a/src/firstExample.ts +++ b/src/firstExample.ts @@ -28,7 +28,7 @@ const initialise = async () => // Configuration de la pagination const pagination=new Pagination(converter, { id:"pages" }, "Page à afficher :"); pagination.options={ displayElement: { id:"paginationOptions" }, values: [10,20,50,500] , name: "Choix de pagination :" }; - pagination.selectedValue=10; // revoir car n'est pas testé si déclaré avant les options + pagination.selectedValue=10; converter.pagination=pagination; pagination.rend2HTML(); @@ -47,17 +47,17 @@ const initialise = async () => converter.datasSelectors=[filtre1,filtre2,filtre3]; // Ajout de champs permettant de classer les données - let sortingField1=new SortingField(converter); - sortingField1.datasFieldNb=0; + let sortingField1=new SortingField(converter, 0); + //sortingField1.datasFieldNb=0; sortingField1.field2HTML(); - let sortingField2=new SortingField(converter); - sortingField2.datasFieldNb=1; + let sortingField2=new SortingField(converter, 1); + // sortingField2.datasFieldNb=1; sortingField2.field2HTML(); - let sortingField3=new SortingField(converter); - sortingField3.datasFieldNb=2; + let sortingField3=new SortingField(converter, 2); + //sortingField3.datasFieldNb=2; sortingField3.field2HTML(); - let sortingField4=new SortingField(converter); - sortingField4.datasFieldNb=4; + let sortingField4=new SortingField(converter, 4); + //sortingField4.datasFieldNb=4; sortingField4.field2HTML(); // Injection dans le convertisseur converter.datasSortingFields=[sortingField1,sortingField2,sortingField3,sortingField4]; diff --git a/src/freeDatas2HTMLInterfaces.ts b/src/freeDatas2HTMLInterfaces.ts index 4710197..140996c 100644 --- a/src/freeDatas2HTMLInterfaces.ts +++ b/src/freeDatas2HTMLInterfaces.ts @@ -36,7 +36,7 @@ export interface Selectors } export interface SortingFields { - datasFieldNb: number|undefined; + datasFieldNb: number; order?: "asc"|"desc"|undefined; field2HTML() : void; } diff --git a/src/freeDatas2HTMLSortingField.ts b/src/freeDatas2HTMLSortingField.ts index a3d20aa..0031fa8 100644 --- a/src/freeDatas2HTMLSortingField.ts +++ b/src/freeDatas2HTMLSortingField.ts @@ -7,14 +7,16 @@ export class SortingField implements SortingFields { _converter: FreeDatas2HTML; _fieldsDOMSelector: string; - _datasFieldNb: number|undefined; // numéro du champ dont les données serviront au filtre + _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 - constructor(converter: FreeDatas2HTML, fieldsDOMSelector: string = "th") + constructor(converter: FreeDatas2HTML, datasFieldNb: number, fieldsDOMSelector: string = "th") { if(converter.parseMetas === undefined || converter.parseMetas.fields === undefined) throw new Error(errors.sortingFieldNeedDatas); + else if(! converter.checkFieldExist(Number(datasFieldNb))) + throw new Error(errors.sortingFieldFieldNotFound); else { const fields=document.querySelectorAll(fieldsDOMSelector); @@ -25,23 +27,18 @@ export class SortingField implements SortingFields else { this._converter=converter; + this._datasFieldNb=datasFieldNb; this._fieldsDOMSelector= fieldsDOMSelector; } } } - // Vérifie que le numéro de champ existe dans les données reçues - // On pourrait tester que l'élément HTML contient un noeud de type textuel avec nodeType - // Mais on peut créer un lien sur une image, un span, etc. - set datasFieldNb(datasFieldNb: number|undefined) + get fieldsDOMSelector() : string { - if(datasFieldNb === undefined || ! this._converter.checkFieldExist(Number(datasFieldNb))) - throw new Error(errors.sortingFieldFieldNotFound); - else - this._datasFieldNb=datasFieldNb; + return this._fieldsDOMSelector; } - - get datasFieldNb() : number|undefined + + get datasFieldNb() : number { return this._datasFieldNb; } diff --git a/tests/sortingFieldSpec.ts b/tests/sortingFieldSpec.ts index cabee25..61be59e 100644 --- a/tests/sortingFieldSpec.ts +++ b/tests/sortingFieldSpec.ts @@ -15,7 +15,6 @@ describe("Test des champs de classement.", () => converter.datasViewElt={ id:"datas" }; converter.datasSourceUrl="http://localhost:9876/datas/datas1.csv"; await converter.run(); - sortingField=new SortingField(converter); }); afterEach( () => @@ -28,61 +27,53 @@ 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(); - expect(() => { return new SortingField(converter); }).toThrowError(errors.sortingFieldNeedDatas); + expect(() => { return new SortingField(converter, 0); }).toThrowError(errors.sortingFieldNeedDatas); }); it("Doit générer une erreur, si initialisé sans élements HTML textuels dans la page servant d'entêtes aux données.", () => { - expect(() => { return new SortingField(converter, "th.cols"); }).toThrowError(errors.sortingsFieldNotInHTML); + 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.", () => { - expect(() => { return new SortingField(converter, "td"); }).toThrowError(errors.sortingFieldsNbFail); + expect(() => { return new SortingField(converter, 0, "td"); }).toThrowError(errors.sortingFieldsNbFail); }); - it("Ne doit pas générer d'erreur, si initialisé avec des données correctes.", () => + it("Doit générer une erreur, si initialiser avec un numéro du champ de classement n'existant pas dans les données.", () => { - expect(() => { return new SortingField(converter, "th"); }).not.toThrowError(); - expect(() => { return new SortingField(converter); }).not.toThrowError(); + 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); }); - it("Doit générer une erreur, si le numéro du champ de classement n'existe pas dans les données.", () => + it("Si tous les paramètres sont ok, ils doivent être acceptés.", () => { - expect(() => { return sortingField.datasFieldNb=9; }).toThrowError(errors.sortingFieldFieldNotFound); - expect(() => { return sortingField.datasFieldNb=-1; }).toThrowError(errors.sortingFieldFieldNotFound); - expect(() => { return sortingField.datasFieldNb=1.1; }).toThrowError(errors.sortingFieldFieldNotFound); - }); - - it("Si le numéro de champ fourni est valide, il doit être accepté.", () => - { - expect(() => { return sortingField.datasFieldNb=1; }).not.toThrowError(); - sortingField.datasFieldNb=1; + const sortingField=new SortingField(converter, 1, "th"); expect(sortingField.datasFieldNb).toEqual(1); + expect(sortingField.fieldsDOMSelector).toEqual("th"); }); }); - describe("Création et action des liens permettant de classer les données affichées.", () => + describe("Création 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.", () => { - sortingField.datasFieldNb=0; + let sortingField=new SortingField(converter, 0); sortingField.field2HTML(); - let sortingField2=new SortingField(converter); - sortingField2.datasFieldNb=2; + let sortingField2=new SortingField(converter, 2); sortingField2.field2HTML(); let getTH=document.getElementsByTagName("th"); 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 () => { - sortingField.datasFieldNb=2; + let sortingField=new SortingField(converter, 2); sortingField.field2HTML(); converter.datasSortingFields=[sortingField]; let getTHLink=document.querySelector("th a") as HTMLElement; @@ -115,7 +106,7 @@ describe("Test des champs de classement.", () => return 0; }; converter.datasSortingFunctions=[{ datasFieldNb: 4, sort:mySort }]; - sortingField.datasFieldNb=4; + let sortingField=new SortingField(converter, 4); sortingField.field2HTML(); converter.datasSortingFields=[sortingField]; let getTHLink=document.querySelector("th a") as HTMLElement;