118 lines
No EOL
4.2 KiB
TypeScript
118 lines
No EOL
4.2 KiB
TypeScript
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 {VariableUiElement} from "../Base/VariableUIElement";
|
|
import Translations from "../i18n/Translations";
|
|
import {FixedUiElement} from "../Base/FixedUiElement";
|
|
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: UIEventSource<{
|
|
features: any[],
|
|
wikilink: string,
|
|
intro: string,
|
|
source: string,
|
|
theme: string
|
|
}>;
|
|
public readonly IsValid: UIEventSource<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;
|
|
|
|
})
|
|
}
|
|
|
|
|
|
} |