FreeDatas2HTML/src/extensions/SortingFieldsStandAlone.ts

70 lines
2.9 KiB
TypeScript

// 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: "<ul>",
allEnding: "</ul>",
fieldBegining: "<li>",
fieldEnding: "</li>",
};
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="<label>"+label+"</label>"+this.rendSettings.allBegining;
for(let field of this.datasSortingFields)
{
htmlContent+=this.rendSettings.fieldBegining+"<a href='#freeDatas2HTMLSorting"+field.datasFieldNb+"' id='freeDatas2HTMLSorting"+field.datasFieldNb+"'>"+this._converter.fields[field.datasFieldNb]+"</a>"+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();
});
}
}
}