2021-12-08 17:12:12 +01:00
|
|
|
// 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");
|
2021-12-09 16:09:46 +01:00
|
|
|
errors.needSortingFields="Vous devez fournir au moins un champ de classement valide.";
|
2021-12-08 17:12:12 +01:00
|
|
|
|
2021-12-09 16:09:46 +01:00
|
|
|
interface SortingFieldsSettings
|
2021-12-08 17:12:12 +01:00
|
|
|
{
|
2021-12-09 16:09:46 +01:00
|
|
|
allBeginning: string;
|
2021-12-08 17:12:12 +01:00
|
|
|
allEnding: string;
|
2021-12-09 16:09:46 +01:00
|
|
|
fieldBeginning: string;
|
2021-12-08 17:12:12 +01:00
|
|
|
fieldEnding: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export class SortingFieldsStandAlone
|
|
|
|
{
|
|
|
|
private _converter: FreeDatas2HTML;
|
|
|
|
private _datasViewElt: DOMElement={ id: "", eltDOM: undefined };
|
2021-12-09 16:09:46 +01:00
|
|
|
public datasSortingFields: SortingField[]=[]; // SortingField refusera les champs non valides
|
2021-12-08 17:12:12 +01:00
|
|
|
public rendSettings: SortingFieldsSettings;
|
|
|
|
static readonly defaultSettings=
|
|
|
|
{
|
2021-12-09 16:09:46 +01:00
|
|
|
allBeginning: "<span>#LABEL</span><ul>",
|
2021-12-08 17:12:12 +01:00
|
|
|
allEnding: "</ul>",
|
2021-12-09 16:09:46 +01:00
|
|
|
fieldBeginning: "<li>",
|
2021-12-08 17:12:12 +01:00
|
|
|
fieldEnding: "</li>",
|
|
|
|
};
|
|
|
|
|
|
|
|
constructor(converter: FreeDatas2HTML, elt: DOMElement, settings: SortingFieldsSettings=SortingFieldsStandAlone.defaultSettings)
|
|
|
|
{
|
2021-12-09 16:09:46 +01:00
|
|
|
// Ne peut être appelé avant d'avoir récupéré la liste des champs :
|
2021-12-08 17:12:12 +01:00
|
|
|
if(converter.fields.length === 0)
|
|
|
|
throw new Error(errors.sortingFieldNeedDatas);
|
2021-12-09 16:09:46 +01:00
|
|
|
// Test l'existence dans le DOM de l'élément devant afficher les options de classement :
|
2021-12-08 17:12:12 +01:00
|
|
|
this._datasViewElt=FreeDatas2HTML.checkInDOMById(elt);
|
2021-12-09 16:09:46 +01:00
|
|
|
this._converter=converter;
|
2021-12-08 17:12:12 +01:00
|
|
|
this.rendSettings=settings;
|
|
|
|
}
|
2021-12-09 16:09:46 +01:00
|
|
|
|
|
|
|
get converter() : FreeDatas2HTML
|
|
|
|
{
|
|
|
|
return this._converter;
|
|
|
|
}
|
2021-12-08 17:12:12 +01:00
|
|
|
|
2021-12-09 16:09:46 +01:00
|
|
|
get datasViewElt() : DOMElement
|
2021-12-08 17:12:12 +01:00
|
|
|
{
|
2021-12-09 16:09:46 +01:00
|
|
|
return this._datasViewElt;
|
|
|
|
}
|
|
|
|
|
|
|
|
public rend2HTML(label:string="") : void
|
|
|
|
{
|
|
|
|
// Au moins un champ de classement valide doit avoir été fourni :
|
2021-12-08 17:12:12 +01:00
|
|
|
if(this.datasSortingFields.length === 0)
|
2021-12-09 16:09:46 +01:00
|
|
|
throw new Error(errors.needSortingFields);
|
2021-12-08 17:12:12 +01:00
|
|
|
|
2021-12-09 16:09:46 +01:00
|
|
|
// Arrivé ici, il y a au moins un lien de classement à injecter :
|
|
|
|
let htmlContent=this.rendSettings.allBeginning.replace("#LABEL", label);
|
2021-12-08 17:12:12 +01:00
|
|
|
for(let field of this.datasSortingFields)
|
|
|
|
{
|
2021-12-09 16:09:46 +01:00
|
|
|
htmlContent+=this.rendSettings.fieldBeginning+"<a href='#freeDatas2HTMLSorting"+field.datasFieldNb+"' id='freeDatas2HTMLSorting"+field.datasFieldNb+"'>"+this._converter.fields[field.datasFieldNb]+"</a>"+this.rendSettings.fieldEnding;
|
2021-12-08 17:12:12 +01:00
|
|
|
}
|
|
|
|
htmlContent+=this.rendSettings.allEnding;
|
2021-12-09 16:09:46 +01:00
|
|
|
this._datasViewElt.eltDOM!.innerHTML=htmlContent;// "!" car existence de l'élement dans le DOM a été testé dans le constructeur.
|
2021-12-08 17:12:12 +01:00
|
|
|
|
|
|
|
// 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);
|
2021-12-09 16:09:46 +01:00
|
|
|
sortingLink!.addEventListener("click", function(e) // "!" car je sais que sortingLink existe, venant de le créer.
|
2021-12-08 17:12:12 +01:00
|
|
|
{
|
|
|
|
e.preventDefault();
|
|
|
|
if(field.order === undefined || field.order === "desc")
|
|
|
|
field.order="asc";
|
|
|
|
else
|
|
|
|
field.order="desc";
|
|
|
|
field.converter.datasSortedField=field;
|
|
|
|
field.converter.refreshView();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2021-12-09 16:09:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Utile au script de tests :
|
|
|
|
export { FreeDatas2HTML, SortingField } from "../FreeDatas2HTML";
|
|
|
|
export { errors };
|