| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | import Translations from "../i18n/Translations" | 
					
						
							|  |  |  | import { UIEventSource } from "../../Logic/UIEventSource" | 
					
						
							|  |  |  | import Combine from "./Combine" | 
					
						
							|  |  |  | import BaseUIElement from "../BaseUIElement" | 
					
						
							|  |  |  | import { VariableUiElement } from "./VariableUIElement" | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-12 02:58:32 +02:00
										 |  |  | export class TabbedComponent extends Combine { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         const tabs: BaseUIElement[] = [options?.leftOfHeader] | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const contentElements: BaseUIElement[] = [] | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |         for (let i = 0; i < elements.length; i++) { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             let element = elements[i] | 
					
						
							| 
									
										
										
										
											2021-06-12 02:58:32 +02:00
										 |  |  |             const header = Translations.W(element.header).onClick(() => openedTabSrc.setData(i)) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             openedTabSrc.addCallbackAndRun((selected) => { | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                 if (selected >= elements.length) { | 
					
						
							| 
									
										
										
										
											2021-10-27 20:19:45 +02:00
										 |  |  |                     selected = 0 | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |                 if (selected === i) { | 
					
						
							| 
									
										
										
										
											2021-06-14 19:21:33 +02:00
										 |  |  |                     header.SetClass("tab-active") | 
					
						
							|  |  |  |                     header.RemoveClass("tab-non-active") | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |                 } else { | 
					
						
							| 
									
										
										
										
											2021-06-14 19:21:33 +02:00
										 |  |  |                     header.SetClass("tab-non-active") | 
					
						
							|  |  |  |                     header.RemoveClass("tab-active") | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }) | 
					
						
							| 
									
										
										
										
											2020-09-12 23:15:17 +02:00
										 |  |  |             const content = Translations.W(element.content) | 
					
						
							| 
									
										
										
										
											2021-10-07 22:06:47 +02:00
										 |  |  |             content.SetClass("relative w-full inline-block") | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             contentElements.push(content) | 
					
						
							| 
									
										
										
										
											2021-06-12 02:58:32 +02:00
										 |  |  |             const tab = header.SetClass("block tab-single-header") | 
					
						
							|  |  |  |             tabs.push(tab) | 
					
						
							| 
									
										
										
										
											2020-07-29 15:05:19 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-01 00:23:44 +02:00
										 |  |  |         const header = new Combine(tabs).SetClass("tabs-header-bar") | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         if (options?.styleHeader) { | 
					
						
							| 
									
										
										
										
											2021-10-07 22:06:47 +02:00
										 |  |  |             options.styleHeader(header) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-06-12 02:58:32 +02:00
										 |  |  |         const actualContent = new VariableUiElement( | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             openedTabSrc.map((i) => contentElements[i]) | 
					
						
							| 
									
										
										
										
											2021-10-07 22:06:47 +02:00
										 |  |  |         ).SetStyle("max-height: inherit; height: inherit") | 
					
						
							| 
									
										
										
										
											2021-06-12 02:58:32 +02:00
										 |  |  |         super([header, actualContent]) | 
					
						
							| 
									
										
										
										
											2020-08-27 18:44:16 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | } |