@@ -6,9 +6,8 @@ import { status } from 'helpers/status'
66import { flyToFeature } from 'maplibre/animations'
77import { initLayersModal } from 'maplibre/controls/shared'
88import { confirmImageLocation , uploadImageToFeature } from 'maplibre/feature'
9- import { renderGeoJSONLayer } from 'maplibre/layers/geojson'
10- import { initializeLayerSources , initializeLayerStyles , layers , loadAllLayerData , loadLayerData } from 'maplibre/layers/layers'
11- import { initializeOverpassLayers } from 'maplibre/layers/overpass'
9+ import { createLayerInstance } from 'maplibre/layers/factory'
10+ import { initializeLayerSources , initializeLayerStyles , layers , loadAllLayerData , loadLayerData , renderLayer } from 'maplibre/layers/layers'
1211import { queries } from 'maplibre/layers/queries'
1312import { map , mapProperties , removeGeoJSONSource , setLayerVisibility , upsert } from 'maplibre/map'
1413
@@ -111,7 +110,7 @@ export default class extends Controller {
111110 uploadImageToFeature ( file , feature ) . then ( ( ) => {
112111 upsert ( feature )
113112 // redraw first geojson layer
114- renderGeoJSONLayer ( layers . find ( l => l . type === 'geojson' ) . id )
113+ renderLayer ( layers . find ( l => l . type === 'geojson' ) . id )
115114 mapChannel . send_message ( 'new_feature' , { ...feature } )
116115 status ( 'Added image' )
117116 flyToFeature ( feature )
@@ -159,10 +158,9 @@ export default class extends Controller {
159158 layer [ "cluster" ] = clustered
160159 layer [ "heatmap" ] = layer . query . includes ( "heatmap=true" )
161160 event . target . closest ( '.layer-item' ) . querySelector ( '.layer-name' ) . innerHTML = layer . name
162- const { geojson : _geojson , ...sendLayer } = layer
163- mapChannel . send_message ( 'update_layer' , sendLayer )
161+ mapChannel . send_message ( 'update_layer' , layer . toJSON ( ) )
164162 event . target . closest ( '.layer-item' ) . querySelector ( '.reload-icon' ) . classList . add ( 'layer-refresh-animate' )
165- initializeOverpassLayers ( layerId )
163+ layer . initialize ( ) . then ( ( ) => { initLayersModal ( ) } )
166164 }
167165
168166 refreshLayer ( event ) {
@@ -209,7 +207,7 @@ export default class extends Controller {
209207 const wasVisible = layer . show !== false
210208 layer . show = ! wasVisible
211209
212- setLayerVisibility ( layer . type + '-source-' + layerId , layer . show )
210+ setLayerVisibility ( layer . sourceId , layer . show )
213211
214212 // update UI (both desktop and mobile visibility buttons)
215213 layerElement . querySelectorAll ( 'button.layer-visibility i, button.layer-visibility-mobile i' ) . forEach ( icon => {
@@ -240,8 +238,7 @@ export default class extends Controller {
240238
241239 // sync to server only in rw mode
242240 if ( window . gon . map_mode === "rw" ) {
243- const { geojson : _geojson , ...sendLayer } = layer
244- mapChannel . send_message ( 'update_layer' , sendLayer )
241+ mapChannel . send_message ( 'update_layer' , layer . toJSON ( ) )
245242 }
246243 }
247244
@@ -266,20 +263,21 @@ export default class extends Controller {
266263 createLayer ( type , name , query ) {
267264 let layerId = functions . featureId ( )
268265 // must match server attribute order, for proper comparison in map_channel
269- let layer = { "id" : layerId , "type" : type , "name" : name , "heatmap" : false , "cluster" : true , "show" : true }
266+ let layerData = { "id" : layerId , "type" : type , "name" : name , "heatmap" : false , "cluster" : true , "show" : true }
270267 if ( type == 'overpass' ) {
271- layer [ "query" ] = query
268+ layerData [ "query" ] = query
272269 // TODO: move cluster + heatmap to layer checkboxes
273- const clustered = ! layer . query . includes ( "heatmap=true" ) &&
274- ! layer . query . includes ( "cluster=false" ) &&
275- ! layer . query . includes ( "geom" ) // clustering breaks lines & geometries
276- layer [ "cluster" ] = clustered
277- layer [ "heatmap" ] = layer . query . includes ( "heatmap=true" )
270+ const clustered = ! layerData . query . includes ( "heatmap=true" ) &&
271+ ! layerData . query . includes ( "cluster=false" ) &&
272+ ! layerData . query . includes ( "geom" ) // clustering breaks lines & geometries
273+ layerData [ "cluster" ] = clustered
274+ layerData [ "heatmap" ] = layerData . query . includes ( "heatmap=true" )
278275 }
276+ let layer = createLayerInstance ( layerData )
279277 layers . push ( layer )
280278 initializeLayerSources ( layerId )
281279 initializeLayerStyles ( layerId )
282- mapChannel . send_message ( 'new_layer' , layer )
280+ mapChannel . send_message ( 'new_layer' , layerData )
283281 initLayersModal ( )
284282 document . querySelector ( '#layer-list-' + layerId + ' .reload-icon' ) . classList . add ( 'layer-refresh-animate' )
285283 return layerId
@@ -291,12 +289,10 @@ export default class extends Controller {
291289 dom . closeTooltips ( )
292290 const layerElement = event . target . closest ( '.layer-item' )
293291 const layerId = layerElement . getAttribute ( 'data-layer-id' )
294- const layerType = layerElement . getAttribute ( 'data-layer-type' )
295292 const layer = layers . find ( f => f . id === layerId )
296- const { geojson : _geojson , ...sendLayer } = layer
297293 layers . splice ( layers . indexOf ( layer ) , 1 )
298- removeGeoJSONSource ( layerType + '-source-' + layerId )
299- mapChannel . send_message ( 'delete_layer' , sendLayer )
294+ removeGeoJSONSource ( layer . sourceId )
295+ mapChannel . send_message ( 'delete_layer' , layer . toJSON ( ) )
300296 initLayersModal ( )
301297 }
302298}
0 commit comments