forked from MapComplete/MapComplete
		
	Improve error messages which are reported upstream
This commit is contained in:
		
							parent
							
								
									fe57e12881
								
							
						
					
					
						commit
						94390f882b
					
				
					 3 changed files with 68 additions and 68 deletions
				
			
		|  | @ -523,18 +523,12 @@ export class Changes { | |||
|                     const osmObj = await downloader.DownloadObjectAsync(id, 0) | ||||
|                     return { id, osmObj } | ||||
|                 } catch (e) { | ||||
|                     this._reportError( | ||||
|                         "Could not download OSM-object" + | ||||
|                     const msg = "Could not download OSM-object" + | ||||
|                         id + | ||||
|                         " dropping it from the changes (" + | ||||
|                         e + | ||||
|                         ")" | ||||
|                     ) | ||||
|                     console.error( | ||||
|                         "Could not download OSM-object", | ||||
|                         id, | ||||
|                         " dropping it from the changes (" + e + ")" | ||||
|                     ) | ||||
|                     this._reportError(msg) | ||||
|                     this.errors.data.push(e) | ||||
|                     this.errors.ping() | ||||
|                     return undefined | ||||
|  |  | |||
|  | @ -158,7 +158,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|         this.featureSwitches = new FeatureSwitchState(layout) | ||||
|         this.guistate = new MenuState( | ||||
|             this.featureSwitches.featureSwitchWelcomeMessage.data, | ||||
|             layout.id | ||||
|             layout.id, | ||||
|         ) | ||||
|         this.map = new UIEventSource<MlMap>(undefined) | ||||
|         const geolocationState = new GeoLocationState() | ||||
|  | @ -174,14 +174,14 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|             oauth_token: QueryParameters.GetQueryParameter( | ||||
|                 "oauth_token", | ||||
|                 undefined, | ||||
|                 "Used to complete the login" | ||||
|                 "Used to complete the login", | ||||
|             ), | ||||
|         }) | ||||
|         this.userRelatedState = new UserRelatedState( | ||||
|             this.osmConnection, | ||||
|             layout, | ||||
|             this.featureSwitches, | ||||
|             this.mapProperties | ||||
|             this.mapProperties, | ||||
|         ) | ||||
|         this.userRelatedState.fixateNorth.addCallbackAndRunD((fixated) => { | ||||
|             this.mapProperties.allowRotating.setData(fixated !== "yes") | ||||
|  | @ -192,13 +192,13 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|             geolocationState, | ||||
|             this.selectedElement, | ||||
|             this.mapProperties, | ||||
|             this.userRelatedState.gpsLocationHistoryRetentionTime | ||||
|             this.userRelatedState.gpsLocationHistoryRetentionTime, | ||||
|         ) | ||||
|         this.geolocationControl = new GeolocationControlState(this.geolocation, this.mapProperties) | ||||
| 
 | ||||
|         this.availableLayers = AvailableRasterLayers.layersAvailableAt( | ||||
|             this.mapProperties.location, | ||||
|             this.osmConnection.isLoggedIn | ||||
|             this.osmConnection.isLoggedIn, | ||||
|         ) | ||||
| 
 | ||||
|         const self = this | ||||
|  | @ -210,7 +210,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                 const isDisplayed = QueryParameters.GetBooleanQueryParameter( | ||||
|                     "overlay-" + rasterInfo.id, | ||||
|                     rasterInfo.defaultState ?? true, | ||||
|                     "Whether or not overlayer layer " + rasterInfo.id + " is shown" | ||||
|                     "Whether or not overlay layer " + rasterInfo.id + " is shown", | ||||
|                 ) | ||||
|                 const state = { isDisplayed } | ||||
|                 overlayLayerStates.set(rasterInfo.id, state) | ||||
|  | @ -235,7 +235,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                 this.osmConnection.Backend(), | ||||
|                 (id) => self.layerState.filteredLayers.get(id).isDisplayed, | ||||
|                 mvtAvailableLayers, | ||||
|                 this.fullNodeDatabase | ||||
|                 this.fullNodeDatabase, | ||||
|             ) | ||||
| 
 | ||||
|             let currentViewIndex = 0 | ||||
|  | @ -253,7 +253,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                             id: "current_view_" + currentViewIndex, | ||||
|                         }), | ||||
|                     ] | ||||
|                 }) | ||||
|                 }), | ||||
|             ) | ||||
|             this.featuresInView = new BBoxFeatureSource(layoutSource, this.mapProperties.bounds) | ||||
| 
 | ||||
|  | @ -271,19 +271,19 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                     featureSwitches: this.featureSwitches, | ||||
|                 }, | ||||
|                 layout?.isLeftRightSensitive() ?? false, | ||||
|                 (e) => this.reportError(e) | ||||
|                 (e) => this.reportError(e), | ||||
|             ) | ||||
|             this.historicalUserLocations = this.geolocation.historicalUserLocations | ||||
|             this.newFeatures = new NewGeometryFromChangesFeatureSource( | ||||
|                 this.changes, | ||||
|                 layoutSource, | ||||
|                 this.featureProperties | ||||
|                 this.featureProperties, | ||||
|             ) | ||||
|             layoutSource.addSource(this.newFeatures) | ||||
| 
 | ||||
|             const perLayer = new PerLayerFeatureSourceSplitter( | ||||
|                 Array.from(this.layerState.filteredLayers.values()).filter( | ||||
|                     (l) => l.layerDef?.source !== null | ||||
|                     (l) => l.layerDef?.source !== null, | ||||
|                 ), | ||||
|                 new ChangeGeometryApplicator(this.indexedFeatures, this.changes), | ||||
|                 { | ||||
|  | @ -294,10 +294,10 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                             "Got ", | ||||
|                             features.length, | ||||
|                             "leftover features, such as", | ||||
|                             features[0].properties | ||||
|                             features[0].properties, | ||||
|                         ) | ||||
|                     }, | ||||
|                 } | ||||
|                 }, | ||||
|             ) | ||||
|             this.perLayer = perLayer.perLayer | ||||
|         } | ||||
|  | @ -337,12 +337,12 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|         this.lastClickObject = new LastClickFeatureSource( | ||||
|             this.layout, | ||||
|             this.mapProperties.lastClickLocation, | ||||
|             this.userRelatedState.addNewFeatureMode | ||||
|             this.userRelatedState.addNewFeatureMode, | ||||
|         ) | ||||
| 
 | ||||
|         this.osmObjectDownloader = new OsmObjectDownloader( | ||||
|             this.osmConnection.Backend(), | ||||
|             this.changes | ||||
|             this.changes, | ||||
|         ) | ||||
| 
 | ||||
|         this.perLayerFiltered = this.showNormalDataOn(this.map) | ||||
|  | @ -353,7 +353,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                 currentZoom: this.mapProperties.zoom, | ||||
|                 layerState: this.layerState, | ||||
|                 bounds: this.visualFeedbackViewportBounds, | ||||
|             } | ||||
|             }, | ||||
|         ) | ||||
|         this.hasDataInView = new NoElementsInViewDetector(this).hasFeatureInView | ||||
|         this.imageUploadManager = new ImageUploadManager( | ||||
|  | @ -361,11 +361,11 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|             Imgur.singleton, | ||||
|             this.featureProperties, | ||||
|             this.osmConnection, | ||||
|             this.changes | ||||
|             this.changes, | ||||
|         ) | ||||
|         this.favourites = new FavouritesFeatureSource(this) | ||||
| 
 | ||||
|         this.featureSummary = this.setupSummaryLayer(new LayerConfig(<LayerConfigJson> summaryLayer, "summaryLayer", true)) | ||||
|         this.featureSummary = this.setupSummaryLayer(new LayerConfig(<LayerConfigJson>summaryLayer, "summaryLayer", true)) | ||||
|         this.toCacheSavers = this.initSaveToLocalStorage() | ||||
|         this.initActors() | ||||
|         this.drawSpecialLayers() | ||||
|  | @ -404,7 +404,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                 LayoutSource.fromCacheZoomLevel, | ||||
|                 fs, | ||||
|                 this.featureProperties, | ||||
|                 fs.layer.layerDef.maxAgeOfCache | ||||
|                 fs.layer.layerDef.maxAgeOfCache, | ||||
|             ) | ||||
|             toLocalStorage.set(layerId, storage) | ||||
|         }) | ||||
|  | @ -417,7 +417,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|             const doShowLayer = this.mapProperties.zoom.map( | ||||
|                 (z) => | ||||
|                     (fs.layer.isDisplayed?.data ?? true) && z >= (fs.layer.layerDef?.minzoom ?? 0), | ||||
|                 [fs.layer.isDisplayed] | ||||
|                 [fs.layer.isDisplayed], | ||||
|             ) | ||||
| 
 | ||||
|             if (!doShowLayer.data && this.featureSwitches.featureSwitchFilter.data === false) { | ||||
|  | @ -434,7 +434,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                 fs.layer, | ||||
|                 fs, | ||||
|                 (id) => this.featureProperties.getStore(id), | ||||
|                 this.layerState.globalFilters | ||||
|                 this.layerState.globalFilters, | ||||
|             ) | ||||
|             filteringFeatureSource.set(layerName, filtered) | ||||
| 
 | ||||
|  | @ -575,7 +575,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                     return | ||||
|                 } | ||||
|                 this.selectClosestAtCenter(0) | ||||
|             } | ||||
|             }, | ||||
|         ) | ||||
| 
 | ||||
|         for (let i = 1; i < 9; i++) { | ||||
|  | @ -593,7 +593,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                     onUp: true, | ||||
|                 }, | ||||
|                 doc, | ||||
|                 () => this.selectClosestAtCenter(i - 1) | ||||
|                 () => this.selectClosestAtCenter(i - 1), | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|  | @ -610,7 +610,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                     if (this.featureSwitches.featureSwitchBackgroundSelection.data) { | ||||
|                         this.guistate.backgroundLayerSelectionIsOpened.setData(true) | ||||
|                     } | ||||
|                 } | ||||
|                 }, | ||||
|             ) | ||||
|             Hotkeys.RegisterHotkey( | ||||
|                 { | ||||
|  | @ -622,14 +622,14 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                     if (this.featureSwitches.featureSwitchFilter.data) { | ||||
|                         this.guistate.openFilterView() | ||||
|                     } | ||||
|                 } | ||||
|                 }, | ||||
|             ) | ||||
|             Hotkeys.RegisterHotkey( | ||||
|                 { shift: "O" }, | ||||
|                 Translations.t.hotkeyDocumentation.selectMapnik, | ||||
|                 () => { | ||||
|                     this.mapProperties.rasterLayer.setData(AvailableRasterLayers.osmCarto) | ||||
|                 } | ||||
|                 }, | ||||
|             ) | ||||
|             const setLayerCategory = (category: EliCategory) => { | ||||
|                 const available = this.availableLayers.data | ||||
|  | @ -637,7 +637,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                 const best = RasterLayerUtils.SelectBestLayerAccordingTo( | ||||
|                     available, | ||||
|                     category, | ||||
|                     current.data | ||||
|                     current.data, | ||||
|                 ) | ||||
|                 console.log("Best layer for category", category, "is", best.properties.id) | ||||
|                 current.setData(best) | ||||
|  | @ -646,26 +646,26 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|             Hotkeys.RegisterHotkey( | ||||
|                 { nomod: "O" }, | ||||
|                 Translations.t.hotkeyDocumentation.selectOsmbasedmap, | ||||
|                 () => setLayerCategory("osmbasedmap") | ||||
|                 () => setLayerCategory("osmbasedmap"), | ||||
|             ) | ||||
| 
 | ||||
|             Hotkeys.RegisterHotkey( | ||||
|                 { nomod: "M" }, | ||||
|                 Translations.t.hotkeyDocumentation.selectMap, | ||||
|                 () => setLayerCategory("map") | ||||
|                 () => setLayerCategory("map"), | ||||
|             ) | ||||
| 
 | ||||
|             Hotkeys.RegisterHotkey( | ||||
|                 { nomod: "P" }, | ||||
|                 Translations.t.hotkeyDocumentation.selectAerial, | ||||
|                 () => setLayerCategory("photo") | ||||
|                 () => setLayerCategory("photo"), | ||||
|             ) | ||||
|             Hotkeys.RegisterHotkey( | ||||
|                 { nomod: "L" }, | ||||
|                 Translations.t.hotkeyDocumentation.geolocate, | ||||
|                 () => { | ||||
|                     this.geolocationControl.handleClick() | ||||
|                 } | ||||
|                 }, | ||||
|             ) | ||||
|             return true | ||||
|         }) | ||||
|  | @ -677,7 +677,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|             Translations.t.hotkeyDocumentation.translationMode, | ||||
|             () => { | ||||
|                 Locale.showLinkToWeblate.setData(!Locale.showLinkToWeblate.data) | ||||
|             } | ||||
|             }, | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
|  | @ -688,7 +688,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|         const normalLayers = this.layout.layers.filter( | ||||
|             (l) => | ||||
|                 Constants.priviliged_layers.indexOf(<any>l.id) < 0 && | ||||
|                 !l.id.startsWith("note_import") | ||||
|                 !l.id.startsWith("note_import"), | ||||
|         ) | ||||
|         const maxzoom = Math.min(...normalLayers.map((l) => l.minzoom)) | ||||
| 
 | ||||
