| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | import FeaturePipelineState from "../Logic/State/FeaturePipelineState"; | 
					
						
							|  |  |  | import State from "../State"; | 
					
						
							|  |  |  | import {Utils} from "../Utils"; | 
					
						
							|  |  |  | import {UIEventSource} from "../Logic/UIEventSource"; | 
					
						
							|  |  |  | import FullWelcomePaneWithTabs from "./BigComponents/FullWelcomePaneWithTabs"; | 
					
						
							|  |  |  | import MapControlButton from "./MapControlButton"; | 
					
						
							|  |  |  | import Svg from "../Svg"; | 
					
						
							|  |  |  | import Toggle from "./Input/Toggle"; | 
					
						
							|  |  |  | import UserBadge from "./BigComponents/UserBadge"; | 
					
						
							|  |  |  | import SearchAndGo from "./BigComponents/SearchAndGo"; | 
					
						
							|  |  |  | import BaseUIElement from "./BaseUIElement"; | 
					
						
							|  |  |  | import LeftControls from "./BigComponents/LeftControls"; | 
					
						
							|  |  |  | import RightControls from "./BigComponents/RightControls"; | 
					
						
							|  |  |  | import CenterMessageBox from "./CenterMessageBox"; | 
					
						
							| 
									
										
										
										
											2021-10-15 14:52:11 +02:00
										 |  |  | import ShowDataLayer from "./ShowDataLayer/ShowDataLayer"; | 
					
						
							|  |  |  | import ScrollableFullScreen from "./Base/ScrollableFullScreen"; | 
					
						
							|  |  |  | import Translations from "./i18n/Translations"; | 
					
						
							|  |  |  | import SimpleAddUI from "./BigComponents/SimpleAddUI"; | 
					
						
							|  |  |  | import StrayClickHandler from "../Logic/Actors/StrayClickHandler"; | 
					
						
							| 
									
										
										
										
											2021-11-03 00:44:53 +01:00
										 |  |  | import {DefaultGuiState} from "./DefaultGuiState"; | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  | import LayerConfig from "../Models/ThemeConfig/LayerConfig"; | 
					
						
							|  |  |  | import * as home_location_json from "../assets/layers/home_location/home_location.json"; | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  | import NewNoteUi from "./Popup/NewNoteUi"; | 
					
						
							|  |  |  | import Combine from "./Base/Combine"; | 
					
						
							|  |  |  | import AddNewMarker from "./BigComponents/AddNewMarker"; | 
					
						
							| 
									
										
										
										
											2022-01-14 02:40:55 +01:00
										 |  |  | import FilteredLayer from "../Models/FilteredLayer"; | 
					
						
							| 
									
										
										
										
											2022-02-14 04:48:33 +01:00
										 |  |  | import ExtraLinkButton from "./BigComponents/ExtraLinkButton"; | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * The default MapComplete GUI initializor | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Adds a welcome pane, contorl buttons, ... etc to index.html | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | export default class DefaultGUI { | 
					
						
							| 
									
										
										
										
											2022-04-08 17:59:14 +02:00
										 |  |  |     private readonly guiState: DefaultGuiState; | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |     private readonly state: FeaturePipelineState; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     constructor(state: FeaturePipelineState, guiState: DefaultGuiState) { | 
					
						
							|  |  |  |         this.state = state; | 
					
						
							| 
									
										
										
										
											2022-04-08 17:59:14 +02:00
										 |  |  |         this.guiState = guiState; | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-08 17:59:14 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public setup(){ | 
					
						
							|  |  |  |         if (this.state.layoutToUse.customCss !== undefined) { | 
					
						
							|  |  |  |             Utils.LoadCustomCss(this.state.layoutToUse.customCss); | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  |         this.SetupUIElements(); | 
					
						
							|  |  |  |         this.SetupMap() | 
					
						
							| 
									
										
										
										
											2022-01-14 02:40:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-08 17:59:14 +02:00
										 |  |  |         if (this.state.layoutToUse.customCss !== undefined && window.location.pathname.indexOf("index") >= 0) { | 
					
						
							|  |  |  |             Utils.LoadCustomCss(this.state.layoutToUse.customCss) | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-04-08 17:59:14 +02:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     public setupClickDialogOnMap(filterViewIsOpened: UIEventSource<boolean>, state: FeaturePipelineState) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |         const hasPresets = state.layoutToUse.layers.some(layer => layer.presets.length > 0); | 
					
						
							| 
									
										
										
										
											2022-01-14 02:40:55 +01:00
										 |  |  |         const noteLayer: FilteredLayer = state.filteredLayers.data.filter(l => l.layerDef.id === "note")[0] | 
					
						
							|  |  |  |         let addNewNoteDialog: (isShown: UIEventSource<boolean>) => BaseUIElement = undefined; | 
					
						
							|  |  |  |         if (noteLayer !== undefined) { | 
					
						
							|  |  |  |             addNewNoteDialog = (isShown) => new NewNoteUi(noteLayer, isShown, state) | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-14 02:40:55 +01:00
										 |  |  |         function setup() { | 
					
						
							|  |  |  |             if (!hasPresets && addNewNoteDialog === undefined) { | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |                 return; // nothing to do
 | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             const newPointDialogIsShown = new UIEventSource<boolean>(false); | 
					
						
							|  |  |  |             const addNewPoint = new ScrollableFullScreen( | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |                 () => hasPresets ? Translations.t.general.add.title : Translations.t.notes.createNoteTitle, | 
					
						
							| 
									
										
										
										
											2022-02-09 00:35:59 +01:00
										 |  |  |                 ({resetScrollSignal}) => { | 
					
						
							| 
									
										
										
										
											2022-01-14 02:40:55 +01:00
										 |  |  |                     let addNew = undefined; | 
					
						
							|  |  |  |                     if (hasPresets) { | 
					
						
							| 
									
										
										
										
											2022-02-09 00:35:59 +01:00
										 |  |  |                         addNew = new SimpleAddUI(newPointDialogIsShown, resetScrollSignal, filterViewIsOpened, state); | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |                     } | 
					
						
							|  |  |  |                     let addNote = undefined; | 
					
						
							| 
									
										
										
										
											2022-01-14 02:40:55 +01:00
										 |  |  |                     if (noteLayer !== undefined) { | 
					
						
							|  |  |  |                         addNote = addNewNoteDialog(newPointDialogIsShown) | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |                     } | 
					
						
							|  |  |  |                     return new Combine([addNew, addNote]).SetClass("flex flex-col font-lg text-lg") | 
					
						
							|  |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                 "new", | 
					
						
							|  |  |  |                 newPointDialogIsShown | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2022-01-14 02:40:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             addNewPoint.isShown.addCallback((isShown) => { | 
					
						
							|  |  |  |                 if (!isShown) { | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |                     // Clear the 'last-click'-location when the dialog is closed - this causes the popup and the marker to be removed
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |                     state.LastClickLocation.setData(undefined); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-14 02:40:55 +01:00
										 |  |  |             let noteMarker = undefined; | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |             if (!hasPresets && addNewNoteDialog !== undefined) { | 
					
						
							| 
									
										
										
										
											2022-01-14 02:40:55 +01:00
										 |  |  |                 noteMarker = new Combine( | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |                     [Svg.note_svg().SetClass("absolute bottom-0").SetStyle("height: 40px"), | 
					
						
							| 
									
										
										
										
											2022-01-14 02:40:55 +01:00
										 |  |  |                         Svg.addSmall_svg().SetClass("absolute w-6 animate-pulse") | 
					
						
							|  |  |  |                             .SetStyle("right: 10px; bottom: -8px;") | 
					
						
							|  |  |  |                     ]) | 
					
						
							|  |  |  |                     .SetClass("block relative h-full") | 
					
						
							|  |  |  |                     .SetStyle("left: calc( 50% - 15px )") // This is a bit hacky, yes I know!
 | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             new StrayClickHandler( | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |                 state, | 
					
						
							|  |  |  |                 addNewPoint, | 
					
						
							| 
									
										
										
										
											2022-01-14 02:40:55 +01:00
										 |  |  |                 hasPresets ? new AddNewMarker(state.filteredLayers) : noteMarker | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-14 02:40:55 +01:00
										 |  |  |         if (noteLayer !== undefined) { | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |             setup() | 
					
						
							| 
									
										
										
										
											2022-01-14 02:40:55 +01:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |             state.featureSwitchAddNew.addCallbackAndRunD(addNewAllowed => { | 
					
						
							|  |  |  |                 if (addNewAllowed) { | 
					
						
							|  |  |  |                     setup() | 
					
						
							|  |  |  |                     return true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private SetupMap() { | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  |         const state = this.state; | 
					
						
							| 
									
										
										
										
											2022-04-08 17:59:14 +02:00
										 |  |  |         const guiState = this.guiState; | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |         // Attach the map
 | 
					
						
							|  |  |  |         state.mainMapObject.SetClass("w-full h-full") | 
					
						
							|  |  |  |             .AttachTo("leafletDiv") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-15 14:52:11 +02:00
										 |  |  |         this.setupClickDialogOnMap( | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |             guiState.filterViewIsOpened, | 
					
						
							| 
									
										
										
										
											2021-10-15 14:52:11 +02:00
										 |  |  |             state | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  |         new ShowDataLayer({ | 
					
						
							|  |  |  |             leafletMap: state.leafletMap, | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  |             layerToShow: new LayerConfig(home_location_json, "all_known_layers", true), | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  |             features: state.homeLocation, | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |             state | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         state.leafletMap.addCallbackAndRunD(_ => { | 
					
						
							|  |  |  |             // Lets assume that all showDataLayers are initialized at this point
 | 
					
						
							|  |  |  |             state.selectedElement.ping() | 
					
						
							|  |  |  |             State.state.locationControl.ping(); | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     private SetupUIElements() { | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  |         const state = this.state; | 
					
						
							| 
									
										
										
										
											2022-04-08 17:59:14 +02:00
										 |  |  |         const guiState = this.guiState; | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         const self = this | 
					
						
							| 
									
										
										
										
											2022-02-14 04:56:34 +01:00
										 |  |  |         new Combine([ | 
					
						
							|  |  |  |             Toggle.If(state.featureSwitchUserbadge, | 
					
						
							|  |  |  |                 () => new UserBadge(state) | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             Toggle.If(state.featureSwitchExtraLinkEnabled, | 
					
						
							| 
									
										
										
										
											2022-03-10 23:59:18 +01:00
										 |  |  |                 () => new ExtraLinkButton(state, state.layoutToUse.extraLink) | 
					
						
							| 
									
										
										
										
											2022-02-14 04:56:34 +01:00
										 |  |  |             ) | 
					
						
							|  |  |  |         ]).SetClass("flex flex-col") | 
					
						
							|  |  |  |             .AttachTo("userbadge") | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-10 23:18:40 +01:00
										 |  |  |         new Combine([ | 
					
						
							| 
									
										
										
										
											2022-03-10 23:59:18 +01:00
										 |  |  |             new ExtraLinkButton(state, {...state.layoutToUse.extraLink, newTab: true, requirements: new Set<"iframe" | "no-iframe" | "welcome-message" | "no-welcome-message">( ) }) | 
					
						
							| 
									
										
										
										
											2022-03-10 23:18:40 +01:00
										 |  |  |         ]).SetClass("flex items-center justify-center normal-background h-full") | 
					
						
							|  |  |  |             .AttachTo("on-small-screen") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |         Toggle.If(state.featureSwitchSearch, | 
					
						
							|  |  |  |             () => new SearchAndGo(state)) | 
					
						
							|  |  |  |             .AttachTo("searchbox"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-14 04:56:34 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         Toggle.If( | 
					
						
							|  |  |  |             state.featureSwitchWelcomeMessage, | 
					
						
							|  |  |  |             () => self.InitWelcomeMessage() | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-02-14 04:48:33 +01:00
										 |  |  |             .AttachTo("messagesbox"); | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         new LeftControls(state, guiState).AttachTo("bottom-left"); | 
					
						
							|  |  |  |         new RightControls(state).AttachTo("bottom-right"); | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |         new CenterMessageBox(state).AttachTo("centermessage"); | 
					
						
							|  |  |  |         document | 
					
						
							|  |  |  |             .getElementById("centermessage") | 
					
						
							|  |  |  |             .classList.add("pointer-events-none"); | 
					
						
							| 
									
										
										
										
											2021-10-23 02:46:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // We have to ping the welcomeMessageIsOpened and other isOpened-stuff to activate the FullScreenMessage if needed
 | 
					
						
							|  |  |  |         for (const state of guiState.allFullScreenStates) { | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             if (state.data) { | 
					
						
							| 
									
										
										
										
											2021-10-23 02:46:37 +02:00
										 |  |  |                 state.ping() | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * At last, if the map moves or an element is selected, we close all the panels just as well | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         state.selectedElement.addCallbackAndRunD((_) => { | 
					
						
							|  |  |  |             guiState.allFullScreenStates.forEach(s => s.setData(false)) | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     private InitWelcomeMessage(): BaseUIElement { | 
					
						
							| 
									
										
										
										
											2022-04-08 17:59:14 +02:00
										 |  |  |         const isOpened = this.guiState.welcomeMessageIsOpened | 
					
						
							|  |  |  |         const fullOptions = new FullWelcomePaneWithTabs(isOpened, this.guiState.welcomeMessageOpenedTab, this.state); | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // ?-Button on Desktop, opens panel with close-X.
 | 
					
						
							|  |  |  |         const help = new MapControlButton(Svg.help_svg()); | 
					
						
							|  |  |  |         help.onClick(() => isOpened.setData(true)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const openedTime = new Date().getTime(); | 
					
						
							|  |  |  |         this.state.locationControl.addCallback(() => { | 
					
						
							|  |  |  |             if (new Date().getTime() - openedTime < 15 * 1000) { | 
					
						
							|  |  |  |                 // Don't autoclose the first 15 secs when the map is moving
 | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             isOpened.setData(false); | 
					
						
							| 
									
										
										
										
											2021-11-24 18:04:10 +01:00
										 |  |  |             return true; // Unregister this caller - we only autoclose once
 | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         this.state.selectedElement.addCallbackAndRunD((_) => { | 
					
						
							|  |  |  |             isOpened.setData(false); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return new Toggle( | 
					
						
							|  |  |  |             fullOptions.SetClass("welcomeMessage pointer-events-auto"), | 
					
						
							|  |  |  |             help.SetClass("pointer-events-auto"), | 
					
						
							|  |  |  |             isOpened | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |