| 
									
										
										
										
											2021-11-25 21:31:33 +01:00
										 |  |  | import BaseUIElement from "../BaseUIElement"; | 
					
						
							|  |  |  | import {UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							|  |  |  | import Combine from "./Combine"; | 
					
						
							| 
									
										
										
										
											2021-11-26 02:45:39 +01:00
										 |  |  | import Title from "./Title"; | 
					
						
							|  |  |  | import Hash from "../../Logic/Web/Hash"; | 
					
						
							| 
									
										
										
										
											2021-11-25 21:31:33 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | export class Accordeon extends Combine { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     constructor(toggles: Toggleable[]) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (const el of toggles) { | 
					
						
							|  |  |  |             el.isVisible.addCallbackAndRun(isVisible => toggles.forEach(toggle => { | 
					
						
							|  |  |  |                 if (toggle !== el && isVisible) { | 
					
						
							|  |  |  |                     toggle.isVisible.setData(false) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             })) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-01-18 18:52:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-25 21:31:33 +01:00
										 |  |  |         super(toggles); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-25 22:16:00 +01:00
										 |  |  | export default class Toggleable extends Combine { | 
					
						
							| 
									
										
										
										
											2021-11-25 21:31:33 +01:00
										 |  |  |     public readonly isVisible = new UIEventSource(false) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-26 02:45:39 +01:00
										 |  |  |     constructor(title: Title | BaseUIElement, content: BaseUIElement) { | 
					
						
							| 
									
										
										
										
											2021-11-25 22:16:00 +01:00
										 |  |  |         super([title, content]) | 
					
						
							| 
									
										
										
										
											2021-11-26 02:45:39 +01:00
										 |  |  |         content.SetClass("animate-height border-l-4 pl-2") | 
					
						
							| 
									
										
										
										
											2021-11-25 22:16:00 +01:00
										 |  |  |         title.SetClass("background-subtle rounded-lg") | 
					
						
							| 
									
										
										
										
											2021-11-25 21:31:33 +01:00
										 |  |  |         const self = this | 
					
						
							|  |  |  |         this.onClick(() => self.isVisible.setData(!self.isVisible.data)) | 
					
						
							| 
									
										
										
										
											2021-11-25 22:16:00 +01:00
										 |  |  |         const contentElement = content.ConstructElement() | 
					
						
							| 
									
										
										
										
											2021-11-25 21:31:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-18 18:52:42 +01:00
										 |  |  |         if (title instanceof Title) { | 
					
						
							| 
									
										
										
										
											2021-11-26 02:45:39 +01:00
										 |  |  |             Hash.hash.addCallbackAndRun(h => { | 
					
						
							| 
									
										
										
										
											2022-01-18 18:52:42 +01:00
										 |  |  |                 if (h === title.id) { | 
					
						
							| 
									
										
										
										
											2021-11-26 02:45:39 +01:00
										 |  |  |                     self.isVisible.setData(true) | 
					
						
							|  |  |  |                     content.RemoveClass("border-gray-300") | 
					
						
							|  |  |  |                     content.SetClass("border-red-300") | 
					
						
							| 
									
										
										
										
											2022-01-18 18:52:42 +01:00
										 |  |  |                 } else { | 
					
						
							| 
									
										
										
										
											2021-11-26 02:45:39 +01:00
										 |  |  |                     content.SetClass("border-gray-300") | 
					
						
							|  |  |  |                     content.RemoveClass("border-red-300") | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             this.isVisible.addCallbackAndRun(isVis => { | 
					
						
							| 
									
										
										
										
											2022-01-18 18:52:42 +01:00
										 |  |  |                 if (isVis) { | 
					
						
							| 
									
										
										
										
											2021-11-26 02:45:39 +01:00
										 |  |  |                     Hash.hash.setData(title.id) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-01-18 18:52:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-25 21:31:33 +01:00
										 |  |  |         this.isVisible.addCallbackAndRun(isVisible => { | 
					
						
							|  |  |  |             if (isVisible) { | 
					
						
							| 
									
										
										
										
											2021-11-25 22:16:00 +01:00
										 |  |  |                 contentElement.style.maxHeight = "100vh" | 
					
						
							|  |  |  |                 contentElement.style["-webkit-mask-image"] = "unset" | 
					
						
							| 
									
										
										
										
											2021-11-25 21:31:33 +01:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2021-11-25 22:16:00 +01:00
										 |  |  |                 contentElement.style["-webkit-mask-image"] = "-webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)))" | 
					
						
							|  |  |  |                 contentElement.style.maxHeight = "2rem" | 
					
						
							| 
									
										
										
										
											2021-11-25 21:31:33 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |