Feature(create_copy): add layer filter lock

This commit is contained in:
Pieter Vander Vennet 2025-07-10 16:53:12 +02:00
parent 6a200e04bc
commit d78207c98a
3 changed files with 48 additions and 2 deletions

View file

@ -24,7 +24,9 @@ export default class FilteredLayer {
/**
* Indicates if some filter is set.
* If this is the case, adding a new element of this type might be a bad idea
* If this is the case, adding a new element of this type might be a bad idea.
*
* Does not include the global filters
*/
readonly hasFilter: Store<boolean>

View file

@ -72,6 +72,12 @@ export class MenuState {
}
})
}
this.pageStates.filter.addCallback(opened => {
if(!opened){
this.highlightedLayerInFilters.set(undefined)
}
})
}
public openMenuIfNeeded(shouldShowWelcomeMessage: boolean, themeid: string) {

View file

@ -22,6 +22,9 @@
import Loading from "../../Base/Loading.svelte"
import CreateNewNodeAction from "../../../Logic/Osm/Actions/CreateNewNodeAction"
import DocumentDuplicate from "@babeard/svelte-heroicons/solid/DocumentDuplicate"
import type { GlobalFilter } from "../../../Models/GlobalFilter"
import { EyeOffIcon } from "@rgossiaux/svelte-heroicons/solid"
import Layers from "../../../assets/svg/Layers.svelte"
export let state: ThemeViewState
export let layer: LayerConfig
@ -46,6 +49,8 @@
let creatingCopy = new UIEventSource(false)
const t = Translations.t.copy
let globalFilter: UIEventSource<GlobalFilter[]> = state.layerState.globalFilters
let hasFilter = state.layerState.filteredLayers.get(layer.id).hasFilter
async function createCopy() {
creatingCopy.set(true)
@ -84,12 +89,45 @@
state.mapProperties.location.setData(location)
}
async function abort(){
showPopup.set(false)
}
</script>
<Popup shown={showPopup} fullscreen>
<Tr slot="header" t={t.title} />
{#if $creatingCopy}
{#if $globalFilter?.length >0 }
{#if $hasFilter}
<!-- Some filters are enabled. The feature to add might already be mapped, but hidden -->
<div class="alert flex items-center justify-center">
<EyeOffIcon class="w-8" />
<Tr t={Translations.t.general.add.disableFiltersExplanation} />
</div>
<div class="flex flex-wrap-reverse md:flex-nowrap">
<button
class="primary flex w-full gap-x-1"
on:click={() => {
abort()
state.layerState.filteredLayers.get(layer.id).disableAllFilters()
}}
>
<EyeOffIcon class="w-12" />
<Tr t={Translations.t.general.add.disableFilters} />
</button>
<button
class="flex w-full gap-x-1"
on:click={() => {
abort()
state.guistate.openFilterView(layer)
}}
>
<Layers class="w-12" />
<Tr t={Translations.t.general.add.openLayerControl} />
</button>
</div>
{:else if $creatingCopy}
<div class="h-full flex flex-col justify-center">
<div class="h-fit flex justify-center">
<Loading>