|  | @ -696,7 +696,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|             (l) => | ||||
|                 Constants.priviliged_layers.indexOf(<any>l.id) < 0 && | ||||
|                 l.source.geojsonSource === undefined && | ||||
|                 l.doCount | ||||
|                 l.doCount, | ||||
|         ) | ||||
|         const summaryTileSource = new SummaryTileSource( | ||||
|             Constants.SummaryServer, | ||||
|  | @ -705,10 +705,10 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|             this.mapProperties, | ||||
|             { | ||||
|                 isActive: this.mapProperties.zoom.map((z) => z < maxzoom), | ||||
|             } | ||||
|             }, | ||||
|         ) | ||||
| 
 | ||||
|         const src =new SummaryTileSourceRewriter(summaryTileSource, this.layerState.filteredLayers) | ||||
|         const src = new SummaryTileSourceRewriter(summaryTileSource, this.layerState.filteredLayers) | ||||
|         return src | ||||
|     } | ||||
| 
 | ||||
|  | @ -727,12 +727,12 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|             gps_location_history: this.geolocation.historicalUserLocations, | ||||
|             gps_track: this.geolocation.historicalUserLocationsTrack, | ||||
|             selected_element: new StaticFeatureSource( | ||||
|                 this.selectedElement.map((f) => (f === undefined ? empty : [f])) | ||||
|                 this.selectedElement.map((f) => (f === undefined ? empty : [f])), | ||||
|             ), | ||||
|             range: new StaticFeatureSource( | ||||
|                 this.mapProperties.maxbounds.map((bbox) => | ||||
|                     bbox === undefined ? empty : <Feature[]>[bbox.asGeoJson({ id: "range" })] | ||||
|                 ) | ||||
|                     bbox === undefined ? empty : <Feature[]>[bbox.asGeoJson({ id: "range" })], | ||||
|                 ), | ||||
|             ), | ||||
|             current_view: this.currentView, | ||||
|             favourite: this.favourites, | ||||
|  | @ -747,7 +747,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|             ShowDataLayer.showRange( | ||||
|                 this.map, | ||||
|                 new StaticFeatureSource([bbox.asGeoJson({ id: "range" })]), | ||||
|                 this.featureSwitches.featureSwitchIsTesting | ||||
|                 this.featureSwitches.featureSwitchIsTesting, | ||||
|             ) | ||||
|         } | ||||
|         const currentViewLayer = this.layout.layers.find((l) => l.id === "current_view") | ||||
|  | @ -761,7 +761,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                     currentViewLayer, | ||||
|                     this.layout, | ||||
|                     this.osmObjectDownloader, | ||||
|                     this.featureProperties | ||||
|                     this.featureProperties, | ||||
|                 ) | ||||
|             }) | ||||
|         } | ||||
|  | @ -805,7 +805,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
| 
 | ||||
