| 
									
										
										
										
											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-04-14 03:01:54 +02:00
										 |  |  | import Translations from "../i18n/Translations"; | 
					
						
							| 
									
										
										
										
											2022-04-19 23:42:58 +02:00
										 |  |  | import {Translation} from "../i18n/Translation"; | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | export class CreateNotes extends Combine { | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2022-04-19 23:42:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public static createNoteContentsUi(feature: {properties: any, geometry: {coordinates: [number,number]}}, | 
					
						
							|  |  |  |         options: {wikilink: string; intro: string; source: string, theme: string } | 
					
						
							|  |  |  |     ): (Translation | string)[]{ | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |         const src = feature.properties["source"] ?? feature.properties["src"] ?? options.source | 
					
						
							|  |  |  |         delete feature.properties["source"] | 
					
						
							|  |  |  |         delete feature.properties["src"] | 
					
						
							|  |  |  |         let extraNote = "" | 
					
						
							|  |  |  |         if (feature.properties["note"]) { | 
					
						
							|  |  |  |             extraNote = feature.properties["note"] + "\n" | 
					
						
							|  |  |  |             delete feature.properties["note"] | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |         const tags: string [] = [] | 
					
						
							|  |  |  |         for (const key in feature.properties) { | 
					
						
							|  |  |  |             if (feature.properties[key] === null || feature.properties[key] === undefined) { | 
					
						
							|  |  |  |                 console.warn("Null or undefined key for ", feature.properties) | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (feature.properties[key] === "") { | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             tags.push(key + "=" + (feature.properties[key]+"").replace(/=/, "\\=").replace(/;/g, "\\;").replace(/\n/g, "\\n")) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         const lat = feature.geometry.coordinates[1] | 
					
						
							|  |  |  |         const lon = feature.geometry.coordinates[0] | 
					
						
							|  |  |  |         const note = Translations.t.importHelper.noteParts | 
					
						
							|  |  |  |         return [ | 
					
						
							|  |  |  |             options.intro, | 
					
						
							|  |  |  |             extraNote, | 
					
						
							| 
									
										
										
										
											2022-04-19 23:42:58 +02:00
										 |  |  |             note.datasource.Subs({source: src}), | 
					
						
							|  |  |  |             note.wikilink.Subs(options), | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |             '', | 
					
						
							| 
									
										
										
										
											2022-04-19 23:42:58 +02:00
										 |  |  |             note.importEasily, | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |             `https://mapcomplete.osm.be/${options.theme}.html?z=18&lat=${lat}&lon=${lon}#import`, | 
					
						
							|  |  |  |             ...tags] | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-19 23:42:58 +02:00
										 |  |  |     public static createNoteContents(feature: {properties: any, geometry: {coordinates: [number,number]}}, | 
					
						
							|  |  |  |                                      options: {wikilink: string; intro: string; source: string, theme: string } | 
					
						
							|  |  |  |     ): string[]{ | 
					
						
							|  |  |  |         return CreateNotes.createNoteContentsUi(feature, options).map(trOrStr => { | 
					
						
							|  |  |  |             if(typeof trOrStr === "string"){ | 
					
						
							|  |  |  |                 return trOrStr | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return trOrStr.txt | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |     constructor(state: { osmConnection: OsmConnection }, v: { features: any[]; wikilink: string; intro: string; source: string, theme: string }) { | 
					
						
							|  |  |  |         const t = Translations.t.importHelper.createNotes; | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |         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) { | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |              | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             const lat = f.geometry.coordinates[1] | 
					
						
							|  |  |  |             const lon = f.geometry.coordinates[0] | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |             const text = CreateNotes.createNoteContents(f, v).join("\n") | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             state.osmConnection.openNote( | 
					
						
							|  |  |  |                 lat, lon, text) | 
					
						
							|  |  |  |                 .then(({id}) => { | 
					
						
							|  |  |  |                     createdNotes.data.push(id) | 
					
						
							|  |  |  |                     createdNotes.ping() | 
					
						
							|  |  |  |                 }, err => { | 
					
						
							|  |  |  |                     failed.data.push(err) | 
					
						
							|  |  |  |                     failed.ping() | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         super([ | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |             new Title(t.title), | 
					
						
							|  |  |  |            t.loading           , | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             new Toggle( | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |                 new Loading(new VariableUiElement(currentNote.map(count => t.creating.Subs({ | 
					
						
							|  |  |  |                     count, total: v.features.length | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                      | 
					
						
							|  |  |  |                 )))), | 
					
						
							| 
									
										
										
										
											2022-01-24 03:09:21 +01:00
										 |  |  |                 new Combine([ | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |                     Svg.party_svg().SetClass("w-24"), | 
					
						
							| 
									
										
										
										
											2022-04-19 23:42:58 +02:00
										 |  |  |                     t.done.Subs({count: v.features.length}).SetClass("thanks"), | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |                         new SubtleButton(Svg.note_svg(),  | 
					
						
							|  |  |  |                            t.openImportViewer , { | 
					
						
							| 
									
										
										
										
											2022-01-24 03:09:21 +01:00
										 |  |  |                             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"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |