| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  | import {UIElement} from "./UIElement"; | 
					
						
							|  |  |  | import {UIEventSource} from "./UIEventSource"; | 
					
						
							|  |  |  | import {Tag} from "../Logic/TagsFilter"; | 
					
						
							|  |  |  | import {FilteredLayer} from "../Logic/FilteredLayer"; | 
					
						
							|  |  |  | import {Changes} from "../Logic/Changes"; | 
					
						
							|  |  |  | import {FixedUiElement} from "./Base/FixedUiElement"; | 
					
						
							|  |  |  | import {Button} from "./Base/Button"; | 
					
						
							| 
									
										
										
										
											2020-06-29 16:21:36 +02:00
										 |  |  | import {UserDetails} from "../Logic/OsmConnection"; | 
					
						
							| 
									
										
										
										
											2020-07-24 15:52:21 +02:00
										 |  |  | import Translations from "./i18n/Translations"; | 
					
						
							|  |  |  | import Combine from "./Base/Combine"; | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Asks to add a feature at the last clicked location, at least if zoom is sufficient | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | export class SimpleAddUI extends UIElement { | 
					
						
							|  |  |  |     private _zoomlevel: UIEventSource<{ zoom: number }>; | 
					
						
							|  |  |  |     private _addButtons: UIElement[]; | 
					
						
							|  |  |  |     private _lastClickLocation: UIEventSource<{ lat: number; lon: number }>; | 
					
						
							|  |  |  |     private _changes: Changes; | 
					
						
							| 
									
										
										
										
											2020-07-22 01:07:32 +02:00
										 |  |  |     private _selectedElement: UIEventSource<{feature: any}>; | 
					
						
							| 
									
										
										
										
											2020-06-29 03:40:19 +02:00
										 |  |  |     private _dataIsLoading: UIEventSource<boolean>; | 
					
						
							| 
									
										
										
										
											2020-06-29 16:21:36 +02:00
										 |  |  |     private _userDetails: UIEventSource<UserDetails>; | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     constructor(zoomlevel: UIEventSource<{ zoom: number }>, | 
					
						
							|  |  |  |                 lastClickLocation: UIEventSource<{ lat: number, lon: number }>, | 
					
						
							|  |  |  |                 changes: Changes, | 
					
						
							| 
									
										
										
										
											2020-07-22 01:07:32 +02:00
										 |  |  |                 selectedElement: UIEventSource<{feature: any}>, | 
					
						
							| 
									
										
										
										
											2020-06-29 03:40:19 +02:00
										 |  |  |                 dataIsLoading: UIEventSource<boolean>, | 
					
						
							| 
									
										
										
										
											2020-06-29 16:21:36 +02:00
										 |  |  |                 userDetails: UIEventSource<UserDetails>, | 
					
						
							| 
									
										
										
										
											2020-07-22 00:50:30 +02:00
										 |  |  |                 addButtons: { name: UIElement; icon: string; tags: Tag[]; layerToAddTo: FilteredLayer }[], | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |     ) { | 
					
						
							|  |  |  |         super(zoomlevel); | 
					
						
							|  |  |  |         this._zoomlevel = zoomlevel; | 
					
						
							|  |  |  |         this._lastClickLocation = lastClickLocation; | 
					
						
							|  |  |  |         this._changes = changes; | 
					
						
							|  |  |  |         this._selectedElement = selectedElement; | 
					
						
							| 
									
										
										
										
											2020-06-29 03:40:19 +02:00
										 |  |  |         this._dataIsLoading = dataIsLoading; | 
					
						
							| 
									
										
										
										
											2020-06-29 16:21:36 +02:00
										 |  |  |         this._userDetails = userDetails; | 
					
						
							|  |  |  |         this.ListenTo(userDetails); | 
					
						
							| 
									
										
										
										
											2020-06-29 16:24:42 +02:00
										 |  |  |         this.ListenTo(dataIsLoading); | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |         this._addButtons = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (const option of addButtons) { | 
					
						
							|  |  |  |             // <button type='button'> looks SO retarded
 | 
					
						
							|  |  |  |             // the default type of button is 'submit', which performs a POST and page reload
 | 
					
						
							|  |  |  |             const button = | 
					
						
							| 
									
										
										
										
											2020-07-24 15:52:21 +02:00
										 |  |  |                 new Button(Translations.t.general.add.addNew.Subs({category: option.name}), | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |                     this.CreatePoint(option)); | 
					
						
							|  |  |  |             this._addButtons.push(button); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-22 00:50:30 +02:00
										 |  |  |     private CreatePoint(option: {icon: string; tags: Tag[]; layerToAddTo: FilteredLayer }) { | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |         const self = this; | 
					
						
							|  |  |  |         return () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const loc = self._lastClickLocation.data; | 
					
						
							|  |  |  |             let feature = self._changes.createElement(option.tags, loc.lat, loc.lon); | 
					
						
							|  |  |  |             option.layerToAddTo.AddNewElement(feature); | 
					
						
							| 
									
										
										
										
											2020-07-22 01:07:32 +02:00
										 |  |  |             self._selectedElement.setData({feature: feature}); | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-20 18:24:00 +02:00
										 |  |  |     InnerRender(): string { | 
					
						
							| 
									
										
										
										
											2020-07-24 15:52:21 +02:00
										 |  |  |         const header = Translations.t.general.add.header; | 
					
						
							|  |  |  |              | 
					
						
							| 
									
										
										
										
											2020-07-15 13:15:36 +02:00
										 |  |  |         if (!this._userDetails.data.loggedIn) { | 
					
						
							| 
									
										
										
										
											2020-07-24 15:52:21 +02:00
										 |  |  |             return new Combine([header, Translations.t.general.add.pleaseLogin]).Render() | 
					
						
							| 
									
										
										
										
											2020-07-15 13:15:36 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |         if (this._zoomlevel.data.zoom < 19) { | 
					
						
							| 
									
										
										
										
											2020-07-24 15:52:21 +02:00
										 |  |  |             return new Combine([header, Translations.t.general.add.zoomInFurther]).Render() | 
					
						
							| 
									
										
										
										
											2020-06-29 03:40:19 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-06-29 16:21:36 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (this._dataIsLoading.data) { | 
					
						
							| 
									
										
										
										
											2020-07-24 15:52:21 +02:00
										 |  |  |             return new Combine([header, Translations.t.general.add.stillLoading]).Render() | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         var html = ""; | 
					
						
							|  |  |  |         for (const button of this._addButtons) { | 
					
						
							|  |  |  |             html += button.Render(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-07-24 15:52:21 +02:00
										 |  |  |         return header.Render() + html; | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     InnerUpdate(htmlElement: HTMLElement) { | 
					
						
							| 
									
										
										
										
											2020-06-29 16:21:36 +02:00
										 |  |  |         this._userDetails.data.osmConnection.registerActivateOsmAUthenticationClass(); | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |