@@ -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,22 +158,19 @@ 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 ) {
169167 event . preventDefault ( )
170168 const layerId = event . target . closest ( '.layer-item' ) . getAttribute ( 'data-layer-id' )
171169 functions . e ( '#layer-reload' , e => { e . classList . add ( 'hidden' ) } )
172170 functions . e ( '#layer-loading' , e => { e . classList . remove ( 'hidden' ) } )
173- event . target . closest ( '.layer-item' ) . querySelector ( '.reload-icon' ) . classList . add ( 'layer-refresh-animate' )
174171 loadLayerData ( layerId ) . then ( ( ) => {
175172 initLayersModal ( )
176173 functions . e ( '#layer-loading' , e => { e . classList . add ( 'hidden' ) } )
177- functions . e ( `#layer-list-${ layerId } .reload-icon` , e => { e . classList . remove ( 'layer-refresh-animate' ) } )
178174 } )
179175 }
180176
@@ -209,7 +205,7 @@ export default class extends Controller {
209205 const wasVisible = layer . show !== false
210206 layer . show = ! wasVisible
211207
212- setLayerVisibility ( layer . type + '-source-' + layerId , layer . show )
208+ setLayerVisibility ( layer . sourceId , layer . show )
213209
214210 // update UI (both desktop and mobile visibility buttons)
215211 layerElement . querySelectorAll ( 'button.layer-visibility i, button.layer-visibility-mobile i' ) . forEach ( icon => {
@@ -240,13 +236,12 @@ export default class extends Controller {
240236
241237 // sync to server only in rw mode
242238 if ( window . gon . map_mode === "rw" ) {
243- const { geojson : _geojson , ...sendLayer } = layer
244- mapChannel . send_message ( 'update_layer' , sendLayer )
239+ mapChannel . send_message ( 'update_layer' , layer . toJSON ( ) )
245240 }
246241 }
247242
248243 createWikipediaLayer ( ) {
249- this . createLayer ( 'wikipedia' , 'Wikipedia' , '' )
244+ this . createLayer ( 'wikipedia' , 'Wikipedia' )
250245 }
251246
252247 createSelectedOverpassLayer ( event ) {
@@ -263,25 +258,29 @@ export default class extends Controller {
263258 }
264259 }
265260
266- createLayer ( type , name , query ) {
261+ createBaseMapLayer ( _event ) {
262+ this . createLayer ( 'basemap' , 'Basemap layer' )
263+ }
264+
265+ createLayer ( type , name , query = null ) {
267266 let layerId = functions . featureId ( )
268267 // 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 }
268+ let layerData = { "id" : layerId , "type" : type , "name" : name , "heatmap" : false , "cluster" : true , "show" : true }
270269 if ( type == 'overpass' ) {
271- layer [ "query" ] = query
270+ layerData [ "query" ] = query
272271 // 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" )
272+ const clustered = ! layerData . query . includes ( "heatmap=true" ) &&
273+ ! layerData . query . includes ( "cluster=false" ) &&
274+ ! layerData . query . includes ( "geom" ) // clustering breaks lines & geometries
275+ layerData [ "cluster" ] = clustered
276+ layerData [ "heatmap" ] = layerData . query . includes ( "heatmap=true" )
278277 }
278+ let layer = createLayerInstance ( layerData )
279279 layers . push ( layer )
280+ initLayersModal ( )
280281 initializeLayerSources ( layerId )
281282 initializeLayerStyles ( layerId )
282- mapChannel . send_message ( 'new_layer' , layer )
283- initLayersModal ( )
284- document . querySelector ( '#layer-list-' + layerId + ' .reload-icon' ) . classList . add ( 'layer-refresh-animate' )
283+ mapChannel . send_message ( 'new_layer' , layerData )
285284 return layerId
286285 }
287286
@@ -291,12 +290,11 @@ export default class extends Controller {
291290 dom . closeTooltips ( )
292291 const layerElement = event . target . closest ( '.layer-item' )
293292 const layerId = layerElement . getAttribute ( 'data-layer-id' )
294- const layerType = layerElement . getAttribute ( 'data-layer-type' )
295293 const layer = layers . find ( f => f . id === layerId )
296- const { geojson : _geojson , ... sendLayer } = layer
294+ layer . cleanup ( )
297295 layers . splice ( layers . indexOf ( layer ) , 1 )
298- removeGeoJSONSource ( layerType + '-source-' + layerId )
299- mapChannel . send_message ( 'delete_layer' , sendLayer )
296+ removeGeoJSONSource ( layer . sourceId )
297+ mapChannel . send_message ( 'delete_layer' , layer . toJSON ( ) )
300298 initLayersModal ( )
301299 }
302300}
0 commit comments