mapcomplete/UI/Base/Combine.ts

71 lines
2.2 KiB
TypeScript

import { FixedUiElement } from "./FixedUiElement"
import { Utils } from "../../Utils"
import BaseUIElement from "../BaseUIElement"
export default class Combine extends BaseUIElement {
private readonly uiElements: BaseUIElement[]
constructor(uiElements: (string | BaseUIElement)[]) {
super()
this.uiElements = Utils.NoNull(uiElements).map((el) => {
if (typeof el === "string") {
return new FixedUiElement(el)
}
return el
})
}
AsMarkdown(): string {
let sep = " "
if (this.HasClass("flex-col")) {
sep = "\n\n"
}
return this.uiElements.map((el) => el.AsMarkdown()).join(sep)
}
Destroy() {
super.Destroy()
for (const uiElement of this.uiElements) {
uiElement.Destroy()
}
}
public getElements(): BaseUIElement[] {
return this.uiElements
}
protected InnerConstructElement(): HTMLElement {
const el = document.createElement("span")
try {
if (this.uiElements === undefined) {
console.error(
"PANIC: this.uiElements is undefined. (This might indicate a constructor which did not call 'super'. The constructor name is",
this.constructor /*Disable code quality: used for debugging*/.name + ")"
)
}
for (const subEl of this.uiElements) {
if (subEl === undefined || subEl === null) {
continue
}
try {
const subHtml = subEl.ConstructElement()
if (subHtml !== undefined) {
el.appendChild(subHtml)
}
} catch (e) {
console.error("Could not generate subelement in combine due to ", e)
}
}
} catch (e) {
const domExc = e as DOMException
console.error("DOMException: ", domExc.name)
el.appendChild(
new FixedUiElement("Could not generate this combine!")
.SetClass("alert")
.ConstructElement()
)
}
return el
}
}