| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  | import {UIElement} from "./UIElement"; | 
					
						
							| 
									
										
										
										
											2020-08-30 01:13:18 +02:00
										 |  |  | import {Tag, TagUtils} from "../Logic/Tags"; | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  | import {FilteredLayer} from "../Logic/FilteredLayer"; | 
					
						
							| 
									
										
										
										
											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"; | 
					
						
							| 
									
										
										
										
											2020-07-29 21:50:19 +02:00
										 |  |  | import Locale from "./i18n/Locale"; | 
					
						
							| 
									
										
										
										
											2020-07-31 01:45:54 +02:00
										 |  |  | import {State} from "../State"; | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-17 17:23:15 +02:00
										 |  |  | import {UIEventSource} from "../Logic/UIEventSource"; | 
					
						
							| 
									
										
										
										
											2020-08-27 00:08:00 +02:00
										 |  |  | import {Utils} from "../Utils"; | 
					
						
							| 
									
										
										
										
											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 { | 
					
						
							| 
									
										
										
										
											2020-08-31 13:28:21 +02:00
										 |  |  |     private readonly _addButtons: UIElement[]; | 
					
						
							| 
									
										
										
										
											2020-07-31 01:45:54 +02:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2020-07-31 18:38:14 +02:00
										 |  |  |     private _loginButton : UIElement; | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |     private _confirmPreset: UIEventSource<{ | 
					
						
							|  |  |  |         description: string | UIElement, | 
					
						
							|  |  |  |         name: string | UIElement, | 
					
						
							|  |  |  |         icon: string, | 
					
						
							|  |  |  |         tags: Tag[], | 
					
						
							|  |  |  |         layerToAddTo: FilteredLayer | 
					
						
							|  |  |  |     }> | 
					
						
							|  |  |  |         = new UIEventSource(undefined); | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |     private confirmButton: UIElement = undefined; | 
					
						
							| 
									
										
										
										
											2020-09-17 23:53:57 +02:00
										 |  |  |     private openLayerControl: UIElement; | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |     private cancelButton: UIElement; | 
					
						
							| 
									
										
										
										
											2020-07-29 21:48:41 +02:00
										 |  |  |     private goToInboxButton: UIElement = new SubtleButton("./assets/envelope.svg",  | 
					
						
							| 
									
										
										
										
											2020-07-29 21:32:51 +02:00
										 |  |  |         Translations.t.general.goToInbox, {url:"https://www.openstreetmap.org/messages/inbox", newTab: false}); | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |     constructor() { | 
					
						
							| 
									
										
										
										
											2020-07-31 01:45:54 +02:00
										 |  |  |         super(State.state.locationControl); | 
					
						
							| 
									
										
										
										
											2020-07-29 21:50:19 +02:00
										 |  |  |         this.ListenTo(Locale.language); | 
					
						
							| 
									
										
										
										
											2020-07-31 01:45:54 +02:00
										 |  |  |         this.ListenTo(State.state.osmConnection.userDetails); | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |         this.ListenTo(State.state.layerUpdater.runningQuery); | 
					
						
							| 
									
										
										
										
											2020-07-31 18:38:14 +02:00
										 |  |  |         this.ListenTo(this._confirmPreset); | 
					
						
							| 
									
										
										
										
											2020-09-05 17:43:30 +02:00
										 |  |  |         this.ListenTo(State.state.locationControl); | 
					
						
							| 
									
										
										
										
											2020-07-31 18:38:14 +02:00
										 |  |  |          | 
					
						
							|  |  |  |         this._loginButton = Translations.t.general.add.pleaseLogin.Clone().onClick(() => State.state.osmConnection.AttemptLogin()); | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |         this._addButtons = []; | 
					
						
							| 
									
										
										
										
											2020-09-14 20:16:03 +02:00
										 |  |  |         this.SetStyle("font-size:large"); | 
					
						
							| 
									
										
										
										
											2020-07-31 18:38:14 +02:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |         const self = this; | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |         for (const layer of State.state.filteredLayers.data) { | 
					
						
							| 
									
										
										
										
											2020-09-17 21:10:35 +02:00
										 |  |  |              | 
					
						
							|  |  |  |             this.ListenTo(layer.isDisplayed); | 
					
						
							|  |  |  |              | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |             for (const preset of layer.layerDef.presets) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-22 02:12:46 +02:00
										 |  |  |                 let icon: string = "./assets/bug.svg"; | 
					
						
							| 
									
										
										
										
											2020-08-22 12:44:11 +02:00
										 |  |  |                 if (preset.icon !== undefined) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     if (typeof (preset.icon) !== "string") { | 
					
						
							| 
									
										
										
										
											2020-08-27 11:11:20 +02:00
										 |  |  |                         const tags = Utils.MergeTags(TagUtils.KVtoProperties(preset.tags), {id:"node/-1"}); | 
					
						
							| 
									
										
										
										
											2020-09-02 11:37:34 +02:00
										 |  |  |                         icon = preset.icon.GetContent(tags).txt; | 
					
						
							| 
									
										
										
										
											2020-09-09 18:42:13 +02:00
										 |  |  |                         if(icon.startsWith("$")){ | 
					
						
							|  |  |  |                             icon = undefined; | 
					
						
							|  |  |  |                         } | 
					
						
							| 
									
										
										
										
											2020-08-22 12:44:11 +02:00
										 |  |  |                     } else { | 
					
						
							|  |  |  |                         icon = preset.icon; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2020-08-22 18:57:27 +02:00
										 |  |  |                 } else { | 
					
						
							|  |  |  |                     console.warn("No icon defined for preset ", preset, "in layer ", layer.layerDef.id) | 
					
						
							| 
									
										
										
										
											2020-08-22 02:12:46 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-22 18:57:27 +02:00
										 |  |  |                 const csCount = State.state.osmConnection.userDetails.data.csCount; | 
					
						
							|  |  |  |                 let tagInfo = ""; | 
					
						
							|  |  |  |                 if (csCount > State.userJourney.tagsVisibleAt) { | 
					
						
							| 
									
										
										
										
											2020-08-30 01:13:18 +02:00
										 |  |  |                     tagInfo = preset.tags.map(t => t.asHumanString(false, true)).join("&"); | 
					
						
							| 
									
										
										
										
											2020-08-22 18:57:27 +02:00
										 |  |  |                     tagInfo = `<br/><span class='subtle'>${tagInfo}</span>` | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 const button: UIElement = | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |                     new SubtleButton( | 
					
						
							| 
									
										
										
										
											2020-08-22 02:12:46 +02:00
										 |  |  |                         icon, | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |                         new Combine([ | 
					
						
							|  |  |  |                             "<b>", | 
					
						
							|  |  |  |                             preset.title, | 
					
						
							| 
									
										
										
										
											2020-08-22 18:57:27 +02:00
										 |  |  |                             "</b>", | 
					
						
							|  |  |  |                             preset.description !== undefined ? new Combine(["<br/>", preset.description]) : "", | 
					
						
							|  |  |  |                             tagInfo | 
					
						
							|  |  |  |                         ]) | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |                     ).onClick( | 
					
						
							|  |  |  |                         () => { | 
					
						
							| 
									
										
										
										
											2020-08-22 02:12:46 +02:00
										 |  |  |                             self.confirmButton = new SubtleButton(icon, | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |                                 new Combine([ | 
					
						
							| 
									
										
										
										
											2020-08-07 00:45:33 +02:00
										 |  |  |                                     "<b>", | 
					
						
							| 
									
										
										
										
											2020-08-06 23:49:35 +02:00
										 |  |  |                                     Translations.t.general.add.confirmButton.Subs({category: preset.title}), | 
					
						
							| 
									
										
										
										
											2020-08-07 00:45:33 +02:00
										 |  |  |                                     "</b><br/>", | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |                                     preset.description !== undefined ? preset.description : ""])); | 
					
						
							|  |  |  |                             self.confirmButton.onClick(self.CreatePoint(preset.tags, layer)); | 
					
						
							|  |  |  |                             self._confirmPreset.setData({ | 
					
						
							|  |  |  |                                 tags: preset.tags, | 
					
						
							|  |  |  |                                 layerToAddTo: layer, | 
					
						
							|  |  |  |                                 name: preset.title, | 
					
						
							|  |  |  |                                 description: preset.description, | 
					
						
							| 
									
										
										
										
											2020-08-22 02:12:46 +02:00
										 |  |  |                                 icon: icon | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |                             }); | 
					
						
							| 
									
										
										
										
											2020-09-03 03:16:43 +02:00
										 |  |  |                             self.Update(); | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |                         } | 
					
						
							| 
									
										
										
										
											2020-08-22 18:57:27 +02:00
										 |  |  |                     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-22 18:57:27 +02:00
										 |  |  |                 this._addButtons.push(button); | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-09-17 23:53:57 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |         this.cancelButton = new SubtleButton( | 
					
						
							| 
									
										
										
										
											2020-07-29 21:48:41 +02:00
										 |  |  |             "./assets/close.svg", | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |             Translations.t.general.cancel | 
					
						
							|  |  |  |         ).onClick(() => { | 
					
						
							|  |  |  |             self._confirmPreset.setData(undefined); | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2020-09-17 23:53:57 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         this.openLayerControl = new SubtleButton( | 
					
						
							|  |  |  |             "./assets/layers.svg", | 
					
						
							|  |  |  |             Translations.t.general.add.openLayerControl | 
					
						
							|  |  |  |         ).onClick(() => { | 
					
						
							|  |  |  |             State.state.layerControlIsOpened.setData(true); | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |     private CreatePoint(tags: Tag[], layerToAddTo: FilteredLayer) { | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |         return () => { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-31 04:58:58 +02:00
										 |  |  |             const loc = State.state.bm.LastClickLocation.data; | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |             let feature = State.state.changes.createElement(tags, loc.lat, loc.lon); | 
					
						
							|  |  |  |             layerToAddTo.AddNewElement(feature); | 
					
						
							| 
									
										
										
										
											2020-07-31 01:45:54 +02:00
										 |  |  |             State.state.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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-31 01:45:54 +02:00
										 |  |  |         const userDetails = State.state.osmConnection.userDetails; | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (this._confirmPreset.data !== undefined) { | 
					
						
							| 
									
										
										
										
											2020-09-17 21:10:35 +02:00
										 |  |  |              | 
					
						
							|  |  |  |             if(!this._confirmPreset.data.layerToAddTo.isDisplayed.data){ | 
					
						
							|  |  |  |                 return new Combine([ | 
					
						
							|  |  |  |                     Translations.t.general.add.layerNotEnabled.Subs({layer: this._confirmPreset.data.layerToAddTo.layerDef.name}) | 
					
						
							|  |  |  |                         .SetClass("alert"), | 
					
						
							| 
									
										
										
										
											2020-09-18 00:31:54 +02:00
										 |  |  |                     this.openLayerControl, | 
					
						
							| 
									
										
										
										
											2020-09-17 21:10:35 +02:00
										 |  |  |                      | 
					
						
							|  |  |  |                     this.cancelButton | 
					
						
							|  |  |  |                 ]).Render(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-22 18:57:27 +02:00
										 |  |  |             let tagInfo = ""; | 
					
						
							|  |  |  |             const csCount = State.state.osmConnection.userDetails.data.csCount; | 
					
						
							|  |  |  |             if (csCount > State.userJourney.tagsVisibleAt) { | 
					
						
							| 
									
										
										
										
											2020-08-30 01:13:18 +02:00
										 |  |  |                 tagInfo = this._confirmPreset.data .tags.map(t => t.asHumanString(csCount > State.userJourney.tagsVisibleAndWikiLinked, true)).join("&"); | 
					
						
							| 
									
										
										
										
											2020-08-22 18:57:27 +02:00
										 |  |  |                 tagInfo = `<br/>More information about the preset: ${tagInfo}` | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-09-14 20:16:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |             return new Combine([ | 
					
						
							|  |  |  |                 Translations.t.general.add.confirmIntro.Subs({title: this._confirmPreset.data.name}), | 
					
						
							| 
									
										
										
										
											2020-09-14 20:16:03 +02:00
										 |  |  |                 userDetails.data.dryRun ? "<span class='alert'>TESTING - changes won't be saved</span>" : "", | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |                 this.confirmButton, | 
					
						
							| 
									
										
										
										
											2020-08-22 18:57:27 +02:00
										 |  |  |                 this.cancelButton, | 
					
						
							|  |  |  |                 tagInfo | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             ]).Render(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let header: UIElement = Translations.t.general.add.header; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 13:13:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (userDetails === undefined) { | 
					
						
							| 
									
										
										
										
											2020-07-30 00:59:08 +02:00
										 |  |  |             return header.Render(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-09-17 13:13:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-31 01:45:54 +02:00
										 |  |  |         if (!userDetails.data.loggedIn) { | 
					
						
							| 
									
										
										
										
											2020-07-31 18:38:14 +02:00
										 |  |  |             return new Combine([header, this._loginButton]).Render() | 
					
						
							| 
									
										
										
										
											2020-07-15 13:15:36 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 13:13:02 +02:00
										 |  |  |         if (userDetails.data.unreadMessages > 0 && userDetails.data.csCount < State.userJourney.addNewPointWithUnreadMessagesUnlock) { | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |             return new Combine([header, "<span class='alert'>", | 
					
						
							|  |  |  |                 Translations.t.general.readYourMessages, | 
					
						
							| 
									
										
										
										
											2020-07-29 19:02:36 +02:00
										 |  |  |                 "</span>", | 
					
						
							|  |  |  |                 this.goToInboxButton | 
					
						
							|  |  |  |             ]).Render(); | 
					
						
							| 
									
										
										
										
											2020-09-17 13:13:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-31 01:45:54 +02:00
										 |  |  |         if (userDetails.data.dryRun) { | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |             header = new Combine([header, | 
					
						
							|  |  |  |                 "<span class='alert'>", | 
					
						
							|  |  |  |                 "Test mode - changes won't be saved", | 
					
						
							|  |  |  |                 "</span>" | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 13:13:02 +02:00
										 |  |  |         if (userDetails.data.csCount < State.userJourney.addNewPointsUnlock) { | 
					
						
							| 
									
										
										
										
											2020-07-29 18:35:46 +02:00
										 |  |  |             return new Combine([header, "<span class='alert'>", | 
					
						
							|  |  |  |                 Translations.t.general.fewChangesBefore, | 
					
						
							|  |  |  |                 "</span>"]).Render(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 21:00:37 +02:00
										 |  |  |         if (State.state.locationControl.data.zoom < State.userJourney.minZoomLevelToAddNewPoints) { | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-31 16:17:16 +02:00
										 |  |  |         if (State.state.layerUpdater.runningQuery.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-09-02 11:37:34 +02:00
										 |  |  |         return header.Render() + new Combine(this._addButtons).SetClass("add-popup-all-buttons").Render(); | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |