const tsvDirUrl = "../tsv/";
const eol = "\r\n";
//------------------------------------------------------------------------------
var tsvFileNames: string[];
function onTsvDirGetComplete (html: string) {
let page = $($.parseHTML(html));
let AElements = page.find("a");
tsvFileNames = [];
for (let i = 0; i < AElements.length; i++) {
let e = AElements.eq(i);
let s = e.attr("href");
if (s && s.match(/\.tsv$/)) {
tsvFileNames.push(s); }}
buildIndexPage(); }
// Input: yyyy-mm-dd-hhmm*
// Output: dd.mm.yyyy hh:mm
function formatFileNameTimestamp (s: string) : string {
let r = s.match(/^(\d\d\d\d)-(\d\d)-(\d\d)-(\d\d)(\d\d)/);
if (!r || r.length != 6) {
return "(?)"; }
return r[3] + "." + r[2] + "." + r[1] + " " + r[4] + ":" + r[5]; }
function buildIndexPage() {
let html = "";
html += "
Messdaten-Index
" + eol;
html += '';
for (let fn of tsvFileNames) {
let ts = formatFileNameTimestamp(fn);
html += '
' + ts + "" + eol; }
html += "
";
$("body").html(html);
$(".tsvFileLink").click( function (this: Element, event: Event) {
event.preventDefault();
openTsvFile($(this).data("tsvFileName")); }); }
function requestTsvDirectory() {
$("body").html("(requesting TSV directory)");
$.get(tsvDirUrl, onTsvDirGetComplete, "text");
$("body").html("(Ajax sent)"); }
//------------------------------------------------------------------------------
var currentTsvFileName: string;
function openTsvFile (tsvFileName: string) {
currentTsvFileName = tsvFileName;
$("body").html("(opening " + tsvFileName + ")");
let tsvFileUrl = tsvDirUrl + tsvFileName;
$.get(tsvFileUrl, onTsvFileGetComplete, "text"); }
function onTsvFileGetComplete (fileData: string) {
let tsvFileRows = fileData.split(/\r?\n/);
let fieldRows: string[][] = [];
let columnCount = 0;
for (let fileRow of tsvFileRows) {
if (fileRow.length == 0) {
continue; }
const fields = fileRow.split(/\t/);
columnCount = Math.max(columnCount, fields.length);
fieldRows.push(fields); }
buildMeterDataPage(fieldRows, columnCount); }
function buildMeterDataPage (fieldRows: string[][], columnCount: number) {
let html = "";
let ts = formatFileNameTimestamp(currentTsvFileName);
html += "Messdaten " + ts + "
" + eol;
html += '';
$("body").html(html);
const firstValueColumn = 5;
const meterValues = Math.floor((columnCount - firstValueColumn) / 2);
let tableColumns = [
{title: "Haus", field: "busNo", width: 40, sorter: "number" },
{title: "M-Bus Adr.", field: "meterAddr", width: 40, align: "right", sorter: "number" },
{title: "Zähler-Nr.", field: "meterId", width: 80, sorter: "number"},
{title: "Typ", field: "productName", width: 80},
{title: "Medium", field: "medium", width: 80} ];
for (let i = 0; i < meterValues; i++) {
tableColumns.push({
title: "Messwert " + (i + 1),
field: "value" + (i + 1),
width: 85,
align: "right",
sorter: "number" }); // Nicht alle Werte sind numerisch. Geht das trotzdem?
tableColumns.push({
title: "Einheit " + (i + 1),
field: "unit" + (i + 1),
width: 85 }); }
let tableData = [];
for (let rowNo = 0; rowNo < fieldRows.length; rowNo++) {
let fields = fieldRows[rowNo];
let r: any = {
id: rowNo,
busNo: fields[0],
meterAddr: fields[1],
meterId: fields[2],
productName: fields[3],
medium: fields[4] };
for (let i = 0; i < meterValues; i++) {
let meterValue = fields[firstValueColumn + 2 * i];
let meterUnit = fields[firstValueColumn + 2 * i + 1];
if (meterValue != null) {
r["value" + (i + 1)] = meterValue;
r["unit" + (i + 1)] = meterUnit; }}
tableData.push(r); }
const tabulatorOptions = {
columns: tableColumns,
data: tableData,
height: genMeterTableHeight(), // height must be set for progressive rendering
selectable: false,
progressiveRender: true,
progressiveRenderSize: 5,
progressiveRenderMargin: 100
};
// console.log(JSON.stringify(tableColumns));
// console.log(JSON.stringify(tableData));
$(".meterTable").tabulator(tabulatorOptions); }
function genMeterTableHeight() {
return ($(window).height() - 80) + "px"; }
function adjustMeterTableHeight() {
let t = $(".meterTable");
if (t.length == 0) {
return; }
let newHeight = genMeterTableHeight();
let oldHeight = t.tabulator("option", "height");
if (newHeight == oldHeight) {
return; }
t.css("height", newHeight);
t.tabulator("option", "height", newHeight); }
//------------------------------------------------------------------------------
var delayedWindowResizeTimerId: number|undefined;
function delayedWindowResizeEvent() {
delayedWindowResizeTimerId = undefined;
adjustMeterTableHeight(); }
function windowResizeEvent() {
if (delayedWindowResizeTimerId) {
clearTimeout(delayedWindowResizeTimerId); }
delayedWindowResizeTimerId = setTimeout(delayedWindowResizeEvent, 200); }
function init() {
$(window).resize(windowResizeEvent);
requestTsvDirectory(); }
$(init);