| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | import Combine from "../Base/Combine"; | 
					
						
							|  |  |  | import {FlowStep} from "./FlowStep"; | 
					
						
							|  |  |  | import {UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							|  |  |  | import ValidatedTextField from "../Input/ValidatedTextField"; | 
					
						
							|  |  |  | import {LocalStorageSource} from "../../Logic/Web/LocalStorageSource"; | 
					
						
							|  |  |  | import Title from "../Base/Title"; | 
					
						
							|  |  |  | import {FixedUiElement} from "../Base/FixedUiElement"; | 
					
						
							| 
									
										
										
										
											2022-03-24 03:11:29 +01:00
										 |  |  | import {VariableUiElement} from "../Base/VariableUIElement"; | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | export class AskMetadata extends Combine implements FlowStep<{ | 
					
						
							|  |  |  |     features: any[], | 
					
						
							|  |  |  |     wikilink: string, | 
					
						
							|  |  |  |     intro: string, | 
					
						
							|  |  |  |     source: string, | 
					
						
							|  |  |  |     theme: string | 
					
						
							|  |  |  | }> { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public readonly Value: UIEventSource<{ | 
					
						
							|  |  |  |         features: any[], | 
					
						
							|  |  |  |         wikilink: string, | 
					
						
							|  |  |  |         intro: string, | 
					
						
							|  |  |  |         source: string, | 
					
						
							|  |  |  |         theme: string | 
					
						
							|  |  |  |     }>; | 
					
						
							|  |  |  |     public readonly IsValid: UIEventSource<boolean>; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-24 03:11:29 +01:00
										 |  |  |     constructor(params: ({ features: any[], theme: string })) { | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-12 02:53:41 +01:00
										 |  |  |         const introduction = ValidatedTextField.ForType("text").ConstructInputElement({ | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             value: LocalStorageSource.Get("import-helper-introduction-text"), | 
					
						
							|  |  |  |             inputStyle: "width: 100%" | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-24 03:11:29 +01:00
										 |  |  |         const wikilink = ValidatedTextField.ForType("url").ConstructInputElement({ | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             value: LocalStorageSource.Get("import-helper-wikilink-text"), | 
					
						
							|  |  |  |             inputStyle: "width: 100%" | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-12 02:53:41 +01:00
										 |  |  |         const source = ValidatedTextField.ForType("string").ConstructInputElement({ | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             value: LocalStorageSource.Get("import-helper-source-text"), | 
					
						
							|  |  |  |             inputStyle: "width: 100%" | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         super([ | 
					
						
							|  |  |  |             new Title("Set metadata"), | 
					
						
							|  |  |  |             "Before adding " + params.features.length + " notes, please provide some extra information.", | 
					
						
							|  |  |  |             "Please, write an introduction for someone who sees the note", | 
					
						
							|  |  |  |             introduction.SetClass("w-full border border-black"), | 
					
						
							|  |  |  |             "What is the source of this data? If 'source' is set in the feature, this value will be ignored", | 
					
						
							|  |  |  |             source.SetClass("w-full border border-black"), | 
					
						
							|  |  |  |             "On what wikipage can one find more information about this import?", | 
					
						
							|  |  |  |             wikilink.SetClass("w-full border border-black"), | 
					
						
							| 
									
										
										
										
											2022-03-24 03:11:29 +01:00
										 |  |  |             new VariableUiElement(wikilink.GetValue().map(wikilink => { | 
					
						
							|  |  |  |                 try{ | 
					
						
							|  |  |  |                     const url = new URL(wikilink) | 
					
						
							|  |  |  |                     if(url.hostname.toLowerCase() !== "wiki.openstreetmap.org"){ | 
					
						
							|  |  |  |                         return new FixedUiElement("Expected a link to wiki.openstreetmap.org").SetClass("alert"); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     if(url.pathname.toLowerCase() === "/wiki/main_page"){ | 
					
						
							|  |  |  |                         return new FixedUiElement("Nope, the home page isn't allowed either. Enter the URL of a proper wikipage documenting your import").SetClass("alert"); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 }catch(e){ | 
					
						
							|  |  |  |                     return new FixedUiElement("Not a valid URL").SetClass("alert") | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             })) | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |         ]); | 
					
						
							|  |  |  |         this.SetClass("flex flex-col") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         this.Value = introduction.GetValue().map(intro => { | 
					
						
							|  |  |  |             return { | 
					
						
							|  |  |  |                 features: params.features, | 
					
						
							|  |  |  |                 wikilink: wikilink.GetValue().data, | 
					
						
							|  |  |  |                 intro, | 
					
						
							|  |  |  |                 source: source.GetValue().data, | 
					
						
							| 
									
										
										
										
											2022-03-24 03:11:29 +01:00
										 |  |  |                 theme: params.theme | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2022-03-24 03:11:29 +01:00
										 |  |  |         }, [wikilink.GetValue(), source.GetValue()]) | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         this.IsValid = this.Value.map(obj => { | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |             if (obj === undefined) { | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2022-03-24 03:11:29 +01:00
										 |  |  |             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; | 
					
						
							|  |  |  |                  | 
					
						
							| 
									
										
										
										
											2022-01-21 01:57:16 +01:00
										 |  |  |         }) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |