| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | import Combine from "../Base/Combine"; | 
					
						
							|  |  |  | import {OsmConnection} from "../../Logic/Osm/OsmConnection"; | 
					
						
							|  |  |  | import {UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							|  |  |  | import Title from "../Base/Title"; | 
					
						
							|  |  |  | import Toggle from "../Input/Toggle"; | 
					
						
							|  |  |  | import Loading from "../Base/Loading"; | 
					
						
							|  |  |  | import {VariableUiElement} from "../Base/VariableUIElement"; | 
					
						
							|  |  |  | import {FixedUiElement} from "../Base/FixedUiElement"; | 
					
						
							| 
									
										
										
										
											2022-01-24 03:09:21 +01:00
										 |  |  | import {SubtleButton} from "../Base/SubtleButton"; | 
					
						
							|  |  |  | import Svg from "../../Svg"; | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | export class CreateNotes extends Combine { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     constructor(state: { osmConnection: OsmConnection }, v: { features: any[]; wikilink: string; intro: string; source: string, theme: string }) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const createdNotes: UIEventSource<number[]> = new UIEventSource<number[]>([]) | 
					
						
							|  |  |  |         const failed = new UIEventSource<string[]>([]) | 
					
						
							|  |  |  |         const currentNote = createdNotes.map(n => n.length) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (const f of v.features) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const src = f.properties["source"] ?? f.properties["src"] ?? v.source | 
					
						
							|  |  |  |             delete f.properties["source"] | 
					
						
							|  |  |  |             delete f.properties["src"] | 
					
						
							| 
									
										
										
										
											2022-01-25 00:48:05 +01:00
										 |  |  |             let extraNote = "" | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |             if (f.properties["note"]) { | 
					
						
							|  |  |  |                 extraNote = f.properties["note"] + "\n" | 
					
						
							| 
									
										
										
										
											2022-01-25 00:48:05 +01:00
										 |  |  |                 delete f.properties["note"] | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             const tags: string [] = [] | 
					
						
							|  |  |  |             for (const key in f.properties) { | 
					
						
							| 
									
										
										
										
											2022-01-24 03:09:21 +01:00
										 |  |  |                 if (f.properties[key] === "") { | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |                     continue | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 tags.push(key + "=" + f.properties[key].replace(/=/, "\\=").replace(/;/g, "\\;").replace(/\n/g, "\\n")) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             const lat = f.geometry.coordinates[1] | 
					
						
							|  |  |  |             const lon = f.geometry.coordinates[0] | 
					
						
							|  |  |  |             const text = [v.intro, | 
					
						
							| 
									
										
										
										
											2022-01-25 00:48:05 +01:00
										 |  |  |                 extraNote, | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |                 "Source: " + src, | 
					
						
							|  |  |  |                 'More information at ' + v.wikilink, | 
					
						
							|  |  |  |                 '', | 
					
						
							|  |  |  |                 'Import this point easily with', | 
					
						
							|  |  |  |                 `https://mapcomplete.osm.be/${v.theme}.html?z=18&lat=${lat}&lon=${lon}#import`, | 
					
						
							|  |  |  |                 ...tags].join("\n") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             state.osmConnection.openNote( | 
					
						
							|  |  |  |                 lat, lon, text) | 
					
						
							|  |  |  |                 .then(({id}) => { | 
					
						
							|  |  |  |                     createdNotes.data.push(id) | 
					
						
							|  |  |  |                     createdNotes.ping() | 
					
						
							|  |  |  |                 }, err => { | 
					
						
							|  |  |  |                     failed.data.push(err) | 
					
						
							|  |  |  |                     failed.ping() | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         super([ | 
					
						
							|  |  |  |             new Title("Creating notes"), | 
					
						
							|  |  |  |             "Hang on while we are importing...", | 
					
						
							|  |  |  |             new Toggle( | 
					
						
							|  |  |  |                 new Loading(new VariableUiElement(currentNote.map(count => new FixedUiElement("Imported <b>" + count + "</b> out of " + v.features.length + " notes")))), | 
					
						
							| 
									
										
										
										
											2022-01-24 03:09:21 +01:00
										 |  |  |                 new Combine([ | 
					
						
							|  |  |  |                         new FixedUiElement("All done!").SetClass("thanks"), | 
					
						
							|  |  |  |                         new SubtleButton(Svg.note_svg(), "Inspect the progress of your notes in the 'import_viewer'", { | 
					
						
							|  |  |  |                             url: "import_viewer.html" | 
					
						
							|  |  |  |                         }) | 
					
						
							|  |  |  |                     ] | 
					
						
							|  |  |  |                 ), | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |                 currentNote.map(count => count < v.features.length) | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             new VariableUiElement(failed.map(failed => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (failed.length === 0) { | 
					
						
							|  |  |  |                     return undefined | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 return new Combine([ | 
					
						
							|  |  |  |                     new FixedUiElement("Some entries failed").SetClass("alert"), | 
					
						
							|  |  |  |                     ...failed | 
					
						
							|  |  |  |                 ]).SetClass("flex flex-col") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             })) | 
					
						
							|  |  |  |         ]) | 
					
						
							|  |  |  |         this.SetClass("flex flex-col"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |