UNPKG

mohsen-angular-leaflet-directive

Version:

angular-leaflet-directive - An AngularJS directive to easily interact with Leaflet maps

169 lines (150 loc) 6.26 kB
angular.module('leaflet-directive') .factory('LeafletEventsHelpersFactory', function($rootScope, $q, leafletLogger, leafletHelpers) { var safeApply = leafletHelpers.safeApply; var isDefined = leafletHelpers.isDefined; var isObject = leafletHelpers.isObject; var isArray = leafletHelpers.isArray; var EventsHelper = function(rootBroadcastName, lObjectType) { this.rootBroadcastName = rootBroadcastName; //used to path/key out certain properties based on the type , "markers", "geojson" this.lObjectType = lObjectType; }; EventsHelper.prototype.getAvailableEvents = function() {return [];}; /* argument: name: Note this can be a single string or dot notation Example: markerModel : { m1: { lat:_, lon: _} } //would yield name of name = "m1" If nested: markerModel : { cars: { m1: { lat:_, lon: _} } } //would yield name of name = "cars.m1" */ EventsHelper.prototype.genDispatchEvent = function(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName, extra) { var _this = this; maybeMapId = maybeMapId || ''; if (maybeMapId) { maybeMapId = '.' + maybeMapId; } return function(e) { var broadcastName = _this.rootBroadcastName + maybeMapId + '.' + eventName; _this.fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName, extra); }; }; EventsHelper.prototype.fire = function(scope, broadcastName, logic, event, lObject, model, modelName, layerName) { // Safely broadcast the event safeApply(scope, function() { var toSend = { leafletEvent: event, leafletObject: lObject, modelName: modelName, model: model, }; if (isDefined(layerName)) { angular.extend(toSend, {layerName: layerName}); } if (logic === 'emit') { scope.$emit(broadcastName, toSend); } else { $rootScope.$broadcast(broadcastName, toSend); } }); }; EventsHelper.prototype.bindEvents = function(maybeMapId, lObject, name, model, leafletScope, layerName, extra) { var events = []; var logic = 'emit'; var _this = this; if (!isDefined(leafletScope.eventBroadcast)) { // Backward compatibility, if no event-broadcast attribute, all events are broadcasted events = this.getAvailableEvents(); } else if (!isObject(leafletScope.eventBroadcast)) { // Not a valid object leafletLogger.error('event-broadcast must be an object check your model.'); } else { // We have a possible valid object if (!isDefined(leafletScope.eventBroadcast[_this.lObjectType])) { // We do not have events enable/disable do we do nothing (all enabled by default) events = this.getAvailableEvents(); } else if (!isObject(leafletScope.eventBroadcast[_this.lObjectType])) { // Not a valid object leafletLogger.warn('event-broadcast.' + [_this.lObjectType] + ' must be an object check your model.'); } else { // We have a possible valid map object // Event propadation logic if (isDefined(leafletScope.eventBroadcast[this.lObjectType].logic)) { // We take care of possible propagation logic if (leafletScope.eventBroadcast[_this.lObjectType].logic !== 'emit' && leafletScope.eventBroadcast[_this.lObjectType].logic !== 'broadcast') { leafletLogger.warn('Available event propagation logic are: \'emit\' or \'broadcast\'.'); } } // Enable / Disable var eventsEnable = false; var eventsDisable = false; if (isDefined(leafletScope.eventBroadcast[_this.lObjectType].enable) && isArray(leafletScope.eventBroadcast[_this.lObjectType].enable)) { eventsEnable = true; } if (isDefined(leafletScope.eventBroadcast[_this.lObjectType].disable) && isArray(leafletScope.eventBroadcast[_this.lObjectType].disable)) { eventsDisable = true; } if (eventsEnable && eventsDisable) { // Both are active, this is an error leafletLogger.warn('can not enable and disable events at the same time'); } else if (!eventsEnable && !eventsDisable) { // Both are inactive, this is an error leafletLogger.warn('must enable or disable events'); } else { // At this point the object is OK, lets enable or disable events if (eventsEnable) { // Enable events leafletScope.eventBroadcast[this.lObjectType].enable.forEach(function(eventName) { // Do we have already the event enabled? if (events.indexOf(eventName) !== -1) { // Repeated event, this is an error leafletLogger.warn('This event ' + eventName + ' is already enabled'); } else { // Does the event exists? if (_this.getAvailableEvents().indexOf(eventName) === -1) { // The event does not exists, this is an error leafletLogger.warn('This event ' + eventName + ' does not exist'); } else { // All ok enable the event events.push(eventName); } } }); } else { // Disable events events = this.getAvailableEvents(); leafletScope.eventBroadcast[_this.lObjectType].disable.forEach(function(eventName) { var index = events.indexOf(eventName); if (index === -1) { // The event does not exist leafletLogger.warn('This event ' + eventName + ' does not exist or has been already disabled'); } else { events.splice(index, 1); } }); } } } } events.forEach(function(eventName) { lObject.on(eventName, _this.genDispatchEvent(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName, extra)); }); return logic; }; return EventsHelper; }) .service('leafletEventsHelpers', function(LeafletEventsHelpersFactory) { return new LeafletEventsHelpersFactory(); });