Première version classe permettant de créer des liens de classement, séparément de l'affichage des données.
This commit is contained in:
parent
dc86d1be44
commit
ad7575bf8b
70
src/extensions/SortingFieldsStandAlone.ts
Normal file
70
src/extensions/SortingFieldsStandAlone.ts
Normal file
@ -0,0 +1,70 @@
|
||||
// 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();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user