forked from MapComplete/MapComplete
		
	Exporting CSV/Geojson now respects filters + refactoring away State.state
This commit is contained in:
		
							parent
							
								
									5696b80a5e
								
							
						
					
					
						commit
						f0675a026b
					
				
					 4 changed files with 97 additions and 23 deletions
				
			
		|  | @ -13,15 +13,16 @@ import {UIEventSource} from "../../Logic/UIEventSource"; | |||
| import SimpleMetaTagger from "../../Logic/SimpleMetaTagger"; | ||||
| import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; | ||||
| import {BBox} from "../../Logic/BBox"; | ||||
| import FilteredLayer, {FilterState} from "../../Models/FilteredLayer"; | ||||
| 
 | ||||
| export class DownloadPanel extends Toggle { | ||||
| 
 | ||||
|     constructor() { | ||||
|         const state: { | ||||
|             featurePipeline: FeaturePipeline, | ||||
|             layoutToUse: LayoutConfig, | ||||
|             currentBounds: UIEventSource<BBox> | ||||
|         } = State.state | ||||
|     constructor(state: { | ||||
|         filteredLayers: UIEventSource<FilteredLayer[]> | ||||
|         featurePipeline: FeaturePipeline, | ||||
|         layoutToUse: LayoutConfig, | ||||
|         currentBounds: UIEventSource<BBox> | ||||
|     }) { | ||||
| 
 | ||||
| 
 | ||||
|         const t = Translations.t.general.download | ||||
|  | @ -34,7 +35,7 @@ export class DownloadPanel extends Toggle { | |||
|         const buttonGeoJson = new SubtleButton(Svg.floppy_ui(), | ||||
|             new Combine([t.downloadGeojson.Clone().SetClass("font-bold"), | ||||
|                 t.downloadGeoJsonHelper.Clone()]).SetClass("flex flex-col")) | ||||
|             .onClick(() => { | ||||
|             .OnClickWithLoading(t.exporting,async () => { | ||||
|                 const geojson = DownloadPanel.getCleanGeoJson(state, metaisIncluded.data) | ||||
|                 Utils.offerContentsAsDownloadableFile(JSON.stringify(geojson, null, "  "), | ||||
|                     `MapComplete_${name}_export_${new Date().toISOString().substr(0, 19)}.geojson`, { | ||||
|  | @ -46,7 +47,7 @@ export class DownloadPanel extends Toggle { | |||
|         const buttonCSV = new SubtleButton(Svg.floppy_ui(), new Combine( | ||||
|             [t.downloadCSV.Clone().SetClass("font-bold"), | ||||
|                 t.downloadCSVHelper.Clone()]).SetClass("flex flex-col")) | ||||
|             .onClick(() => { | ||||
|             .OnClickWithLoading(t.exporting, async () => { | ||||
|                 const geojson = DownloadPanel.getCleanGeoJson(state, metaisIncluded.data) | ||||
|                 const csv = GeoOperations.toCSV(geojson.features) | ||||
| 
 | ||||
|  | @ -72,13 +73,41 @@ export class DownloadPanel extends Toggle { | |||
| 
 | ||||
|     private static getCleanGeoJson(state: { | ||||
|         featurePipeline: FeaturePipeline, | ||||
|         currentBounds: UIEventSource<BBox> | ||||
|         currentBounds: UIEventSource<BBox>, | ||||
|         filteredLayers: UIEventSource<FilteredLayer[]> | ||||
|     }, includeMetaData: boolean) { | ||||
| 
 | ||||
|         const resultFeatures = [] | ||||
|         const featureList = state.featurePipeline.GetAllFeaturesWithin(state.currentBounds.data); | ||||
|         const neededLayers = state.filteredLayers.data.map(l => l.layerDef.id) | ||||
|         const bbox = state.currentBounds.data | ||||
|         const featureList = state.featurePipeline.GetAllFeaturesAndMetaWithin(bbox, new Set(neededLayers)); | ||||
|         for (const tile of featureList) { | ||||
|             for (const feature of tile) { | ||||
|             const layer = state.filteredLayers.data.find(fl => fl.layerDef.id === tile.layer) | ||||
|             const filters = layer.appliedFilters.data | ||||
|             for (const feature of tile.features) { | ||||
|                  | ||||
|                 if(!bbox.overlapsWith(BBox.get(feature))){ | ||||
|                     continue | ||||
|                 } | ||||
|                  | ||||
| 
 | ||||
|                 if (filters !== undefined) { | ||||
|                     let featureDoesMatchAllFilters = true; | ||||
|                     for (let key of Array.from(filters.keys())) { | ||||
|                         const filter: FilterState = filters.get(key) | ||||
|                         if(filter?.currentFilter === undefined){ | ||||
|                             continue | ||||
|                         } | ||||
|                         if (!filter.currentFilter.matchesProperties(feature.properties)) { | ||||
|                             featureDoesMatchAllFilters = false; | ||||
|                             break | ||||
|                         } | ||||
|                     } | ||||
|                     if(!featureDoesMatchAllFilters){ | ||||
|                         continue; // the outer loop
 | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 const cleaned = { | ||||
|                     type: feature.type, | ||||
|                     geometry: feature.geometry, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue