// Cette classe est une alternative à l'utilisation directe de SortingField. // Ici, les liens de classement sont créés dans un élément du DOM externe à celui affichant les données import { DOMElement } from "../interfaces"; import { FreeDatas2HTML, SortingField } from "../FreeDatas2HTML"; const errors=require("../errors.js"); export interface SortingFieldsSettings { allBegining: string; allEnding: string; fieldBegining: string; fieldEnding: string; } export class SortingFieldsStandAlone { private _converter: FreeDatas2HTML; private _datasViewElt: DOMElement={ id: "", eltDOM: undefined }; public datasSortingFields: SortingField[]=[]; public rendSettings: SortingFieldsSettings; static readonly defaultSettings= { allBegining: "", fieldBegining: "
  • ", fieldEnding: "
  • ", }; constructor(converter: FreeDatas2HTML, elt: DOMElement, settings: SortingFieldsSettings=SortingFieldsStandAlone.defaultSettings) { if(converter.fields.length === 0) throw new Error(errors.sortingFieldNeedDatas); this._converter=converter; this._datasViewElt=FreeDatas2HTML.checkInDOMById(elt); this.rendSettings=settings; } public rend2HTML(label:string="Classer les données suivant : ") : void { // Il doit y avoir au moins un champ de classement fourni : if(this.datasSortingFields.length === 0) throw new Error("Vous devez fournir au moins un champ de classement valide."); // Arrivé ici, je sais que j'ai au moins un lien de classement à injecter let htmlContent=""+this.rendSettings.allBegining; for(let field of this.datasSortingFields) { htmlContent+=this.rendSettings.fieldBegining+""+this._converter.fields[field.datasFieldNb]+""+this.rendSettings.fieldEnding; } htmlContent+=this.rendSettings.allEnding; this._datasViewElt.eltDOM!.innerHTML=htmlContent;// "!" car existence de l'élement, testé via le constructeur. // Les liens venant d'êtres injectés dans le DOM, il reste à les rendre actifs : for(let field of this.datasSortingFields) { let sortingLink=document.getElementById("freeDatas2HTMLSorting"+field.datasFieldNb); sortingLink!.addEventListener("click", function(e) // "!" car je sais que sortingLink existe, puisque je viens de le créer ! { e.preventDefault(); if(field.order === undefined || field.order === "desc") field.order="asc"; else field.order="desc"; field.converter.datasSortedField=field; field.converter.refreshView(); }); } } }