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
 | 
						|
            }
 | 
						|
        )
 | 
						|
    }
 | 
						|
}
 |