diff --git a/src/Render.ts b/src/Render.ts index ef650f2..47fca75 100644 --- a/src/Render.ts +++ b/src/Render.ts @@ -1,38 +1,50 @@ -const errors = require("./errors.js"); +const errors=require("./errors.js"); import { DatasRenders, DatasRendersSettings } from "./interfaces"; -import { FreeDatas2HTML } from "./freeDatas2HTML"; +//import { FreeDatas2HTML } from "./freeDatas2HTML"; export class Render implements DatasRenders { - private _converter: FreeDatas2HTML; - public settings: DatasRendersSettings; - static readonly defaultSettings = + private _fields: string[]=[]; + public settings: DatasRendersSettings; + public datas: {[index: string]:string}[]=[]; + static readonly defaultSettings= { - allBegining:"", - allEnding:"
", - fieldsBegining:"", - fieldsEnding:"", - fieldDisplaying:"#FIELDNAME", - linesBegining:"", - linesEnding:"", - lineBegining:"", - lineEnding:"", - dataDisplaying:"#VALUE", - }; + allBegining: "", + allEnding: "
", + fieldsBegining: "", + fieldsEnding: "", + fieldDisplaying: "#FIELDNAME", + linesBegining: "", + linesEnding: "", + lineBegining: "", + lineEnding: "", + dataDisplaying: "#VALUE" + }; - // Injection de la classe principale - constructor(converter: FreeDatas2HTML, settings:DatasRendersSettings=Render.defaultSettings) + constructor(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 + // Les données fournies peuvent être vides du fait de l'action des filtres ou encore de la pagination... + // Par contre, il doit y avoir au moins un nom de champ fourni + set fields(fields: 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); + if(fields.length === 0) + throw new Error(errors.renderNeedFields); + else + this._fields=fields; + } + + get fields() : string[] + { + return this._fields; + } + + public rend2HTML() : string + { + if(this._fields.length === 0) + throw new Error(errors.renderNeedFields); else { let datasHTML=this.settings.allBegining; @@ -40,19 +52,19 @@ export class Render implements DatasRenders if(this.settings.fieldsBegining !== undefined && this.settings.fieldDisplaying !== undefined && this.settings.fieldsEnding !== undefined ) { datasHTML+=this.settings.fieldsBegining; - for(let field of this._converter.fields) + for(let field of this._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) + + // Suivant les objets/lignes, les champs peuvent se trouver dans un ordre différent. + // Ou encore des champs peuvent manquer, être en trop... + // Tous les champs présents dans "fields" doivent être affichés (même si absents d'un enregistrement) et en respectant l'ordre de ce tableau. + for(let row of this.datas) { datasHTML+=this.settings.lineBegining; - for(let field of this._converter.fields) + for(let field of this._fields) { if(row[field] !== undefined) datasHTML+=this.settings.dataDisplaying.replace("#VALUE", row[field]).replace("#FIELDNAME", field); diff --git a/src/errors.js b/src/errors.js index c8fbe49..ad208c7 100644 --- a/src/errors.js +++ b/src/errors.js @@ -26,7 +26,7 @@ module.exports = remoteSourceHeaderUnallowed: "Le nom d'une des entêtes passées n'est pas autorisé.", remoteSourceNeedUrl: "Merci de fournir une url valide pour la source distante de données.", remoteSourceUrlFail: "L'url fournie ne semble pas valide.", - renderNeedDatas: "Il ne peut y avoir de pagination, si les données n'ont pas été récupérées.", + renderNeedFields: "Les noms de champs doivent être fournis avant de demander l'affichage des données.", selector2HTMLFail: "Le création d'un filtre dans le DOM nécessite l'initialisation de l'élément HTML et du numéro du champs à filter.", selectorCheckIsOkFail: "Le test est lancé sur un filtre incorrectement initialisé ou sur un attribut absent de la donnée à tester.", selectorFieldNotFound: "Au moins un des champs devant servir à filtrer les données n'existe pas dans le fichier.", diff --git a/src/interfaces.ts b/src/interfaces.ts index 86625a0..e9dcacd 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -3,11 +3,13 @@ export interface Counter displayElement?: DOMElement; // peut être undefined si on ne souhaite pas d'affichage automatique dans la page value?: number; // undefined jusqu'à recevoir sa première valeur } -export interface DatasRenders // interface à respecter par toute alternative à la classe Render par défaut +export interface DatasRenders { - rend2HTML(datas: any[]): string; + fields: string[]; + datas: {[index: string]:string}[]; + rend2HTML(): string; } -export interface DatasRendersSettings // interface spécifique à la classe Render par défaut. +export interface DatasRendersSettings // interface spécifique à la classe Render par défaut { allBegining: string; allEnding: string;