| 
									
										
										
										
											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-07-29 18:35:46 +02:00
										 |  |  | import {SubtleButton} from "./Base/SubtleButton"; | 
					
						
							|  |  |  | import {VerticalCombine} from "./Base/VerticalCombine"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | interface Preset { | 
					
						
							|  |  |  |     description: string | UIElement, | 
					
						
							|  |  |  |     name: string | UIElement, | 
					
						
							|  |  |  |     icon: string, | 
					
						
							|  |  |  |     tags: Tag[], | 
					
						
							|  |  |  |     layerToAddTo: FilteredLayer | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											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-29 18:35:46 +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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |     private _confirmPreset: UIEventSource<Preset> | 
					
						
							|  |  |  |         = new UIEventSource<Preset>(undefined); | 
					
						
							|  |  |  |     private confirmButton: UIElement = undefined; | 
					
						
							|  |  |  |     private cancelButton: UIElement; | 
					
						
							| 
									
										
										
										
											2020-07-29 19:02:36 +02:00
										 |  |  |     private goToInboxButton: UIElement = new SubtleButton("/assets/envelope.svg",  | 
					
						
							|  |  |  |         Translations.t.general.goToInbox, "https://www.openstreetmap.org/messages/inbox"); | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |     constructor(zoomlevel: UIEventSource<{ zoom: number }>, | 
					
						
							|  |  |  |                 lastClickLocation: UIEventSource<{ lat: number, lon: number }>, | 
					
						
							|  |  |  |                 changes: Changes, | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +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-29 18:35:46 +02:00
										 |  |  |                 addButtons: { description: string | UIElement, name: string | 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 = []; | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |         this.ListenTo(this._confirmPreset); | 
					
						
							|  |  |  |         this.clss = "add-ui" | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |         const self = this; | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |         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-29 18:35:46 +02:00
										 |  |  |                 new SubtleButton( | 
					
						
							|  |  |  |                     option.icon, | 
					
						
							|  |  |  |                     new Combine([ | 
					
						
							|  |  |  |                         "<b>", | 
					
						
							|  |  |  |                         option.name, | 
					
						
							|  |  |  |                         "</b><br/>", | 
					
						
							|  |  |  |                         option.description !== undefined ? option.description : ""]) | 
					
						
							|  |  |  |                 ).onClick( | 
					
						
							|  |  |  |                     () => { | 
					
						
							|  |  |  |                         self.confirmButton = new SubtleButton(option.icon, | 
					
						
							|  |  |  |                             new Combine([ | 
					
						
							|  |  |  |                                 "<b>", | 
					
						
							|  |  |  |                                 option.name, | 
					
						
							|  |  |  |                                 "</b><br/>", | 
					
						
							|  |  |  |                                 option.description !== undefined ? option.description : ""])); | 
					
						
							|  |  |  |                         self.confirmButton.onClick(self.CreatePoint(option)); | 
					
						
							|  |  |  |                         self._confirmPreset.setData(option); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |             this._addButtons.push(button); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |          | 
					
						
							|  |  |  |         this.cancelButton = new SubtleButton( | 
					
						
							|  |  |  |             "/assets/close.svg", | 
					
						
							|  |  |  |             Translations.t.general.cancel | 
					
						
							|  |  |  |         ).onClick(() => { | 
					
						
							|  |  |  |             self._confirmPreset.setData(undefined); | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |     private CreatePoint(option: { 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-29 18:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (this._confirmPreset.data !== undefined) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return new Combine([ | 
					
						
							|  |  |  |                 Translations.t.general.add.confirmIntro.Subs({title: this._confirmPreset.data.name}), | 
					
						
							|  |  |  |                 this._userDetails.data.dryRun ? "<span class='alert'>TESTING - changes won't be saved</span>":"", | 
					
						
							|  |  |  |                 this.confirmButton, | 
					
						
							|  |  |  |                 this.cancelButton | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             ]).Render(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let header: UIElement = 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-07-29 18:35:46 +02:00
										 |  |  |         if (this._userDetails.data.unreadMessages > 0) { | 
					
						
							|  |  |  |             return new Combine([header, "<span class='alert'>", | 
					
						
							|  |  |  |                 Translations.t.general.readYourMessages, | 
					
						
							| 
									
										
										
										
											2020-07-29 19:02:36 +02:00
										 |  |  |                 "</span>", | 
					
						
							|  |  |  |                 this.goToInboxButton | 
					
						
							|  |  |  |             ]).Render(); | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (this._userDetails.data.dryRun) { | 
					
						
							|  |  |  |             header = new Combine([header, | 
					
						
							|  |  |  |                 "<span class='alert'>", | 
					
						
							|  |  |  |                 "Test mode - changes won't be saved", | 
					
						
							|  |  |  |                 "</span>" | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (this._userDetails.data.csCount < 5) { | 
					
						
							|  |  |  |             return new Combine([header, "<span class='alert'>", | 
					
						
							|  |  |  |                 Translations.t.general.fewChangesBefore, | 
					
						
							|  |  |  |                 "</span>"]).Render(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |         var html = ""; | 
					
						
							|  |  |  |         for (const button of this._addButtons) { | 
					
						
							|  |  |  |             html += button.Render(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |