11import { Controller } from '@hotwired/stimulus'
22import { mapChannel } from 'channels/map_channel'
3- import { map , upsert , mapProperties , removeGeoJSONSource } from 'maplibre/map'
3+ import { map , upsert , mapProperties , removeGeoJSONSource , setLayerVisibility } from 'maplibre/map'
44import { initLayersModal } from 'maplibre/controls/shared'
55import { uploadImageToFeature , confirmImageLocation } from 'maplibre/feature'
66import { status } from 'helpers/status'
@@ -200,6 +200,39 @@ export default class extends Controller {
200200 list . classList . toggle ( 'hidden' )
201201 }
202202
203+ toggleLayerVisibility ( event ) {
204+ event . preventDefault ( )
205+ dom . closeTooltips ( )
206+ const layerElement = event . target . closest ( '.layer-item' )
207+ const layerId = layerElement . getAttribute ( 'data-layer-id' )
208+ const layer = layers . find ( l => l . id === layerId )
209+ const wasVisible = layer . show !== false
210+ layer . show = ! wasVisible
211+
212+ setLayerVisibility ( layer . type + '-source-' + layerId , layer . show )
213+
214+ // update UI
215+ const icon = layerElement . querySelector ( 'button.layer-visibility i' )
216+ if ( layer . show ) {
217+ icon . classList . replace ( 'bi-eye-slash' , 'bi-eye' )
218+ layerElement . classList . remove ( 'opacity-50' )
219+ } else {
220+ icon . classList . replace ( 'bi-eye' , 'bi-eye-slash' )
221+ layerElement . classList . add ( 'opacity-50' )
222+ }
223+
224+ // when showing: initialize styles (and load data for overpass/wikipedia if needed)
225+ if ( layer . show ) {
226+ initializeLayerStyles ( layerId )
227+ }
228+
229+ // sync to server only in rw mode
230+ if ( window . gon . map_mode === "rw" ) {
231+ const { geojson : _geojson , ...sendLayer } = layer
232+ mapChannel . send_message ( 'update_layer' , sendLayer )
233+ }
234+ }
235+
203236 createWikipediaLayer ( ) {
204237 this . createLayer ( 'wikipedia' , 'Wikipedia' , '' )
205238 }
@@ -221,7 +254,7 @@ export default class extends Controller {
221254 createLayer ( type , name , query ) {
222255 let layerId = functions . featureId ( )
223256 // must match server attribute order, for proper comparison in map_channel
224- let layer = { "id" : layerId , "type" : type , "name" : name , "heatmap" : false , "cluster" : true }
257+ let layer = { "id" : layerId , "type" : type , "name" : name , "heatmap" : false , "cluster" : true , "show" : true }
225258 if ( type == 'overpass' ) {
226259 layer [ "query" ] = query
227260 // TODO: move cluster + heatmap to layer checkboxes
0 commit comments