import Translations from "../i18n/Translations" import { UIEventSource } from "../../Logic/UIEventSource" import Combine from "./Combine" import BaseUIElement from "../BaseUIElement" import { VariableUiElement } from "./VariableUIElement" export class TabbedComponent extends Combine { constructor( elements: { header: BaseUIElement | string; content: BaseUIElement | string }[], openedTab: UIEventSource | number = 0, options?: { leftOfHeader?: BaseUIElement styleHeader?: (header: BaseUIElement) => void } ) { const openedTabSrc = typeof openedTab === "number" ? new UIEventSource(openedTab) : openedTab ?? new UIEventSource(0) const tabs: BaseUIElement[] = [options?.leftOfHeader] const contentElements: BaseUIElement[] = [] for (let i = 0; i < elements.length; i++) { let element = elements[i] const header = Translations.W(element.header).onClick(() => openedTabSrc.setData(i)) openedTabSrc.addCallbackAndRun((selected) => { if (selected >= elements.length) { selected = 0 } if (selected === i) { header.SetClass("tab-active") header.RemoveClass("tab-non-active") } else { header.SetClass("tab-non-active") header.RemoveClass("tab-active") } }) const content = Translations.W(element.content) content.SetClass("relative w-full inline-block") contentElements.push(content) const tab = header.SetClass("block tab-single-header") tabs.push(tab) } const header = new Combine(tabs).SetClass("tabs-header-bar") if (options?.styleHeader) { options.styleHeader(header) } const actualContent = new VariableUiElement( openedTabSrc.map((i) => contentElements[i]) ).SetStyle("max-height: inherit; height: inherit") super([header, actualContent]) } }