forked from MapComplete/MapComplete
		
	Refactor OsmObject to use eventsources, add first version of the delete button
This commit is contained in:
		
							parent
							
								
									ec7833b2ee
								
							
						
					
					
						commit
						bbfcee686f
					
				
					 15 changed files with 553 additions and 229 deletions
				
			
		|  | @ -7,6 +7,7 @@ import State from "../../State"; | |||
| import Locale from "../../UI/i18n/Locale"; | ||||
| import LayoutConfig from "../../Customizations/JSON/LayoutConfig"; | ||||
| import Constants from "../../Models/Constants"; | ||||
| import {OsmObject} from "./OsmObject"; | ||||
| 
 | ||||
| export class ChangesetHandler { | ||||
| 
 | ||||
|  | @ -47,11 +48,20 @@ export class ChangesetHandler { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * The full logic to upload a change to one or more elements. | ||||
|      * | ||||
|      * This method will attempt to reuse an existing, open changeset for this theme (or open one if none available). | ||||
|      * Then, it will upload a changes-xml within this changeset (and leave the changeset open) | ||||
|      * When upload is successfull, eventual id-rewriting will be handled (aka: don't worry about that) | ||||
|      * | ||||
|      * If 'dryrun' is specified, the changeset XML will be printed to console instead of being uploaded | ||||
|      * | ||||
|      */ | ||||
|     public UploadChangeset( | ||||
|         layout: LayoutConfig, | ||||
|         allElements: ElementStorage, | ||||
|         generateChangeXML: (csid: string) => string, | ||||
|         continuation: () => void) { | ||||
|         generateChangeXML: (csid: string) => string) { | ||||
| 
 | ||||
|         if (this.userDetails.data.csCount == 0) { | ||||
|             // The user became a contributor!
 | ||||
|  | @ -62,7 +72,6 @@ export class ChangesetHandler { | |||
|         if (this._dryRun) { | ||||
|             const changesetXML = generateChangeXML("123456"); | ||||
|             console.log(changesetXML); | ||||
|             continuation(); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|  | @ -97,7 +106,7 @@ export class ChangesetHandler { | |||
|                     // Mark the CS as closed...
 | ||||
|                     this.currentChangeset.setData(""); | ||||
|                     // ... and try again. As the cs is closed, no recursive loop can exist  
 | ||||
|                     self.UploadChangeset(layout, allElements, generateChangeXML, continuation); | ||||
|                     self.UploadChangeset(layout, allElements, generateChangeXML); | ||||
| 
 | ||||
|                 } | ||||
|             ) | ||||
|  | @ -105,7 +114,60 @@ export class ChangesetHandler { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public CloseChangeset(changesetId: string = undefined, continuation: (() => void) = () => { | ||||
| 
 | ||||
|     /** | ||||
|      * Deletes the element with the given ID from the OSM database. | ||||
|      * DOES NOT PERFORM ANY SAFETY CHECKS! | ||||
|      * | ||||
|      * For the deletion of an element, a new, seperate changeset is created with a slightly changed comment and some extra flags set. | ||||
|      * The CS will be closed afterwards. | ||||
|      * | ||||
|      * If dryrun is specified, will not actually delete the point but print the CS-XML to console instead | ||||
|      * | ||||
|      */ | ||||
|     public DeleteElement(object: OsmObject, | ||||
|                          layout: LayoutConfig, | ||||
|                          reason: string, | ||||
|                          allElements: ElementStorage, | ||||
|                          continuation: () => void) { | ||||
| 
 | ||||
|         function generateChangeXML(csId: string) { | ||||
|             let [lat, lon] = object.centerpoint(); | ||||
| 
 | ||||
|             let changes = `<osmChange version='0.6' generator='Mapcomplete ${Constants.vNumber}'>`; | ||||
|             changes += | ||||
|                 `<delete><${object.type} id="${object.id}" version="${object.version}" changeset="${csId}" lat="${lat}" lon="${lon}" /></delete>`; | ||||
|             changes += "</osmChange>"; | ||||
| 
 | ||||
|             return changes; | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         if (this._dryRun) { | ||||
|             const changesetXML = generateChangeXML("123456"); | ||||
|             console.log(changesetXML); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         const self = this; | ||||
|         this.OpenChangeset(layout, (csId: string) => { | ||||
|              | ||||
|             // The cs is open - let us actually upload!
 | ||||
|             const changes = generateChangeXML(csId) | ||||
|              | ||||
|             self.AddChange(csId, changes, allElements, (csId) => { | ||||
|                 console.log("Successfully deleted ", object.id) | ||||
|                 self.CloseChangeset(csId, continuation) | ||||
|             }, (csId) => { | ||||
|                 alert("Deletion failed... Should not happend") | ||||
|                 // FAILED
 | ||||
|                 self.CloseChangeset(csId, continuation) | ||||
|             }) | ||||
|         }, true, reason) | ||||
|     } | ||||
| 
 | ||||
|     private CloseChangeset(changesetId: string = undefined, continuation: (() => void) = () => { | ||||
|     }) { | ||||
|         if (changesetId === undefined) { | ||||
|             changesetId = this.currentChangeset.data; | ||||
|  | @ -133,15 +195,25 @@ export class ChangesetHandler { | |||
| 
 | ||||
|     private OpenChangeset( | ||||
|         layout: LayoutConfig, | ||||
|         continuation: (changesetId: string) => void) { | ||||
|         continuation: (changesetId: string) => void, | ||||
|         isDeletionCS: boolean = false, | ||||
|         deletionReason: string = undefined) { | ||||
| 
 | ||||
|         const commentExtra = layout.changesetmessage !== undefined ? " - " + layout.changesetmessage : ""; | ||||
|         let comment = `Adding data with #MapComplete for theme #${layout.id}${commentExtra}` | ||||
|         if (isDeletionCS) { | ||||
|             comment = `Deleting a point with #MapComplete for theme #${layout.id}${commentExtra}` | ||||
|             if(deletionReason){ | ||||
|                 comment += ": "+deletionReason; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         let path = window.location.pathname; | ||||
|         path = path.substr(1, path.lastIndexOf("/")); | ||||
|         const metadata = [ | ||||
|             ["created_by", `MapComplete ${Constants.vNumber}`], | ||||
|             ["comment", `Adding data with #MapComplete for theme #${layout.id}${commentExtra}`], | ||||
|             ["comment", comment], | ||||
|             ["deletion", isDeletionCS ? "yes" : undefined], | ||||
|             ["theme", layout.id], | ||||
|             ["language", Locale.language.data], | ||||
|             ["host", window.location.host], | ||||
|  | @ -172,11 +244,21 @@ export class ChangesetHandler { | |||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Upload a changesetXML | ||||
|      * @param changesetId | ||||
|      * @param changesetXML | ||||
|      * @param allElements | ||||
|      * @param continuation | ||||
|      * @param onFail | ||||
|      * @constructor | ||||
|      * @private | ||||
|      */ | ||||
|     private AddChange(changesetId: string, | ||||
|                       changesetXML: string, | ||||
|                       allElements: ElementStorage, | ||||
|                       continuation: ((changesetId: string, idMapping: any) => void), | ||||
|                       onFail: ((changesetId: string) => void) = undefined) { | ||||
|                       onFail: ((changesetId: string, reason: string) => void) = undefined) { | ||||
|         this.auth.xhr({ | ||||
|             method: 'POST', | ||||
|             options: {header: {'Content-Type': 'text/xml'}}, | ||||
|  | @ -186,7 +268,7 @@ export class ChangesetHandler { | |||
|             if (response == null) { | ||||
|                 console.log("err", err); | ||||
|                 if (onFail) { | ||||
|                     onFail(changesetId); | ||||
|                     onFail(changesetId, err); | ||||
|                 } | ||||
|                 return; | ||||
|             } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue