| 
									
										
										
										
											2021-01-08 02:13:44 +01:00
										 |  |  | import {UIElement} from "../UIElement"; | 
					
						
							|  |  |  | import Svg from "../../Svg"; | 
					
						
							|  |  |  | import Combine from "./Combine"; | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  | import {FixedUiElement} from "./FixedUiElement"; | 
					
						
							|  |  |  | import {UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							| 
									
										
										
										
											2021-03-12 14:52:34 +01:00
										 |  |  | import Hash from "../../Logic/Web/Hash"; | 
					
						
							| 
									
										
										
										
											2021-06-10 14:05:26 +02:00
										 |  |  | import BaseUIElement from "../BaseUIElement"; | 
					
						
							| 
									
										
										
										
											2022-02-01 04:14:54 +01:00
										 |  |  | import Title from "./Title"; | 
					
						
							| 
									
										
										
										
											2021-01-08 02:13:44 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2021-06-10 01:36:20 +02:00
										 |  |  |  * The scrollableFullScreen is a bit of a peculiar component: | 
					
						
							|  |  |  |  * - It shows a title and some contents, constructed from the respective functions passed into the constructor | 
					
						
							|  |  |  |  * - When the element is 'activated', one clone of title+contents is attached to the fullscreen | 
					
						
							|  |  |  |  * - The element itself will - upon rendering - also show the title and contents (allthough it'll be a different clone) | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2021-01-08 02:13:44 +01:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-01-09 00:03:21 +01:00
										 |  |  | export default class ScrollableFullScreen extends UIElement { | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |     private static readonly empty = new FixedUiElement(""); | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |     private static _currentlyOpen: ScrollableFullScreen; | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |     public isShown: UIEventSource<boolean>; | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     private hashToShow: string; | 
					
						
							| 
									
										
										
										
											2021-06-10 14:05:26 +02:00
										 |  |  |     private _component: BaseUIElement; | 
					
						
							|  |  |  |     private _fullscreencomponent: BaseUIElement; | 
					
						
							| 
									
										
										
										
											2022-02-09 00:35:59 +01:00
										 |  |  |     private _resetScrollSignal: UIEventSource<void> = new UIEventSource<void>(undefined); | 
					
						
							| 
									
										
										
										
											2021-01-08 02:13:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-09 00:35:59 +01:00
										 |  |  |     constructor(title: ((options: { mode: string }) => BaseUIElement), | 
					
						
							|  |  |  |                 content: ((options: { mode: string, resetScrollSignal: UIEventSource<void> }) => BaseUIElement), | 
					
						
							| 
									
										
										
										
											2021-10-25 20:50:59 +02:00
										 |  |  |                 hashToShow: string, | 
					
						
							| 
									
										
										
										
											2021-03-12 14:52:34 +01:00
										 |  |  |                 isShown: UIEventSource<boolean> = new UIEventSource<boolean>(false) | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |     ) { | 
					
						
							| 
									
										
										
										
											2021-01-08 02:13:44 +01:00
										 |  |  |         super(); | 
					
						
							| 
									
										
										
										
											2021-10-27 20:19:45 +02:00
										 |  |  |         this.hashToShow = hashToShow; | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |         this.isShown = isShown; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-25 20:50:59 +02:00
										 |  |  |         if (hashToShow === undefined) { | 
					
						
							|  |  |  |             throw "HashToShow should be defined as it is vital for the 'back' key functionality" | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-02-09 00:35:59 +01:00
										 |  |  |          | 
					
						
							|  |  |  |         const desktopOptions = { | 
					
						
							|  |  |  |             mode: "desktop", | 
					
						
							|  |  |  |             resetScrollSignal: this._resetScrollSignal | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         const mobileOptions = { | 
					
						
							|  |  |  |             mode: "mobile", | 
					
						
							|  |  |  |             resetScrollSignal: this._resetScrollSignal | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-25 20:50:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-09 00:35:59 +01:00
										 |  |  |         this._component = this.BuildComponent(title(desktopOptions), content(desktopOptions))            .SetClass("hidden md:block"); | 
					
						
							|  |  |  |         this._fullscreencomponent = this.BuildComponent(title(mobileOptions), content(mobileOptions).SetClass("pb-20")); | 
					
						
							| 
									
										
										
										
											2021-10-23 02:46:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-26 17:36:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |         const self = this; | 
					
						
							| 
									
										
										
										
											2022-01-21 13:58:40 +01:00
										 |  |  |         Hash.hash.addCallback(h => { | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |             if (h === undefined) { | 
					
						
							| 
									
										
										
										
											2022-01-21 13:58:40 +01:00
										 |  |  |                 isShown.setData(false) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |         isShown.addCallback(isShown => { | 
					
						
							|  |  |  |             if (isShown) { | 
					
						
							| 
									
										
										
										
											2021-12-02 22:57:27 +01:00
										 |  |  |                 // We first must set the hash, then activate the panel
 | 
					
						
							|  |  |  |                 // If the order is wrong, this will cause the panel to disactivate again
 | 
					
						
							| 
									
										
										
										
											2021-10-25 20:50:59 +02:00
										 |  |  |                 Hash.hash.setData(hashToShow) | 
					
						
							| 
									
										
										
										
											2021-12-02 22:57:27 +01:00
										 |  |  |                 self.Activate(); | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2022-01-06 18:51:52 +01:00
										 |  |  |                 // Some cleanup...
 | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-06 18:51:52 +01:00
										 |  |  |                 const fs = document.getElementById("fullscreen"); | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |                 if (fs !== null) { | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |                     ScrollableFullScreen.empty.AttachTo("fullscreen") | 
					
						
							|  |  |  |                     fs.classList.add("hidden") | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-06 18:51:52 +01:00
										 |  |  |                 ScrollableFullScreen._currentlyOpen?.isShown?.setData(false); | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-10 14:05:26 +02:00
										 |  |  |     InnerRender(): BaseUIElement { | 
					
						
							| 
									
										
										
										
											2021-06-10 01:36:20 +02:00
										 |  |  |         return this._component; | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-06 18:51:52 +01:00
										 |  |  |     Destroy() { | 
					
						
							|  |  |  |         super.Destroy(); | 
					
						
							|  |  |  |         this._component.Destroy() | 
					
						
							|  |  |  |         this._fullscreencomponent.Destroy() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |     Activate(): void { | 
					
						
							|  |  |  |         this.isShown.setData(true) | 
					
						
							|  |  |  |         this._fullscreencomponent.AttachTo("fullscreen"); | 
					
						
							|  |  |  |         const fs = document.getElementById("fullscreen"); | 
					
						
							| 
									
										
										
										
											2021-03-12 14:52:34 +01:00
										 |  |  |         ScrollableFullScreen._currentlyOpen = this; | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |         fs.classList.remove("hidden") | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-01-18 18:52:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-09 00:35:59 +01:00
										 |  |  |     private BuildComponent(title: BaseUIElement, content: BaseUIElement) :BaseUIElement { | 
					
						
							| 
									
										
										
										
											2021-01-25 03:12:09 +01:00
										 |  |  |         const returnToTheMap = | 
					
						
							|  |  |  |             new Combine([ | 
					
						
							| 
									
										
										
										
											2022-02-01 19:02:46 +01:00
										 |  |  |                 Svg.back_svg().SetClass("block md:hidden w-12 h-12 p-2 svg-foreground"), | 
					
						
							|  |  |  |                 Svg.close_svg()                    .SetClass("hidden md:block  w-12 h-12  p-3 svg-foreground") | 
					
						
							| 
									
										
										
										
											2021-10-23 02:46:37 +02:00
										 |  |  |             ]).SetClass("rounded-full p-0 flex-shrink-0 self-center") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         returnToTheMap.onClick(() => { | 
					
						
							| 
									
										
										
										
											2022-02-09 00:35:59 +01:00
										 |  |  |             this.isShown.setData(false) | 
					
						
							| 
									
										
										
										
											2022-01-06 18:51:52 +01:00
										 |  |  |             Hash.hash.setData(undefined) | 
					
						
							| 
									
										
										
										
											2021-10-23 02:46:37 +02:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-01-22 01:03:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-01 04:14:54 +01:00
										 |  |  |         title = new Title(title, 2) | 
					
						
							|  |  |  |         title.SetClass("text-l sm:text-xl md:text-2xl w-full p-0 max-h-20vh overflow-y-auto self-center") | 
					
						
							| 
									
										
										
										
											2022-02-09 00:35:59 +01:00
										 |  |  |         const contentWrapper =  new Combine([content]) | 
					
						
							|  |  |  |             .SetClass("block p-2 md:pt-4 w-full h-full overflow-y-auto md:max-h-65vh") | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         this._resetScrollSignal.addCallback(_ => { | 
					
						
							|  |  |  |             contentWrapper.ScrollToTop(); | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |        return new Combine([ | 
					
						
							| 
									
										
										
										
											2021-01-24 18:33:16 +01:00
										 |  |  |             new Combine([ | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |                 new Combine([returnToTheMap, title]) | 
					
						
							| 
									
										
										
										
											2021-10-23 02:46:37 +02:00
										 |  |  |                     .SetClass("border-b-1 border-black shadow bg-white flex flex-shrink-0 pt-1 pb-1 md:pt-0 md:pb-0"), | 
					
						
							| 
									
										
										
										
											2022-02-09 00:35:59 +01:00
										 |  |  |               contentWrapper , | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |                 // We add an ornament which takes around 5em. This is in order to make sure the Web UI doesn't hide
 | 
					
						
							|  |  |  |             ]).SetClass("flex flex-col h-full relative bg-white") | 
					
						
							| 
									
										
										
										
											2021-10-23 02:46:37 +02:00
										 |  |  |         ]).SetClass("fixed top-0 left-0 right-0 h-screen w-screen md:max-h-65vh md:w-auto md:relative z-above-controls md:rounded-xl overflow-hidden"); | 
					
						
							| 
									
										
										
										
											2021-01-24 18:33:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-25 03:12:09 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-08 02:13:44 +01:00
										 |  |  | } |