const errors = require("./errors.js"); import { DatasRenders, DatasRendersSettings } from "./freeDatas2HTMLInterfaces"; import { FreeDatas2HTML } from "./freeDatas2HTML"; export class Render implements DatasRenders { private _converter: FreeDatas2HTML; public settings: DatasRendersSettings; static readonly defaultSettings = { allBegining:"", allEnding:"
", fieldsBegining:"", fieldsEnding:"", fieldDisplaying:"#FIELDNAME", linesBegining:"", linesEnding:"", lineBegining:"", lineEnding:"", dataDisplaying:"#VALUE", }; // Injection de la classe principale constructor(converter: FreeDatas2HTML, settings:DatasRendersSettings=Render.defaultSettings) { this._converter=converter; this.settings=settings; } // Reçoit les données à afficher et retourne le HTML correspondant. public rend2HTML(datas: any[]) : string { // Il peut n'y avoir aucune donnée (filtres...), mais les noms des champs doivent être connus. if(this._converter.fields === undefined) throw new Error(errors.renderNeedDatas); else { let datasHTML=this.settings.allBegining; // Les noms des champs ne sont pas forcément affichés séparément. if(this.settings.fieldsBegining !== undefined && this.settings.fieldDisplaying !== undefined && this.settings.fieldsEnding !== undefined ) { datasHTML+=this.settings.fieldsBegining; for(let field of this._converter.fields) datasHTML+=this.settings.fieldDisplaying.replace("#FIELDNAME", field); datasHTML+=this.settings.fieldsEnding; } datasHTML+=this.settings.linesBegining; // Suivant les objets/lignes, les champs peuvent se trouver dans un ordre différent, // ou encore des champs peuvent manquer ou être en trop. // Seuls les champs de "fields" doivent être traités et en respectant l'ordre de ce tableau. for(let row of datas) { datasHTML+=this.settings.lineBegining; for(let field of this._converter.fields) { if(row[field] !== undefined) datasHTML+=this.settings.dataDisplaying.replace("#VALUE", row[field]).replace("#FIELDNAME", field); else datasHTML+=this.settings.dataDisplaying.replace("#VALUE", "").replace("#FIELDNAME", field); } datasHTML+=this.settings.lineEnding; } datasHTML+=this.settings.linesEnding+this.settings.allEnding; return datasHTML; } } }