forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			110 lines
		
	
	
		
			No EOL
		
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			No EOL
		
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 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";
 | |
| 
 | |
| export class CreateNotes extends Combine {
 | |
|     
 | |
|     public static createNoteContents(feature: {properties: any, geometry: {coordinates: [number,number]}},
 | |
|                                      options: {wikilink: string; intro: string; source: string, theme: string }
 | |
|                                      ): string[]{
 | |
|         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"]
 | |
|         }
 | |
| 
 | |
|         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,
 | |
|             note.datasource.Subs({source: src}).txt,
 | |
|             note.wikilink.Subs(options).txt,
 | |
|             '',
 | |
|             note.importEasily.txt,
 | |
|             `https://mapcomplete.osm.be/${options.theme}.html?z=18&lat=${lat}&lon=${lon}#import`,
 | |
|             ...tags]
 | |
|     }
 | |
| 
 | |
|     constructor(state: { osmConnection: OsmConnection }, v: { features: any[]; wikilink: string; intro: string; source: string, theme: string }) {
 | |
|         const t = Translations.t.importHelper.createNotes;
 | |
|         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 lat = f.geometry.coordinates[1]
 | |
|             const lon = f.geometry.coordinates[0]
 | |
|             const text = CreateNotes.createNoteContents(f, v).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(t.title),
 | |
|            t.loading           ,
 | |
|             new Toggle(
 | |
|                 new Loading(new VariableUiElement(currentNote.map(count => t.creating.Subs({
 | |
|                     count, total: v.features.length
 | |
|                     }
 | |
|                     
 | |
|                 )))),
 | |
|                 new Combine([
 | |
|                     Svg.party_svg().SetClass("w-24"),
 | |
|                     t.done.Subs(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")
 | |
| 
 | |
|             }))
 | |
|         ])
 | |
|         this.SetClass("flex flex-col");
 | |
|     }
 | |
| 
 | |
| } |