UNPKG

ui.leaflet.webpack

Version:

Webpack version of ui-leaflet (https://github.com/angular-ui/ui-leaflet)

167 lines (152 loc) 8.18 kB
angular.module('ui-leaflet') .factory('leafletEventsHelpersFactory', /** @ngInject */ [ '$rootScope', '$q', 'leafletLogger', 'leafletHelpers', function ($rootScope, $q, leafletLogger, leafletHelpers) { var safeApply = leafletHelpers.safeApply, isDefined = leafletHelpers.isDefined, isObject = leafletHelpers.isObject, isArray = leafletHelpers.isArray, errorHeader = leafletHelpers.errorHeader, $log = leafletLogger; var EventsHelper = function(rootBroadcastName, lObjectType){ this.rootBroadcastName = rootBroadcastName; $log.debug("leafletEventsHelpersFactory: lObjectType: " + lObjectType + "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; $log.debug(broadcastName); _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, extra){ // 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 $log.error(errorHeader + "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 $log.warn(errorHeader + '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") $log.warn(errorHeader + "Available event propagation logic are: 'emit' or 'broadcast'."); } // Enable / Disable var eventsEnable = false, 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 $log.warn(errorHeader + "can not enable and disable events at the same time"); } else if (!eventsEnable && !eventsDisable) { // Both are inactive, this is an error $log.warn(errorHeader + "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 $log.warn(errorHeader + "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 $log.warn(errorHeader + "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 $log.warn(errorHeader + "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', /** @ngInject */ ['leafletEventsHelpersFactory', function(leafletEventsHelpersFactory){ return new leafletEventsHelpersFactory(); }]);