|         const lastClickLayerConfig = new LayerConfig( | ||||
|             <LayerConfigJson>last_click_layerconfig, | ||||
|             "last_click" | ||||
|             "last_click", | ||||
|         ) | ||||
|         const lastClickFiltered = | ||||
|             lastClickLayerConfig.isShown === undefined | ||||
|  | @ -813,11 +813,11 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|                 : specialLayers.last_click.features.mapD((fs) => | ||||
|                     fs.filter((f) => { | ||||
|                         const matches = lastClickLayerConfig.isShown.matchesProperties( | ||||
|                               f.properties | ||||
|                             f.properties, | ||||
|                         ) | ||||
|                           console.log("LastClick ", f, "matches", matches) | ||||
|                         console.debug("LastClick ", f, "matches", matches) | ||||
|                         return matches | ||||
|                       }) | ||||
|                     }), | ||||
|                 ) | ||||
|         new ShowDataLayer(this.map, { | ||||
|             features: new StaticFeatureSource(lastClickFiltered), | ||||
|  | @ -863,7 +863,7 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|             this.mapProperties.rasterLayer, | ||||
|             this.availableLayers, | ||||
|             this.featureSwitches.backgroundLayerId, | ||||
|             this.userRelatedState.preferredBackgroundLayer | ||||
|             this.userRelatedState.preferredBackgroundLayer, | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
|  | @ -872,8 +872,14 @@ export default class ThemeViewState implements SpecialVisualizationState { | |||
|         this.selectedElement.setData(this.currentView.features?.data?.[0]) | ||||
|     } | ||||
| 
 | ||||
|     public async reportError(message: string | Error) { | ||||
|     public async reportError(message: string | Error | XMLHttpRequest) { | ||||
|         console.log(">>> Reporting error to", Constants.ErrorReportServer, message) | ||||
| 
 | ||||
|         if ("" + message === "[object XMLHttpRequest]") { | ||||
|             const req = <XMLHttpRequest>message | ||||
|             message = "XMLHttpRequest with status code " + req.status + ", " + req.statusText | ||||
|         } | ||||
| 
 | ||||
|         let stacktrace: string = new Error().stack | ||||
| 
 | ||||
|         await fetch(Constants.ErrorReportServer, { | ||||
|  |  | |||
|  | @ -976,7 +976,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be | |||
|                 } | ||||
|             } | ||||
|             xhr.send(content) | ||||
|             xhr.onerror = reject | ||||
|             xhr.onerror = (ev: ProgressEvent<EventTarget>) => reject("Could not get "+url+", xhr status code is "+xhr.status+" ("+xhr.statusText+")") | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|  | @ -1069,8 +1069,8 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be | |||
|     ): Promise<{ content: T } | { error: string; url: string; statuscode?: number }> { | ||||
|         const injected = Utils.injectedDownloads[url] | ||||
|         if (injected !== undefined) { | ||||
|             console.log("Using injected resource for test for URL", url) | ||||
|             return new Promise((resolve) => resolve({ content: injected })) | ||||
|             console.debug("Using injected resource for test for URL", url) | ||||
|             return {content: injected} | ||||
|         } | ||||
|         const result = await Utils.downloadAdvanced( | ||||
|             url, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue