| 
									
										
										
										
											2022-08-05 12:39:02 +02:00
										 |  |  | 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 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-08-05 12:39:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     constructor( | 
					
						
							| 
									
										
										
										
											2022-08-05 19:47:24 +02:00
										 |  |  |         trace: (title: string) => string, | 
					
						
							| 
									
										
										
										
											2022-08-05 12:39:02 +02:00
										 |  |  |         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) | 
					
						
							| 
									
										
										
										
											2022-08-05 12:39:02 +02:00
										 |  |  |         const traceVisibilities: { | 
					
						
							|  |  |  |             key: "private" | "public", | 
					
						
							|  |  |  |             name: Translation, | 
					
						
							|  |  |  |             docs: Translation | 
					
						
							|  |  |  |         }[] = [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 key: "private", | 
					
						
							| 
									
										
										
										
											2022-08-05 19:47:24 +02:00
										 |  |  |                 ...t.modes.private | 
					
						
							| 
									
										
										
										
											2022-08-05 12:39:02 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 key: "public", | 
					
						
							| 
									
										
										
										
											2022-08-05 19:47:24 +02:00
										 |  |  |                 ...t.modes.public | 
					
						
							| 
									
										
										
										
											2022-08-05 12:39:02 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         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 | 
					
						
							| 
									
										
										
										
											2022-08-05 12:39:02 +02:00
										 |  |  |         }) | 
					
						
							|  |  |  |         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, | 
					
						
							| 
									
										
										
										
											2022-08-05 12:39:02 +02:00
										 |  |  |             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), { | 
					
						
							| 
									
										
										
										
											2022-08-05 12:39:02 +02:00
										 |  |  |                         visibility: dropdown.GetValue().data, | 
					
						
							| 
									
										
										
										
											2022-10-28 04:38:10 +02:00
										 |  |  |                         description: descriptionStr, | 
					
						
							|  |  |  |                         filename: titleStr +".gpx", | 
					
						
							| 
									
										
										
										
											2022-08-05 12:39:02 +02:00
										 |  |  |                         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 12:39:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-05 19:47:24 +02:00
										 |  |  |                 }) | 
					
						
							| 
									
										
										
										
											2022-08-05 12:39:02 +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-08-05 12:39:02 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-10-28 04:38:10 +02:00
										 |  |  | } |