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,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:"<table>",
allEnding:"</table>",
fieldsBegining:"<thead><tr>",
fieldsEnding:"</tr></thead>",
fieldDisplaying:"<th>#FIELDNAME</th>",
linesBegining:"<tbody>",
linesEnding:"</tbody>",
lineBegining:"<tr>",
lineEnding:"</tr>",
dataDisplaying:"<td>#VALUE</td>",
};
allBegining: "<table>",
allEnding: "</table>",
fieldsBegining: "<thead><tr>",
fieldsEnding: "</tr></thead>",
fieldDisplaying: "<th>#FIELDNAME</th>",
linesBegining: "<tbody>",
linesEnding: "</tbody>",
lineBegining: "<tr>",
lineEnding: "</tr>",
dataDisplaying: "<td>#VALUE</td>"
};
// 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);

View File

@ -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.",

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
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;