(function($){ function initialize_field( $el ) { var mapDOM = $el.find('.mapbox-geojson-map'); var inputField = $el.find('.mapbox-geojson-field'); var settings = { accessToken: mapDOM.attr('data-access-token'), mapId: mapDOM.attr('data-map-id'), }; var setValue = function(value) { $(inputField).val(value); }; var jsonData = { type: "FeatureCollection", features: [], }; try { var existingData = JSON.parse($(inputField).val()); jsonData = existingData } catch (err) { setValue(JSON.stringify(jsonData)); } if( settings.accessToken && settings.mapId ) { var map = L.mapbox.map(mapDOM[0], settings.mapId, settings); var editableLayer = L.mapbox.featureLayer(jsonData, settings).addTo(map); if( jsonData.features.length ) { map.fitBounds(editableLayer.getBounds()); } else { map.setView([0, 0], 1); } var drawControl = new L.Control.Draw({ draw: { polyline: { shapeOptions: { color: '#000000', }, }, polygon: { shapeOptions: { color: '#000000', }, }, marker: true, circle: false, rectangle: { shapeOptions: { color: '#000000', }, }, }, edit: { featureGroup: editableLayer, edit: false, remove: false, }, }).addTo(map); var sidebar = initialize_sidebar( $el, map, editableLayer ); map.on('draw:created', function(e) { editableLayer.addLayer(e.layer); sidebar.addLayerControl(e.layerType, e.layer); }) .on('draw:created draw:edited draw:deleted sidebareditor:edited sidebareditor:deleted', function(e) { setValue(JSON.stringify(editableLayer.toGeoJSON())); }) .on('mouseover', function(e) { if(!sidebar.hasBounced && !sidebar.isOpen) { sidebar.bounce(); } }); editableLayer.eachLayer(function(layer) { var type = false; switch(layer.feature.geometry.type) { case 'Point': type = 'marker'; break; case 'LineString': type= 'polyline'; break; case 'Polygon': type = 'polygon'; break; } if( type ) { var control = sidebar.addLayerControl(type, layer); layer.on('click', function(e) { sidebar.open(); control.enable(); }); } }); } else { // TODO: display an error in mapDOM console.log('mapbox-geojson-err-1'); } } function initialize_sidebar( $el, map, featureGroup ) { var sidebarDOM = $el.find('.mbgs'); var toggle = sidebarDOM.find('.mbgs-toggle'); var sidebar = { domref: sidebarDOM, body: sidebarDOM.find('.mbgs-body'), isOpen: sidebarDOM.hasClass('mbgs-open'), map: map, featureGroup: featureGroup, hasBounced: false, bounce: function() { this.hasBounced = true; }, toggle: function() { this.domref.toggleClass('mbgs-open'); this.isOpen = this.domref.hasClass('mbgs-open'); if(!this.isOpen) { this._disableEditing(); this.body.find('.mbgs-tray-item-active').removeClass('mbgs-tray-item-active'); } }, close: function() { this.domref.removeClass('mbgs-open'); this.isOpen = false; this._disableEditing(); this.body.find('.mbgs-tray-item-active').removeClass('mbgs-tray-item-active'); }, open: function() { this.domref.addClass('mbgs-open'); this.isOpen = true; }, _disableEditing: function() { this.layerControls.forEach(function(control) { control._control.removeClass('mbgs-tray-item-active'); control._disableEdit(); }); }, _panTo: function(latLng) { if( this.isOpen ) { var targetPoint = this.map.project(latLng).add([250 / 2, 0]); var targetLatLng = map.unproject(targetPoint); this.map.panTo(targetLatLng); } else { this.map.panTo(latLng); } }, _createTrayItem: function(type) { var trayItem = ''; trayItem += '
'; trayItem += ' '; trayItem += ' '; trayItem += ' ' + type + ''; trayItem += ' '; trayItem += ' '; trayItem += '
'; return $(trayItem); }, addLayerControl: function(layerType, layer) { var sidebar = this; var layerControl = { type: layerType, layer: layer, map: sidebar.map, sidebar: sidebar, enabled: false, enable: function() { this.sidebar._disableEditing(); this._enableEdit(); this._control.addClass('mbgs-tray-item-active'); this.enabled = true; }, disable: function() { this._disableEdit(); this._control.removeClass('mbgs-tray-item-active'); this.enabled = false; }, toggle: function() { this._control.toggleClass('mbgs-tray-item-active'); if( this.enabled ) { this.disable(); } else { this.enable(); } }, _control: null, _enableEdit: function(){}, _disableEdit: function(){}, _init: function() { var self = this; if( self.type == 'marker' ) { self.layer.on('dragend', function(e) { self.map.fire('sidebareditor:edited', self.layer); }); self._enableEdit = function() { self.sidebar._panTo(self.layer.getLatLng()); self.layer.dragging.enable(); }; self._disableEdit = function() { self.layer.dragging.disable(); }; } else if(['polyline', 'polygon', 'rectangle'].indexOf(self.type) > -1) { self.layer.on('edit', function(e) { self.map.fire('sidebareditor:edited', self.layer); }); self.type = (self.type == 'rectangle') ? 'polygon' : self.type; self._enableEdit = function() { self.sidebar._panTo(self.layer.getBounds().getCenter()); self.layer.editing.enable(); }; self._disableEdit = function() { self.layer.editing.disable(); }; } var control = self.sidebar._createTrayItem(self.type); self.sidebar.body.append(control); self._control = control; control.find('.mbgs-tray-item-header').on('click', function(e) { self.sidebar._disableEditing(); var clickedTrayItem = $(this).parent('.mbgs-tray-item'); clickedTrayItem.toggleClass('mbgs-tray-item-active'); if( clickedTrayItem.hasClass('mbgs-tray-item-active') ) { self._enableEdit(); } }); control.find('.mbgs-delete-feature').on('click', function(e) { e.stopPropagation(); e.preventDefault(); self.sidebar.featureGroup.removeLayer(layer); control.remove(); self.map.fire('sidebareditor:deleted', layer); }); return self; } }; var initialized = layerControl._init(); sidebar.layerControls.push(initialized); return initialized; }, layerControls: [], }; toggle.on('click', function(e) { sidebar.toggle(); }); return sidebar; } if( typeof acf.add_action !== 'undefined' ) { /* * ready append (ACF5) * * These are 2 events which are fired during the page load * ready = on page load similar to $(document).ready() * append = on new DOM elements appended via repeater field * * @type event * @date 20/07/13 * * @param $el (jQuery selection) the jQuery element which contains the ACF fields * @return n/a */ acf.add_action('ready append', function( $el ){ // search $el for fields of type 'mapbox_geojson' acf.get_fields({ type : 'mapbox_geojson'}, $el).each(function(){ initialize_field( $(this) ); }); }); } else { /* * acf/setup_fields (ACF4) * * This event is triggered when ACF adds any new elements to the DOM. * * @type function * @since 1.0.0 * @date 01/01/12 * * @param event e: an event object. This can be ignored * @param Element postbox: An element which contains the new HTML * * @return n/a */ $(document).on('acf/setup_fields', function(e, postbox){ $(postbox).find('.field[data-field_type="mapbox_geojson"]').each(function(){ initialize_field( $(this) ); }); }); } })(jQuery);