mapcomplete/UI/Base/Table.ts

80 lines
2.8 KiB
TypeScript
Raw Normal View History

2021-06-15 00:55:12 +02:00
import BaseUIElement from "../BaseUIElement";
import {Utils} from "../../Utils";
import Translations from "../i18n/Translations";
export default class Table extends BaseUIElement {
private readonly _header: BaseUIElement[];
private readonly _contents: BaseUIElement[][];
2021-06-16 14:23:53 +02:00
private readonly _contentStyle: string[][];
2021-06-15 00:55:12 +02:00
2021-06-21 03:13:05 +02:00
constructor(header: (BaseUIElement | string)[],
2021-06-16 14:23:53 +02:00
contents: (BaseUIElement | string)[][],
contentStyle?: string[][]) {
2021-06-15 00:55:12 +02:00
super();
2021-06-16 14:23:53 +02:00
this._contentStyle = contentStyle ?? [];
this._header = header?.map(Translations.W);
2021-06-15 00:55:12 +02:00
this._contents = contents.map(row => row.map(Translations.W));
}
2021-06-21 03:13:05 +02:00
AsMarkdown(): string {
const headerMarkdownParts = this._header.map(hel => hel?.AsMarkdown() ?? " ")
const header = headerMarkdownParts.join(" | ");
const headerSep = headerMarkdownParts.map(part => '-'.repeat(part.length + 2)).join(" | ")
const table = this._contents.map(row => row.map(el => el.AsMarkdown() ?? " ").join(" | ")).join("\n")
2021-06-21 03:13:05 +02:00
return "\n\n" + [header, headerSep, table, ""].join("\n")
2021-06-21 03:13:05 +02:00
}
2021-06-15 00:55:12 +02:00
protected InnerConstructElement(): HTMLElement {
const table = document.createElement("table")
const headerElems = Utils.NoNull((this._header ?? []).map(elems => elems.ConstructElement()))
if (headerElems.length > 0) {
2021-06-21 03:13:05 +02:00
const thead = document.createElement("thead")
2021-06-15 00:55:12 +02:00
const tr = document.createElement("tr");
headerElems.forEach(headerElem => {
const td = document.createElement("th")
td.appendChild(headerElem)
tr.appendChild(td)
})
2021-06-21 03:13:05 +02:00
thead.appendChild(tr)
table.appendChild(thead)
2021-06-15 00:55:12 +02:00
}
2021-06-21 03:13:05 +02:00
for (let i = 0; i < this._contents.length; i++) {
2021-06-16 14:23:53 +02:00
let row = this._contents[i];
2021-06-15 00:55:12 +02:00
const tr = document.createElement("tr")
2021-06-21 03:13:05 +02:00
for (let j = 0; j < row.length; j++) {
try {
let elem = row[j];
const htmlElem = elem?.ConstructElement()
if (htmlElem === undefined) {
continue;
}
let style = undefined;
if (this._contentStyle !== undefined && this._contentStyle[i] !== undefined && this._contentStyle[j] !== undefined) {
style = this._contentStyle[i][j]
}
const td = document.createElement("td")
td.style.cssText = style;
td.appendChild(htmlElem)
tr.appendChild(td)
} catch (e) {
console.error("Could not render an element in a table due to", e, row[j])
2021-06-15 00:55:12 +02:00
}
}
table.appendChild(tr)
}
return table;
}
}