Remaniement de la classe gérant le rendu HTML des données.

This commit is contained in:
Fabrice PENHOËT 2021-10-20 17:32:05 +02:00
parent ae1bc5339b
commit fc91c7b665
3 changed files with 49 additions and 35 deletions

View File

@ -1,11 +1,12 @@
const errors=require("./errors.js"); const errors=require("./errors.js");
import { DatasRenders, DatasRendersSettings } from "./interfaces"; import { DatasRenders, DatasRendersSettings } from "./interfaces";
import { FreeDatas2HTML } from "./freeDatas2HTML"; //import { FreeDatas2HTML } from "./freeDatas2HTML";
export class Render implements DatasRenders export class Render implements DatasRenders
{ {
private _converter: FreeDatas2HTML; private _fields: string[]=[];
public settings: DatasRendersSettings; public settings: DatasRendersSettings;
public datas: {[index: string]:string}[]=[];
static readonly defaultSettings= static readonly defaultSettings=
{ {
allBegining: "<table>", allBegining: "<table>",
@ -17,22 +18,33 @@ export class Render implements DatasRenders
linesEnding: "</tbody>", linesEnding: "</tbody>",
lineBegining: "<tr>", lineBegining: "<tr>",
lineEnding: "</tr>", lineEnding: "</tr>",
dataDisplaying:"<td>#VALUE</td>", dataDisplaying: "<td>#VALUE</td>"
}; };
// Injection de la classe principale constructor(settings: DatasRendersSettings=Render.defaultSettings)
constructor(converter: FreeDatas2HTML, settings:DatasRendersSettings=Render.defaultSettings)
{ {
this._converter=converter;
this.settings=settings; this.settings=settings;
} }
// Reçoit les données à afficher et retourne le HTML correspondant. // Les données fournies peuvent être vides du fait de l'action des filtres ou encore de la pagination...
public rend2HTML(datas: any[]) : string // 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(fields.length === 0)
if(this._converter.fields === undefined) throw new Error(errors.renderNeedFields);
throw new Error(errors.renderNeedDatas); else
this._fields=fields;
}
get fields() : string[]
{
return this._fields;
}
public rend2HTML() : string
{
if(this._fields.length === 0)
throw new Error(errors.renderNeedFields);
else else
{ {
let datasHTML=this.settings.allBegining; 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 ) if(this.settings.fieldsBegining !== undefined && this.settings.fieldDisplaying !== undefined && this.settings.fieldsEnding !== undefined )
{ {
datasHTML+=this.settings.fieldsBegining; 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.fieldDisplaying.replace("#FIELDNAME", field);
datasHTML+=this.settings.fieldsEnding; datasHTML+=this.settings.fieldsEnding;
} }
datasHTML+=this.settings.linesBegining; datasHTML+=this.settings.linesBegining;
// Suivant les objets/lignes, les champs peuvent se trouver dans un ordre différent, // Suivant les objets/lignes, les champs peuvent se trouver dans un ordre différent.
// ou encore des champs peuvent manquer ou être en trop. // Ou encore des champs peuvent manquer, être en trop...
// Seuls les champs de "fields" doivent être traités et en respectant l'ordre de ce tableau. // 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 datas) for(let row of this.datas)
{ {
datasHTML+=this.settings.lineBegining; datasHTML+=this.settings.lineBegining;
for(let field of this._converter.fields) for(let field of this._fields)
{ {
if(row[field] !== undefined) if(row[field] !== undefined)
datasHTML+=this.settings.dataDisplaying.replace("#VALUE", row[field]).replace("#FIELDNAME", field); datasHTML+=this.settings.dataDisplaying.replace("#VALUE", row[field]).replace("#FIELDNAME", field);

View File

@ -26,7 +26,7 @@ module.exports =
remoteSourceHeaderUnallowed: "Le nom d'une des entêtes passées n'est pas autorisé.", 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.", remoteSourceNeedUrl: "Merci de fournir une url valide pour la source distante de données.",
remoteSourceUrlFail: "L'url fournie ne semble pas valide.", 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.", 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.", 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.", selectorFieldNotFound: "Au moins un des champs devant servir à filtrer les données n'existe pas dans le fichier.",

View File

@ -3,11 +3,13 @@ export interface Counter
displayElement?: DOMElement; // peut être undefined si on ne souhaite pas d'affichage automatique dans la page 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 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; allBegining: string;
allEnding: string; allEnding: string;