| 
									
										
										
										
											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"; | 
					
						
							| 
									
										
										
										
											2021-10-23 02:46:37 +02:00
										 |  |  | import Img from "./Img"; | 
					
						
							| 
									
										
										
										
											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-10-27 20:19:45 +02:00
										 |  |  |     private hashToShow: string; | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |     public isShown: UIEventSource<boolean>; | 
					
						
							| 
									
										
										
										
											2021-06-10 14:05:26 +02:00
										 |  |  |     private _component: BaseUIElement; | 
					
						
							|  |  |  |     private _fullscreencomponent: BaseUIElement; | 
					
						
							| 
									
										
										
										
											2021-01-08 02:13:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-10 14:05:26 +02:00
										 |  |  |     constructor(title: ((mode: string) => BaseUIElement), content: ((mode: string) => 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" | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-12 14:52:34 +01:00
										 |  |  |         this._component = this.BuildComponent(title("desktop"), content("desktop"), isShown) | 
					
						
							|  |  |  |             .SetClass("hidden md:block"); | 
					
						
							| 
									
										
										
										
											2021-10-23 02:46:37 +02:00
										 |  |  |         this._fullscreencomponent = this.BuildComponent(title("mobile"), content("mobile").SetClass("pb-20"), isShown); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-26 17:36:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |         const self = this; | 
					
						
							|  |  |  |         isShown.addCallback(isShown => { | 
					
						
							|  |  |  |             if (isShown) { | 
					
						
							|  |  |  |                 self.Activate(); | 
					
						
							| 
									
										
										
										
											2021-10-25 20:50:59 +02:00
										 |  |  |                 Hash.hash.setData(hashToShow) | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2021-10-27 20:19:45 +02:00
										 |  |  |                 self.clear(); | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-10-25 20:50:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         Hash.hash.addCallback(hash => { | 
					
						
							| 
									
										
										
										
											2021-10-27 20:19:45 +02:00
										 |  |  |             if (!isShown.data) { | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (hash === undefined || hash === "") { | 
					
						
							|  |  |  |                 isShown.setData(false) | 
					
						
							| 
									
										
										
										
											2021-10-25 20:50:59 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-27 20:19:45 +02:00
										 |  |  |     private clear() { | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |         ScrollableFullScreen.empty.AttachTo("fullscreen") | 
					
						
							|  |  |  |         const fs = document.getElementById("fullscreen"); | 
					
						
							|  |  |  |         ScrollableFullScreen._currentlyOpen?.isShown?.setData(false); | 
					
						
							|  |  |  |         fs.classList.add("hidden") | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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") | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |     private BuildComponent(title: BaseUIElement, content: BaseUIElement, isShown: UIEventSource<boolean>) { | 
					
						
							| 
									
										
										
										
											2021-01-25 03:12:09 +01:00
										 |  |  |         const returnToTheMap = | 
					
						
							|  |  |  |             new Combine([ | 
					
						
							| 
									
										
										
										
											2021-10-25 20:50:59 +02:00
										 |  |  |                 new Img(Svg.back.replace(/#000000/g, "#cccccc"), true) | 
					
						
							| 
									
										
										
										
											2021-10-23 02:46:37 +02:00
										 |  |  |                     .SetClass("block md:hidden w-12 h-12 p-2"), | 
					
						
							| 
									
										
										
										
											2021-10-25 20:50:59 +02:00
										 |  |  |                 new Img(Svg.close.replace(/#000000/g, "#cccccc"), true) | 
					
						
							|  |  |  |                     .SetClass("hidden md:block  w-12 h-12  p-3") | 
					
						
							| 
									
										
										
										
											2021-10-23 02:46:37 +02:00
										 |  |  |             ]).SetClass("rounded-full p-0 flex-shrink-0 self-center") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         returnToTheMap.onClick(() => { | 
					
						
							|  |  |  |             isShown.setData(false) | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-01-22 01:03:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-23 02:46:37 +02:00
										 |  |  |         title.SetClass("block text-l sm:text-xl md:text-2xl w-full font-bold p-0 max-h-20vh overflow-y-auto") | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |         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"), | 
					
						
							|  |  |  |                 new Combine([content]) | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |                     .SetClass("block p-2 md:pt-4 w-full h-full overflow-y-auto md:max-h-65vh"), | 
					
						
							|  |  |  |                 // 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
										 |  |  | } |