forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			82 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			82 lines
		
	
	
	
		
			3.2 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 Link from "../Base/Link";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            const tags: string [] = []
							 | 
						||
| 
								 | 
							
								            for (const key in f.properties) {
							 | 
						||
| 
								 | 
							
								                if(f.properties[key] === ""){
							 | 
						||
| 
								 | 
							
								                    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,
							 | 
						||
| 
								 | 
							
								                '',
							 | 
						||
| 
								 | 
							
								                "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")))),
							 | 
						||
| 
								 | 
							
								                new FixedUiElement("All done!"),
							 | 
						||
| 
								 | 
							
								                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")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            })),
							 | 
						||
| 
								 | 
							
								            new VariableUiElement(createdNotes.map(notes => {
							 | 
						||
| 
								 | 
							
								                const links = notes.map(n =>
							 | 
						||
| 
								 | 
							
								                    new Link(new FixedUiElement("https://openstreetmap.org/note/" + n), "https://openstreetmap.org/note/" + n, true));
							 | 
						||
| 
								 | 
							
								                return new Combine(links).SetClass("flex flex-col");
							 | 
						||
| 
								 | 
							
								            }))
							 | 
						||
| 
								 | 
							
								        ])
							 | 
						||
| 
								 | 
							
								        this.SetClass("flex flex-col");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |