forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			54 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
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> | number = 0,
 | 
						|
        options?: {
 | 
						|
            leftOfHeader?: BaseUIElement
 | 
						|
            styleHeader?: (header: BaseUIElement) => void
 | 
						|
        }
 | 
						|
    ) {
 | 
						|
        const openedTabSrc =
 | 
						|
            typeof openedTab === "number"
 | 
						|
                ? new UIEventSource(openedTab)
 | 
						|
                : openedTab ?? new UIEventSource<number>(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])
 | 
						|
    }
 | 
						|
}
 |