forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			90 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { UIEventSource } from "../Logic/UIEventSource"
 | |
| import LayerConfig from "./ThemeConfig/LayerConfig"
 | |
| import { OsmConnection } from "../Logic/Osm/OsmConnection"
 | |
| import { LocalStorageSource } from "../Logic/Web/LocalStorageSource"
 | |
| import { QueryParameters } from "../Logic/Web/QueryParameters"
 | |
| 
 | |
| export default class FilteredLayer {
 | |
|     /**
 | |
|      * Wether or not the specified layer is shown
 | |
|      */
 | |
|     readonly isDisplayed: UIEventSource<boolean>
 | |
|     /**
 | |
|      * Maps the filter.option.id onto the actual used state
 | |
|      */
 | |
|     readonly appliedFilters: Map<string, UIEventSource<undefined | number | string>>
 | |
|     readonly layerDef: LayerConfig
 | |
| 
 | |
|     constructor(
 | |
|         layer: LayerConfig,
 | |
|         appliedFilters?: Map<string, UIEventSource<undefined | number | string>>,
 | |
|         isDisplayed?: UIEventSource<boolean>
 | |
|     ) {
 | |
|         this.layerDef = layer
 | |
|         this.isDisplayed = isDisplayed ?? new UIEventSource(true)
 | |
|         this.appliedFilters =
 | |
|             appliedFilters ?? new Map<string, UIEventSource<number | string | undefined>>()
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Creates a FilteredLayer which is tied into the QueryParameters and/or user preferences
 | |
|      */
 | |
|     public static initLinkedState(
 | |
|         layer: LayerConfig,
 | |
|         context: string,
 | |
|         osmConnection: OsmConnection
 | |
|     ) {
 | |
|         let isDisplayed: UIEventSource<boolean>
 | |
|         if (layer.syncSelection === "local") {
 | |
|             isDisplayed = LocalStorageSource.GetParsed(
 | |
|                 context + "-layer-" + layer.id + "-enabled",
 | |
|                 layer.shownByDefault
 | |
|             )
 | |
|         } else if (layer.syncSelection === "theme-only") {
 | |
|             isDisplayed = FilteredLayer.getPref(
 | |
|                 osmConnection,
 | |
|                 context + "-layer-" + layer.id + "-enabled",
 | |
|                 layer
 | |
|             )
 | |
|         } else if (layer.syncSelection === "global") {
 | |
|             isDisplayed = FilteredLayer.getPref(
 | |
|                 osmConnection,
 | |
|                 "layer-" + layer.id + "-enabled",
 | |
|                 layer
 | |
|             )
 | |
|         } else {
 | |
|             isDisplayed = QueryParameters.GetBooleanQueryParameter(
 | |
|                 "layer-" + layer.id,
 | |
|                 layer.shownByDefault,
 | |
|                 "Whether or not layer " + layer.id + " is shown"
 | |
|             )
 | |
|         }
 | |
| 
 | |
|         const appliedFilters = new Map<string, UIEventSource<undefined | number | string>>()
 | |
|         for (const subfilter of layer.filters) {
 | |
|             appliedFilters.set(subfilter.id, subfilter.initState())
 | |
|         }
 | |
|         return new FilteredLayer(layer, appliedFilters, isDisplayed)
 | |
|     }
 | |
|     private static getPref(
 | |
|         osmConnection: OsmConnection,
 | |
|         key: string,
 | |
|         layer: LayerConfig
 | |
|     ): UIEventSource<boolean> {
 | |
|         return osmConnection.GetPreference(key, layer.shownByDefault + "").sync(
 | |
|             (v) => {
 | |
|                 if (v === undefined) {
 | |
|                     return undefined
 | |
|                 }
 | |
|                 return v === "true"
 | |
|             },
 | |
|             [],
 | |
|             (b) => {
 | |
|                 if (b === undefined) {
 | |
|                     return undefined
 | |
|                 }
 | |
|                 return "" + b
 | |
|             }
 | |
|         )
 | |
|     }
 | |
| }
 |