FreeDatas2HTML/src/freeDatas2HTMLRender.ts

68 lines
2.8 KiB
TypeScript

const errors = require("./errors.js");
import { DatasRenders, DatasRendersSettings } from "./interfaces";
import { FreeDatas2HTML } from "./freeDatas2HTML";
export class Render implements DatasRenders
{
private _converter: FreeDatas2HTML;
public settings: DatasRendersSettings;
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>",
};
// 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;
}
}
}