| 
									
										
										
										
											2022-09-08 21:40:48 +02: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" | 
					
						
							|  |  |  | import { SubtleButton } from "../Base/SubtleButton" | 
					
						
							|  |  |  | import Svg from "../../Svg" | 
					
						
							|  |  |  | import Translations from "../i18n/Translations" | 
					
						
							|  |  |  | import { Translation } from "../i18n/Translation" | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | export class CreateNotes extends Combine { | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +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-09-08 21:40:48 +02:00
										 |  |  |         const tags: string[] = [] | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |         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 | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             tags.push( | 
					
						
							|  |  |  |                 key + | 
					
						
							|  |  |  |                     "=" + | 
					
						
							|  |  |  |                     (feature.properties[key] + "") | 
					
						
							|  |  |  |                         .replace(/=/, "\\=") | 
					
						
							|  |  |  |                         .replace(/;/g, "\\;") | 
					
						
							|  |  |  |                         .replace(/\n/g, "\\n") | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |         const lat = feature.geometry.coordinates[1] | 
					
						
							|  |  |  |         const lon = feature.geometry.coordinates[0] | 
					
						
							|  |  |  |         const note = Translations.t.importHelper.noteParts | 
					
						
							|  |  |  |         return [ | 
					
						
							|  |  |  |             options.intro, | 
					
						
							|  |  |  |             extraNote, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             note.datasource.Subs({ source: src }), | 
					
						
							| 
									
										
										
										
											2022-04-19 23:42:58 +02:00
										 |  |  |             note.wikilink.Subs(options), | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +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`, | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             ...tags, | 
					
						
							|  |  |  |         ] | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +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") { | 
					
						
							| 
									
										
										
										
											2022-04-19 23:42:58 +02:00
										 |  |  |                 return trOrStr | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return trOrStr.txt | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +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[]>([]) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         const currentNote = createdNotes.map((n) => n.length) | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for (const f of v.features) { | 
					
						
							|  |  |  |             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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             state.osmConnection.openNote(lat, lon, text).then( | 
					
						
							|  |  |  |                 ({ id }) => { | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |                     createdNotes.data.push(id) | 
					
						
							|  |  |  |                     createdNotes.ping() | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 (err) => { | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |                     failed.data.push(err) | 
					
						
							|  |  |  |                     failed.ping() | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         super([ | 
					
						
							| 
									
										
										
										
											2022-04-14 03:01:54 +02:00
										 |  |  |             new Title(t.title), | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             t.loading, | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             new Toggle( | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +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-09-08 21:40:48 +02:00
										 |  |  |                     t.done.Subs({ count: v.features.length }).SetClass("thanks"), | 
					
						
							|  |  |  |                     new SubtleButton(Svg.note_svg(), t.openImportViewer, { | 
					
						
							|  |  |  |                         url: "import_viewer.html", | 
					
						
							|  |  |  |                     }), | 
					
						
							|  |  |  |                 ]), | 
					
						
							|  |  |  |                 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") | 
					
						
							|  |  |  |                 }) | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             ), | 
					
						
							|  |  |  |         ]) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         this.SetClass("flex flex-col") | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | } |