forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			128 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import Combine from "../Base/Combine"
 | |
| import { FlowStep } from "./FlowStep"
 | |
| import { Store } from "../../Logic/UIEventSource"
 | |
| import ValidatedTextField from "../Input/ValidatedTextField"
 | |
| import { LocalStorageSource } from "../../Logic/Web/LocalStorageSource"
 | |
| import Title from "../Base/Title"
 | |
| import { VariableUiElement } from "../Base/VariableUIElement"
 | |
| import Translations from "../i18n/Translations"
 | |
| import { SubtleButton } from "../Base/SubtleButton"
 | |
| import Svg from "../../Svg"
 | |
| import { Utils } from "../../Utils"
 | |
| 
 | |
| export class AskMetadata
 | |
|     extends Combine
 | |
|     implements
 | |
|         FlowStep<{
 | |
|             features: any[]
 | |
|             wikilink: string
 | |
|             intro: string
 | |
|             source: string
 | |
|             theme: string
 | |
|         }>
 | |
| {
 | |
|     public readonly Value: Store<{
 | |
|         features: any[]
 | |
|         wikilink: string
 | |
|         intro: string
 | |
|         source: string
 | |
|         theme: string
 | |
|     }>
 | |
|     public readonly IsValid: Store<boolean>
 | |
| 
 | |
|     constructor(params: { features: any[]; theme: string }) {
 | |
|         const t = Translations.t.importHelper.askMetadata
 | |
|         const introduction = ValidatedTextField.ForType("text").ConstructInputElement({
 | |
|             value: LocalStorageSource.Get("import-helper-introduction-text"),
 | |
|             inputStyle: "width: 100%",
 | |
|         })
 | |
| 
 | |
|         const wikilink = ValidatedTextField.ForType("url").ConstructInputElement({
 | |
|             value: LocalStorageSource.Get("import-helper-wikilink-text"),
 | |
|             inputStyle: "width: 100%",
 | |
|         })
 | |
| 
 | |
|         const source = ValidatedTextField.ForType("string").ConstructInputElement({
 | |
|             value: LocalStorageSource.Get("import-helper-source-text"),
 | |
|             inputStyle: "width: 100%",
 | |
|         })
 | |
| 
 | |
|         super([
 | |
|             new Title(t.title),
 | |
|             t.intro.Subs({ count: params.features.length }),
 | |
|             t.giveDescription,
 | |
|             introduction.SetClass("w-full border border-black"),
 | |
|             t.giveSource,
 | |
|             source.SetClass("w-full border border-black"),
 | |
|             t.giveWikilink,
 | |
|             wikilink.SetClass("w-full border border-black"),
 | |
|             new VariableUiElement(
 | |
|                 wikilink.GetValue().map((wikilink) => {
 | |
|                     try {
 | |
|                         const url = new URL(wikilink)
 | |
|                         if (url.hostname.toLowerCase() !== "wiki.openstreetmap.org") {
 | |
|                             return t.shouldBeOsmWikilink.SetClass("alert")
 | |
|                         }
 | |
| 
 | |
|                         if (url.pathname.toLowerCase() === "/wiki/main_page") {
 | |
|                             return t.shouldNotBeHomepage.SetClass("alert")
 | |
|                         }
 | |
|                     } catch (e) {
 | |
|                         return t.shouldBeUrl.SetClass("alert")
 | |
|                     }
 | |
|                 })
 | |
|             ),
 | |
|             t.orDownload,
 | |
|             new SubtleButton(Svg.download_svg(), t.downloadGeojson).OnClickWithLoading(
 | |
|                 "Preparing your download",
 | |
|                 async () => {
 | |
|                     const geojson = {
 | |
|                         type: "FeatureCollection",
 | |
|                         features: params.features,
 | |
|                     }
 | |
|                     Utils.offerContentsAsDownloadableFile(
 | |
|                         JSON.stringify(geojson),
 | |
|                         "prepared_import_" + params.theme + ".geojson",
 | |
|                         {
 | |
|                             mimetype: "application/vnd.geo+json",
 | |
|                         }
 | |
|                     )
 | |
|                 }
 | |
|             ),
 | |
|         ])
 | |
|         this.SetClass("flex flex-col")
 | |
| 
 | |
|         this.Value = introduction.GetValue().map(
 | |
|             (intro) => {
 | |
|                 return {
 | |
|                     features: params.features,
 | |
|                     wikilink: wikilink.GetValue().data,
 | |
|                     intro,
 | |
|                     source: source.GetValue().data,
 | |
|                     theme: params.theme,
 | |
|                 }
 | |
|             },
 | |
|             [wikilink.GetValue(), source.GetValue()]
 | |
|         )
 | |
| 
 | |
|         this.IsValid = this.Value.map((obj) => {
 | |
|             if (obj === undefined) {
 | |
|                 return false
 | |
|             }
 | |
|             if ([obj.features, obj.intro, obj.wikilink, obj.source].some((v) => v === undefined)) {
 | |
|                 return false
 | |
|             }
 | |
| 
 | |
|             try {
 | |
|                 const url = new URL(obj.wikilink)
 | |
|                 if (url.hostname.toLowerCase() !== "wiki.openstreetmap.org") {
 | |
|                     return false
 | |
|                 }
 | |
|             } catch (e) {
 | |
|                 return false
 | |
|             }
 | |
| 
 | |
|             return true
 | |
|         })
 | |
|     }
 | |
| }
 |