mapcomplete/UI/BigComponents/UploadTraceToOsmUI.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

119 lines
4.4 KiB
TypeScript
Raw Normal View History

import Toggle from "../Input/Toggle";
import {RadioButton} from "../Input/RadioButton";
import {FixedInputElement} from "../Input/FixedInputElement";
import Combine from "../Base/Combine";
import Translations from "../i18n/Translations";
import {TextField} from "../Input/TextField";
import {UIEventSource} from "../../Logic/UIEventSource";
import Title from "../Base/Title";
import {SubtleButton} from "../Base/SubtleButton";
import Svg from "../../Svg";
import {OsmConnection} from "../../Logic/Osm/OsmConnection";
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import {Translation} from "../i18n/Translation";
export default class UploadTraceToOsmUI extends Toggle {
2022-10-28 04:38:10 +02:00
private static createDefault(s: string, defaultValue: string){
if(defaultValue.length < 1){
throw "Default value should have some characters"
}
if(s === undefined || s === null || s === ""){
return defaultValue
}
return s
}
constructor(
2022-08-05 19:47:24 +02:00
trace: (title: string) => string,
state: {
layoutToUse: LayoutConfig;
osmConnection: OsmConnection
}, options?: {
whenUploaded?: () => void | Promise<void>
}) {
const t = Translations.t.general.uploadGpx
2022-08-05 19:47:24 +02:00
const uploadFinished = new UIEventSource(false)
const traceVisibilities: {
key: "private" | "public",
name: Translation,
docs: Translation
}[] = [
{
key: "private",
2022-08-05 19:47:24 +02:00
...t.modes.private
},
{
key: "public",
2022-08-05 19:47:24 +02:00
...t.modes.public
}
]
const dropdown = new RadioButton<"private" | "public">(
traceVisibilities.map(tv => new FixedInputElement<"private" | "public">(
new Combine([Translations.W(
tv.name
).SetClass("font-bold"), tv.docs]).SetClass("flex flex-col")
, tv.key)),
{
value: <any>state?.osmConnection?.GetPreference("gps.trace.visibility")
}
)
const description = new TextField({
2022-08-05 19:47:24 +02:00
placeholder: t.meta.descriptionPlaceHolder
})
const title = new TextField({
placeholder: t.meta.titlePlaceholder
})
const clicked = new UIEventSource<boolean>(false)
const confirmPanel = new Combine([
new Title(t.title),
t.intro0,
t.intro1,
t.choosePermission,
dropdown,
2022-08-05 19:47:24 +02:00
new Title(t.meta.title, 4),
t.meta.intro,
title,
t.meta.descriptionIntro,
description,
new Combine([
new SubtleButton(Svg.close_svg(), Translations.t.general.cancel).onClick(() => {
clicked.setData(false)
}).SetClass(""),
new SubtleButton(Svg.upload_svg(), t.confirm).OnClickWithLoading(t.uploading, async () => {
2022-10-28 04:38:10 +02:00
const titleStr = UploadTraceToOsmUI.createDefault(title.GetValue().data, "Track with mapcomplete")
const descriptionStr = UploadTraceToOsmUI.createDefault(description.GetValue().data, "Track created with MapComplete with theme "+state?.layoutToUse?.id)
2022-08-05 19:47:24 +02:00
await state?.osmConnection?.uploadGpxTrack(trace(title.GetValue().data), {
visibility: dropdown.GetValue().data,
2022-10-28 04:38:10 +02:00
description: descriptionStr,
filename: titleStr +".gpx",
labels: ["MapComplete", state?.layoutToUse?.id]
})
if (options?.whenUploaded !== undefined) {
await options.whenUploaded()
}
2022-08-05 19:47:24 +02:00
uploadFinished.setData(true)
2022-08-05 19:47:24 +02:00
})
]).SetClass("flex flex-wrap flex-wrap-reverse justify-between items-stretch")
]).SetClass("flex flex-col p-4 rounded border-2 m-2 border-subtle")
super(
2022-08-07 21:32:49 +02:00
new Combine([Svg.confirm_svg().SetClass("w-12 h-12 mr-2"),
t.uploadFinished])
.SetClass("flex p-2 rounded-xl border-2 subtle-border items-center"),
2022-08-05 19:47:24 +02:00
new Toggle(
confirmPanel,
new SubtleButton(Svg.upload_svg(), t.title)
.onClick(() => clicked.setData(true)),
clicked
), uploadFinished)
}
2022-10-28 04:38:10 +02:00
}