| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | import FeaturePipelineState from "../Logic/State/FeaturePipelineState" | 
					
						
							|  |  |  | import State from "../State" | 
					
						
							| 
									
										
										
										
											2022-12-16 13:44:25 +01:00
										 |  |  | import { Utils } from "../Utils" | 
					
						
							|  |  |  | import { UIEventSource } from "../Logic/UIEventSource" | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | import FullWelcomePaneWithTabs from "./BigComponents/FullWelcomePaneWithTabs" | 
					
						
							|  |  |  | import MapControlButton from "./MapControlButton" | 
					
						
							|  |  |  | import Svg from "../Svg" | 
					
						
							|  |  |  | import Toggle from "./Input/Toggle" | 
					
						
							|  |  |  | 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" | 
					
						
							| 
									
										
										
										
											2022-12-16 13:44:25 +01:00
										 |  |  | import { DefaultGuiState } from "./DefaultGuiState" | 
					
						
							| 
									
										
										
										
											2021-12-21 18:35:31 +01:00
										 |  |  | import LayerConfig from "../Models/ThemeConfig/LayerConfig" | 
					
						
							| 
									
										
										
										
											2023-02-08 01:14:21 +01:00
										 |  |  | import 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" | 
					
						
							| 
									
										
										
										
											2022-12-16 13:44:25 +01:00
										 |  |  | import { VariableUiElement } from "./Base/VariableUIElement" | 
					
						
							|  |  |  | import Img from "./Base/Img" | 
					
						
							|  |  |  | import UserInformationPanel from "./BigComponents/UserInformation" | 
					
						
							|  |  |  | import { LoginToggle } from "./Popup/LoginButton" | 
					
						
							|  |  |  | import { FixedUiElement } from "./Base/FixedUiElement" | 
					
						
							| 
									
										
										
										
											2022-12-22 04:13:52 +01:00
										 |  |  | import GeoLocationHandler from "../Logic/Actors/GeoLocationHandler" | 
					
						
							|  |  |  | import { GeoLocationState } from "../Logic/State/GeoLocationState" | 
					
						
							| 
									
										
										
										
											2022-12-24 03:44:21 +01:00
										 |  |  | import Hotkeys from "./Base/Hotkeys" | 
					
						
							|  |  |  | import AvailableBaseLayers from "../Logic/Actors/AvailableBaseLayers" | 
					
						
							| 
									
										
										
										
											2023-02-06 22:43:34 +01:00
										 |  |  | import CopyrightPanel from "./BigComponents/CopyrightPanel" | 
					
						
							| 
									
										
										
										
											2023-02-02 17:57:07 +01:00
										 |  |  | import SvelteUIElement from "./Base/SvelteUIElement" | 
					
						
							|  |  |  | import CommunityIndexView from "./BigComponents/CommunityIndexView.svelte" | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2022-12-08 02:56:49 +01:00
										 |  |  |  * The default MapComplete GUI initializer | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2022-12-08 02:56:49 +01:00
										 |  |  |  * Adds a welcome pane, control buttons, ... etc to index.html | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |  */ | 
					
						
							|  |  |  | 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 | 
					
						
							| 
									
										
										
										
											2022-12-22 04:13:52 +01:00
										 |  |  |     private readonly geolocationHandler: GeoLocationHandler | undefined | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     constructor(state: FeaturePipelineState, guiState: DefaultGuiState) { | 
					
						
							|  |  |  |         this.state = state | 
					
						
							| 
									
										
										
										
											2022-04-08 17:59:14 +02:00
										 |  |  |         this.guiState = guiState | 
					
						
							| 
									
										
										
										
											2022-12-22 04:13:52 +01:00
										 |  |  |         if (this.state.featureSwitchGeolocation.data) { | 
					
						
							|  |  |  |             this.geolocationHandler = new GeoLocationHandler(new GeoLocationState(), state) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-04-08 17:59:14 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public setup() { | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  |         this.SetupUIElements() | 
					
						
							|  |  |  |         this.SetupMap() | 
					
						
							| 
									
										
										
										
											2023-01-06 03:46:10 +01:00
										 |  |  |         ScrollableFullScreen.ActivateCurrent() | 
					
						
							| 
									
										
										
										
											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
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-24 03:44:21 +01:00
										 |  |  |         Hotkeys.RegisterHotkey( | 
					
						
							|  |  |  |             { shift: "O" }, | 
					
						
							| 
									
										
										
										
											2022-12-28 00:37:48 +01:00
										 |  |  |             Translations.t.hotkeyDocumentation.selectMapnik, | 
					
						
							| 
									
										
										
										
											2022-12-24 03:44:21 +01:00
										 |  |  |             () => { | 
					
						
							|  |  |  |                 this.state.backgroundLayer.setData(AvailableBaseLayers.osmCarto) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-02 02:59:34 +02:00
										 |  |  |         Utils.downloadJson("./service-worker-version") | 
					
						
							|  |  |  |             .then((data) => console.log("Service worker", data)) | 
					
						
							| 
									
										
										
										
											2022-12-08 02:56:49 +01:00
										 |  |  |             .catch((_) => console.log("Service worker not active")) | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public setupClickDialogOnMap( | 
					
						
							|  |  |  |         filterViewIsOpened: UIEventSource<boolean>, | 
					
						
							|  |  |  |         state: FeaturePipelineState | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |     ) { | 
					
						
							| 
									
										
										
										
											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-09-08 21:40:48 +02:00
										 |  |  |                         ) | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-24 03:44:21 +01:00
										 |  |  |             StrayClickHandler.construct( | 
					
						
							| 
									
										
										
										
											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-12-16 13:44:25 +01:00
										 |  |  |             state.LastClickLocation.addCallbackAndRunD((_) => { | 
					
						
							| 
									
										
										
										
											2022-12-09 13:58:41 +01:00
										 |  |  |                 ScrollableFullScreen.collapse() | 
					
						
							|  |  |  |             }) | 
					
						
							| 
									
										
										
										
											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() { | 
					
						
							| 
									
										
										
										
											2022-12-24 03:44:21 +01:00
										 |  |  |         if (Utils.runningFromConsole) { | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											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-11-07 16:34:51 +01:00
										 |  |  |         this.setupClickDialogOnMap(guiState.filterViewIsOpened, state) | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  |         new ShowDataLayer({ | 
					
						
							|  |  |  |             leafletMap: state.leafletMap, | 
					
						
							| 
									
										
										
										
											2022-07-13 17:58:01 +02:00
										 |  |  |             layerToShow: new LayerConfig(home_location_json, "home_location", 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
										 |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-09 13:58:41 +01:00
										 |  |  |         const selectedElement: FilteredLayer = state.filteredLayers.data.filter( | 
					
						
							|  |  |  |             (l) => l.layerDef.id === "selected_element" | 
					
						
							|  |  |  |         )[0] | 
					
						
							|  |  |  |         new ShowDataLayer({ | 
					
						
							|  |  |  |             leafletMap: state.leafletMap, | 
					
						
							|  |  |  |             layerToShow: selectedElement.layerDef, | 
					
						
							|  |  |  |             features: state.selectedElementsLayer, | 
					
						
							| 
									
										
										
										
											2022-12-16 13:44:25 +01:00
										 |  |  |             state, | 
					
						
							| 
									
										
										
										
											2022-12-09 13:58:41 +01:00
										 |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-12-13 03:46:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-06 03:46:10 +01:00
										 |  |  |         const userInfoMapControl = Toggle.If(state.featureSwitchUserbadge, () => { | 
					
						
							|  |  |  |             new UserInformationPanel(state, { | 
					
						
							|  |  |  |                 isOpened: guiState.userInfoIsOpened, | 
					
						
							| 
									
										
										
										
											2023-01-13 02:48:48 +01:00
										 |  |  |                 userInfoFocusedQuestion: guiState.userInfoFocusedQuestion, | 
					
						
							| 
									
										
										
										
											2023-01-06 03:46:10 +01:00
										 |  |  |             }) | 
					
						
							| 
									
										
										
										
											2022-12-13 03:46:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-06 03:46:10 +01:00
										 |  |  |             const mapControl = new MapControlButton( | 
					
						
							|  |  |  |                 new VariableUiElement( | 
					
						
							|  |  |  |                     state.osmConnection.userDetails.map((ud) => { | 
					
						
							|  |  |  |                         if (ud?.img === undefined) { | 
					
						
							|  |  |  |                             return Svg.person_ui().SetClass("mt-1 block") | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         return new Img(ud?.img) | 
					
						
							|  |  |  |                     }) | 
					
						
							|  |  |  |                 ).SetClass("block rounded-full overflow-hidden"), | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     dontStyle: true, | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ).onClick(() => { | 
					
						
							|  |  |  |                 self.guiState.userInfoIsOpened.setData(true) | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return new LoginToggle(mapControl, Translations.t.general.loginWithOpenStreetMap, state) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         const extraLink = Toggle.If( | 
					
						
							|  |  |  |             state.featureSwitchExtraLinkEnabled, | 
					
						
							|  |  |  |             () => new ExtraLinkButton(state, state.layoutToUse.extraLink) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const welcomeMessageMapControl = Toggle.If(state.featureSwitchWelcomeMessage, () => | 
					
						
							|  |  |  |             self.InitWelcomeMessage() | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2023-02-02 17:57:07 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const communityIndex = Toggle.If(state.featureSwitchCommunityIndex, () => { | 
					
						
							|  |  |  |             const communityIndexControl = new MapControlButton(Svg.community_svg()) | 
					
						
							|  |  |  |             const communityIndex = new ScrollableFullScreen( | 
					
						
							|  |  |  |                 () => Translations.t.communityIndex.title, | 
					
						
							|  |  |  |                 () => new SvelteUIElement(CommunityIndexView, { ...state }), | 
					
						
							|  |  |  |                 "community_index" | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             communityIndexControl.onClick(() => { | 
					
						
							|  |  |  |                 communityIndex.Activate() | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             return communityIndexControl | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-06 03:46:10 +01:00
										 |  |  |         const testingBadge = Toggle.If(state.featureSwitchIsTesting, () => | 
					
						
							|  |  |  |             new FixedUiElement("TESTING").SetClass("alert m-2 border-2 border-black") | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2023-02-06 22:43:34 +01:00
										 |  |  |         new ScrollableFullScreen( | 
					
						
							|  |  |  |             () => Translations.t.general.attribution.attributionTitle, | 
					
						
							|  |  |  |             () => new CopyrightPanel(state), | 
					
						
							|  |  |  |             "copyright", | 
					
						
							|  |  |  |             guiState.copyrightViewIsOpened | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         const copyright = new MapControlButton(Svg.copyright_svg()).onClick(() => | 
					
						
							|  |  |  |             guiState.copyrightViewIsOpened.setData(true) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         new Combine([ | 
					
						
							|  |  |  |             welcomeMessageMapControl, | 
					
						
							|  |  |  |             userInfoMapControl, | 
					
						
							|  |  |  |             copyright, | 
					
						
							| 
									
										
										
										
											2023-02-02 17:57:07 +01:00
										 |  |  |             communityIndex, | 
					
						
							| 
									
										
										
										
											2023-02-06 22:43:34 +01:00
										 |  |  |             extraLink, | 
					
						
							|  |  |  |             testingBadge, | 
					
						
							|  |  |  |         ]) | 
					
						
							| 
									
										
										
										
											2022-02-14 04:56:34 +01:00
										 |  |  |             .SetClass("flex flex-col") | 
					
						
							| 
									
										
										
										
											2022-12-13 03:46:53 +01:00
										 |  |  |             .AttachTo("top-left") | 
					
						
							| 
									
										
										
										
											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") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-22 04:13:52 +01:00
										 |  |  |         new Combine([ | 
					
						
							| 
									
										
										
										
											2022-12-24 02:01:58 +01:00
										 |  |  |             Toggle.If(state.featureSwitchSearch, () => { | 
					
						
							|  |  |  |                 const search = new SearchAndGo(state).SetClass( | 
					
						
							| 
									
										
										
										
											2022-12-22 04:13:52 +01:00
										 |  |  |                     "shadow rounded-full h-min w-full overflow-hidden sm:max-w-sm pointer-events-auto" | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2022-12-24 03:44:21 +01:00
										 |  |  |                 Hotkeys.RegisterHotkey( | 
					
						
							|  |  |  |                     { ctrl: "F" }, | 
					
						
							| 
									
										
										
										
											2022-12-28 00:37:48 +01:00
										 |  |  |                     Translations.t.hotkeyDocumentation.selectSearch, | 
					
						
							| 
									
										
										
										
											2022-12-24 03:44:21 +01:00
										 |  |  |                     () => { | 
					
						
							| 
									
										
										
										
											2022-12-24 02:01:58 +01:00
										 |  |  |                         search.focus() | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2022-12-24 03:44:21 +01:00
										 |  |  |                 ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-24 02:01:58 +01:00
										 |  |  |                 return search | 
					
						
							|  |  |  |             }), | 
					
						
							| 
									
										
										
										
											2022-12-22 04:13:52 +01:00
										 |  |  |         ]).AttachTo("top-right") | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         new LeftControls(state, guiState).AttachTo("bottom-left") | 
					
						
							| 
									
										
										
										
											2022-12-22 04:13:52 +01:00
										 |  |  |         new RightControls(state, this.geolocationHandler).AttachTo("bottom-right") | 
					
						
							| 
									
										
										
										
											2021-10-20 01:13:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |         new CenterMessageBox(state).AttachTo("centermessage") | 
					
						
							| 
									
										
										
										
											2022-12-24 03:44:21 +01:00
										 |  |  |         document?.getElementById("centermessage")?.classList?.add("pointer-events-none") | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2023-01-03 02:24:03 +01:00
										 |  |  |         new FullWelcomePaneWithTabs( | 
					
						
							|  |  |  |             isOpened, | 
					
						
							|  |  |  |             this.guiState.welcomeMessageOpenedTab, | 
					
						
							|  |  |  |             this.state, | 
					
						
							|  |  |  |             this.guiState | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-16 13:44:25 +01:00
										 |  |  |         return help.SetClass("pointer-events-auto") | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } |