mapcomplete/UI/Base/VariableUIElement.ts

63 lines
1.8 KiB
TypeScript
Raw Normal View History

2022-09-08 21:40:48 +02:00
import { Store } from "../../Logic/UIEventSource"
import BaseUIElement from "../BaseUIElement"
import Combine from "./Combine"
2021-06-10 01:36:20 +02:00
export class VariableUiElement extends BaseUIElement {
2022-09-08 21:40:48 +02:00
private readonly _contents?: Store<string | BaseUIElement | BaseUIElement[]>
2022-08-20 12:46:33 +02:00
constructor(contents?: Store<string | BaseUIElement | BaseUIElement[]>) {
2022-09-08 21:40:48 +02:00
super()
this._contents = contents
}
2022-01-18 18:52:42 +01:00
2022-01-06 18:51:52 +01:00
Destroy() {
2022-09-08 21:40:48 +02:00
super.Destroy()
this.isDestroyed = true
2022-01-06 18:51:52 +01:00
}
2022-01-26 21:40:38 +01:00
AsMarkdown(): string {
2022-09-08 21:40:48 +02:00
const d = this._contents?.data
2022-01-26 21:40:38 +01:00
if (typeof d === "string") {
2022-09-08 21:40:48 +02:00
return d
2022-01-26 21:40:38 +01:00
}
if (d instanceof BaseUIElement) {
return d.AsMarkdown()
}
return new Combine(<BaseUIElement[]>d).AsMarkdown()
}
protected InnerConstructElement(): HTMLElement {
2022-09-08 21:40:48 +02:00
const el = document.createElement("span")
const self = this
this._contents?.addCallbackAndRun((contents) => {
2022-01-18 18:52:42 +01:00
if (self.isDestroyed) {
2022-09-08 21:40:48 +02:00
return true
2022-01-06 18:51:52 +01:00
}
2022-09-08 21:40:48 +02:00
while (el.firstChild) {
2022-09-08 21:40:48 +02:00
el.removeChild(el.lastChild)
}
2021-06-14 02:39:23 +02:00
if (contents === undefined) {
return
}
if (typeof contents === "string") {
2022-09-08 21:40:48 +02:00
el.innerHTML = contents
} else if (contents instanceof Array) {
for (const content of contents) {
2022-09-08 21:40:48 +02:00
const c = content?.ConstructElement()
if (c !== undefined && c !== null) {
2022-09-08 21:40:48 +02:00
el.appendChild(c)
}
}
} else {
2022-09-08 21:40:48 +02:00
const c = contents.ConstructElement()
if (c !== undefined && c !== null) {
2022-09-08 21:40:48 +02:00
el.appendChild(c)
}
}
2022-09-08 21:40:48 +02:00
})
return el
}
2021-07-26 12:26:41 +02:00
}