diff --git a/.jscsrc b/.jscsrc index 2f4841ec..5821a918 100644 --- a/.jscsrc +++ b/.jscsrc @@ -1,3 +1,4 @@ { - "preset": "airbnb" + "preset": "airbnb", + "requireCurlyBraces": true } diff --git a/README.md b/README.md index cd81f16a..27936df6 100644 --- a/README.md +++ b/README.md @@ -4,20 +4,18 @@ Library. This software aims to easily embed maps managed by Leaflet on your project. ### [tombatossals/angular-leaflet-directive](http://github.com/tombatossals/angular-leaflet-directive) -This is a personal project, which has been coded by me helped by many people for some years. I'm evolving it frequently, actually I'm making the code transition to Leaflet 1.0 and Angular 2. If you need enterprise for older versions, sorry, I can't give you more support that my spare time allows me. If you want to help with the actual code it would be really appreciated, but first of all, please, read the * [CONTRIBUTING documentation](https://github.com/tombatossals/angular-leaflet-directive/blob/master/CONTRIBUTING.md) +This is a personal project, which has been coded by me helped by many people for some years. I'm evolving it frequently, actually I'm making the code transition to Leaflet 1.0 and Angular 2. If you need enterprise for older versions, sorry, I can't give you more support that my spare time allows me. If you want to help with the actual code it would be really appreciated, but first of all, please, read the [CONTRIBUTING documentation](https://github.com/tombatossals/angular-leaflet-directive/blob/master/CONTRIBUTING.md) [![Build Status](https://travis-ci.org/tombatossals/angular-leaflet-directive.png?branch=master)](https://travis-ci.org/tombatossals/angular-leaflet-directive) [![Dependencies](https://david-dm.org/tombatossals/angular-leaflet-directive.svg)](https://david-dm.org/tombatossals/angular-leaflet-directive)  -[![Dependencies](https://david-dm.org/tombatossals/angular-leaflet-directive/dev-status.svg)](https://david-dm.org/tombatossals/angular-leaflet-directive) [![Coverage -Status](https://coveralls.io/repos/tombatossals/angular-leaflet-directive/badge.png?branch=master)](http://tombatossals.github.io/angular-leaflet-directive/coverage/PhantomJS%201.9.7%20%28Linux%29/lcov-report/dist/angular-leaflet-directive.js.html) +[![Dependencies](https://david-dm.org/tombatossals/angular-leaflet-directive/dev-status.svg)](https://david-dm.org/tombatossals/angular-leaflet-directive) [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) ### [angular-ui](http://github.com/angular-ui/ui-leaflet) If you need better response time with your doubts and needs with the code of version 0.9.0, take a look at the [angular-ui](http://github.com/angular-ui/ui-leaflet) fork of this project, it's lead by really awesome developers which have helped me evolving the project for some time. [![Build Status](https://travis-ci.org/angular-ui/ui-leaflet.png?branch=master)](https://travis-ci.org/angular-ui/ui-leaflet) [![Dependencies](https://david-dm.org/angular-ui/ui-leaflet.svg)](https://david-dm.org/angular-ui/ui-leaflet)  -[![Dependencies](https://david-dm.org/angular-ui/ui-leaflet/dev-status.svg)](https://david-dm.org/angular-ui/ui-leaflet) [![Coverage -Status](https://coveralls.io/repos/angular-ui/ui-leaflet/badge.png?branch=master)](http://realtymaps.github.io/ui-leaflet/coverage/PhantomJS%201.9.7%20%28Linux%29/lcov-report/dist/ui-leaflet.js.html) +[![Dependencies](https://david-dm.org/angular-ui/ui-leaflet/dev-status.svg)](https://david-dm.org/angular-ui/ui-leaflet) ## Examples @@ -44,11 +42,11 @@ interacting on the scope and on the leaflet map in two-way binding. Example: ```javascript angular.extend($scope, { - center: { - lat: 51.505, - lng: -0.09, - zoom: 8 - } + center: { + lat: 51.505, + lng: -0.09, + zoom: 8 + } }); ``` diff --git a/dist/angular-leaflet-directive.js b/dist/angular-leaflet-directive.js index b4e92c96..6b84007e 100644 --- a/dist/angular-leaflet-directive.js +++ b/dist/angular-leaflet-directive.js @@ -28,7 +28,7 @@ */ /*! -* angular-leaflet-directive 2015-11-06 +* angular-leaflet-directive 0.10.1 2015-11-13 * angular-leaflet-directive - An AngularJS directive to easily interact with Leaflet maps * git: https://github.com/tombatossals/angular-leaflet-directive */ @@ -39,20 +39,18 @@ angular.module('leaflet-directive', []).directive('leaflet', ["$q", "leafletData restrict: 'EA', replace: true, scope: { - center: '=', - lfCenter: '=', - defaults: '=', - maxbounds: '=', - bounds: '=', - markers: '=', - legend: '=', - geojson: '=', - paths: '=', - tiles: '=', - layers: '=', - controls: '=', - decorations: '=', - eventBroadcast: '=', + center: '=lfCenter', + defaults: '=lfDefaults', + maxbounds: '=lfMaxbounds', + bounds: '=lfBounds', + markers: '=lfMarkers', + geojson: '=lfGeojson', + paths: '=lfPaths', + tiles: '=lfTiles', + layers: '=lfLayers', + controls: '=lfControls', + decorations: '=lfDecorations', + events: '=lfEvents', markersWatchOptions: '=', geojsonWatchOptions: '=', }, @@ -131,12 +129,12 @@ angular.module('leaflet-directive', []).directive('leaflet', ["$q", "leafletData var map = new L.Map(element[0], leafletMapDefaults.getMapCreationDefaults(attrs.id)); ctrl._leafletMap.resolve(map); - if (!isDefined(attrs.center) && !isDefined(attrs.lfCenter)) { + if (!isDefined(attrs.lfCenter)) { map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); } // If no layers nor tiles defined, set the default tileLayer - if (!isDefined(attrs.tiles) && (!isDefined(attrs.layers))) { + if (!isDefined(attrs.lfTiles) && (!isDefined(attrs.lfLayers))) { var tileLayerObj = L.tileLayer(defaults.tileLayer, defaults.tileLayerOptions); tileLayerObj.addTo(map); leafletData.setTiles(tileLayerObj, attrs.id); @@ -159,7 +157,7 @@ angular.module('leaflet-directive', []).directive('leaflet', ["$q", "leafletData } // if no event-broadcast attribute, all events are broadcasted - if (!isDefined(attrs.eventBroadcast)) { + if (!isDefined(attrs.lfEvents)) { var logic = 'broadcast'; addEvents(map, mapEvents, 'eventName', scope, logic); } @@ -185,7 +183,7 @@ angular.module('leaflet-directive', []).directive('leaflet', ["$q", "leafletData }; }]); -angular.module('leaflet-directive').factory('leafletBoundsHelpers', ["$log", "leafletHelpers", function($log, leafletHelpers) { +angular.module('leaflet-directive').factory('leafletBoundsHelpers', ["leafletLogger", "leafletHelpers", function(leafletLogger, leafletHelpers) { var isArray = leafletHelpers.isArray; var isNumber = leafletHelpers.isNumber; @@ -215,7 +213,7 @@ angular.module('leaflet-directive').factory('leafletBoundsHelpers', ["$log", "le boundsArray[0].length === 2 && boundsArray[1].length === 2 && isNumber(boundsArray[0][0]) && isNumber(boundsArray[0][1]) && isNumber(boundsArray[1][0]) && isNumber(boundsArray[1][1]))) { - $log.error('[AngularJS - Leaflet] The bounds array is not valid.'); + leafletLogger.error('The bounds array is not valid.'); return; } @@ -233,7 +231,7 @@ angular.module('leaflet-directive').factory('leafletBoundsHelpers', ["$log", "le createBoundsFromLeaflet: function(lfBounds) { if (!(isDefined(lfBounds) && isFunction(lfBounds.getNorthEast) && isFunction(lfBounds.getSouthWest))) { - $log.error('[AngularJS - Leaflet] The leaflet bounds is not valid object.'); + leafletLogger.error('The leaflet bounds is not valid object.'); return; } @@ -254,12 +252,11 @@ angular.module('leaflet-directive').factory('leafletBoundsHelpers', ["$log", "le }; }]); -angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScope", "$log", "leafletHelpers", "leafletLayerHelpers", "leafletMapDefaults", function($rootScope, $log, leafletHelpers, leafletLayerHelpers, leafletMapDefaults) { +angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScope", "leafletLogger", "leafletHelpers", "leafletLayerHelpers", "leafletMapDefaults", function($rootScope, leafletLogger, leafletHelpers, leafletLayerHelpers, leafletMapDefaults) { var isDefined = leafletHelpers.isDefined; var isObject = leafletHelpers.isObject; var createLayer = leafletLayerHelpers.createLayer; var _controls = {}; - var errorHeader = leafletHelpers.errorHeader + ' [Controls] '; var _controlLayersMustBeVisible = function(baselayers, overlays, mapId) { var defaults = leafletMapDefaults.getDefaults(mapId); @@ -314,7 +311,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop draw: { isPluginLoaded: function() { if (!angular.isDefined(L.Control.Draw)) { - $log.error(errorHeader + ' Draw plugin is not loaded.'); + leafletLogger.error('Draw plugin is not loaded.'); return false; } @@ -345,7 +342,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop fullscreen: { isPluginLoaded: function() { if (!angular.isDefined(L.Control.Fullscreen)) { - $log.error(errorHeader + ' Fullscreen plugin is not loaded.'); + leafletLogger.error('Fullscreen plugin is not loaded.'); return false; } @@ -363,7 +360,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop search: { isPluginLoaded: function() { if (!angular.isDefined(L.Control.Search)) { - $log.error(errorHeader + ' Search plugin is not loaded.'); + leafletLogger.error(' Search plugin is not loaded.'); return false; } @@ -382,7 +379,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop minimap: { isPluginLoaded: function() { if (!angular.isDefined(L.Control.MiniMap)) { - $log.error(errorHeader + ' Minimap plugin is not loaded.'); + leafletLogger.error('Minimap plugin is not loaded.'); return false; } @@ -391,7 +388,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop checkValidParams: function(params) { if (!isDefined(params.layer)) { - $log.warn(errorHeader + ' minimap "layer" option should be defined.'); + leafletLogger.warn('minimap "layer" option should be defined.'); return false; } @@ -402,7 +399,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop var layer = createLayer(params.layer); if (!isDefined(layer)) { - $log.warn(errorHeader + ' minimap control "layer" could not be created.'); + leafletLogger.warn('minimap control "layer" could not be created.'); return; } @@ -471,13 +468,13 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', ["$rootScop }; }]); -angular.module('leaflet-directive').service('leafletData', ["$log", "$q", "leafletHelpers", function($log, $q, leafletHelpers) { - var getDefer = leafletHelpers.getDefer, - getUnresolvedDefer = leafletHelpers.getUnresolvedDefer, - setResolvedDefer = leafletHelpers.setResolvedDefer; +angular.module('leaflet-directive').service('leafletData', ["leafletLogger", "$q", "leafletHelpers", function(leafletLogger, $q, leafletHelpers) { + var getDefer = leafletHelpers.getDefer; + var getUnresolvedDefer = leafletHelpers.getUnresolvedDefer; + var setResolvedDefer = leafletHelpers.setResolvedDefer; var _private = {}; - var self = this; + var _this = this; var upperFirst = function(string) { return string.charAt(0).toUpperCase() + string.slice(1); @@ -492,7 +489,8 @@ angular.module('leaflet-directive').service('leafletData', ["$log", "$q", "leafl 'geoJSON', 'UTFGrid', //odd ball on naming convention keeping to not break 'decorations', - 'directiveControls',]; + 'directiveControls', + ]; //init _privateItems.forEach(function(itemName) { @@ -509,13 +507,13 @@ angular.module('leaflet-directive').service('leafletData', ["$log", "$q", "leafl //int repetitive stuff (get and sets) _privateItems.forEach(function(itemName) { var name = upperFirst(itemName); - self['set' + name] = function(lObject, scopeId) { + _this['set' + name] = function(lObject, scopeId) { var defer = getUnresolvedDefer(_private[itemName], scopeId); defer.resolve(lObject); setResolvedDefer(_private[itemName], scopeId); }; - self['get' + name] = function(scopeId) { + _this['get' + name] = function(scopeId) { var defer = getDefer(_private[itemName], scopeId); return defer.promise; }; @@ -523,19 +521,15 @@ angular.module('leaflet-directive').service('leafletData', ["$log", "$q", "leafl }]); angular.module('leaflet-directive') -.service('leafletDirectiveControlsHelpers', ["$log", "leafletData", "leafletHelpers", function($log, leafletData, leafletHelpers) { +.service('leafletDirectiveControlsHelpers', ["leafletLogger", "leafletData", "leafletHelpers", function(leafletLogger, leafletData, leafletHelpers) { var _isDefined = leafletHelpers.isDefined; var _isString = leafletHelpers.isString; var _isObject = leafletHelpers.isObject; - var _mainErrorHeader = leafletHelpers.errorHeader; - - var _errorHeader = _mainErrorHeader + '[leafletDirectiveControlsHelpers'; var _extend = function(id, thingToAddName, createFn, cleanFn) { - var _fnHeader = _errorHeader + '.extend] '; var extender = {}; if (!_isDefined(thingToAddName)) { - $log.error(_fnHeader + 'thingToAddName cannot be undefined'); + leafletLogger.error('control name cannot be undefined'); return; } @@ -547,7 +541,7 @@ angular.module('leaflet-directive') } else if (_isObject(thingToAddName) && !_isDefined(createFn) && !_isDefined(cleanFn)) { extender = thingToAddName; } else { - $log.error(_fnHeader + 'incorrect arguments'); + leafletLogger.error('incorrect arguments'); return; } @@ -645,8 +639,7 @@ angular.module('leaflet-directive') }; }]); -angular.module('leaflet-directive').service('leafletHelpers', ["$q", "$log", function($q, $log) { - var _errorHeader = '[AngularJS - Leaflet] '; +angular.module('leaflet-directive').service('leafletHelpers', ["$q", "leafletLogger", function($q, leafletLogger) { var _copy = angular.copy; var _clone = _copy; /* @@ -664,8 +657,9 @@ angular.module('leaflet-directive').service('leafletHelpers', ["$q", "$log", fun */ var _getObjectValue = function(object, pathStr) { var obj; - if (!object || !angular.isObject(object)) - return; + if (!object || !angular.isObject(object)) { + return; + } //if the key is not a sting then we already have the value if ((pathStr === null) || !angular.isString(pathStr)) { @@ -718,7 +712,7 @@ angular.module('leaflet-directive').service('leafletHelpers', ["$q", "$log", fun } } } else { - $log.error(_errorHeader + '- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call'); + leafletLogger.error('You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call'); } } else { id = mapId; @@ -792,7 +786,6 @@ angular.module('leaflet-directive').service('leafletHelpers', ["$q", "$log", fun directiveNormalize: directiveNormalize, copy:_copy, clone:_clone, - errorHeader: _errorHeader, getObjectValue: _getObjectValue, getObjectArrayPath:_getObjectArrayPath, getObjectDotPath: _getObjectDotPath, @@ -1305,7 +1298,7 @@ angular.module('leaflet-directive').service('leafletHelpers', ["$q", "$log", fun if (this.isLoaded()) { return layer instanceof L.UtfGrid; } else { - $log.error('[AngularJS - Leaflet] No UtfGrid plugin found.'); + leafletLogger.error('No UtfGrid plugin found.'); return false; } }, @@ -1376,10 +1369,9 @@ angular.module('leaflet-directive').service('leafletHelpers', ["$q", "$log", fun }; }]); -angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafletHelpers", function($log, leafletHelpers) { +angular.module('leaflet-directive').service('leafletIterators', ["leafletLogger", "leafletHelpers", function(leafletLogger, leafletHelpers) { var lHlp = leafletHelpers; - var errorHeader = leafletHelpers.errorHeader + 'leafletIterators: '; //BEGIN COPY from underscore var _keys = Object.keys; @@ -1411,23 +1403,34 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle // of the passed-in callback, to be repeatedly applied in other Underscore // functions. var optimizeCb = function(func, context, argCount) { - if (context === void 0) return func; + if (context === void 0) { + return func; + } + switch (argCount === null ? 3 : argCount) { - case 1: return function(value) { - return func.call(context, value); - }; + case 1: { + return function(value) { + return func.call(context, value); + }; + } - case 2: return function(value, other) { - return func.call(context, value, other); - }; + case 2: { + return function(value, other) { + return func.call(context, value, other); + }; + } - case 3: return function(value, index, collection) { - return func.call(context, value, index, collection); - }; + case 3: { + return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + } - case 4: return function(accumulator, value, index, collection) { - return func.call(context, accumulator, value, index, collection); - }; + case 4: { + return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } } return function() { return func.apply(context, arguments); @@ -1438,7 +1441,10 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle var createAssigner = function(keysFunc, undefinedOnly) { return function(obj) { var length = arguments.length; - if (length < 2 || obj === null) return obj; + if (length < 2 || obj === null) { + return obj; + } + for (var index = 1; index < length; index++) { var source = arguments[index]; var keys = keysFunc(source); @@ -1446,7 +1452,9 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle for (var i = 0; i < l; i++) { var key = keys[i]; - if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; + if (!undefinedOnly || obj[key] === void 0) { + obj[key] = source[key]; + } } } @@ -1464,11 +1472,16 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle var _isMatch = function(object, attrs) { var keys = _keys(attrs); var length = keys.length; - if (object === null) return !length; + if (object === null) { + return !length; + } + var obj = Object(object); for (var i = 0; i < length; i++) { var key = keys[i]; - if (attrs[key] !== obj[key] || !(key in obj)) return false; + if (attrs[key] !== obj[key] || !(key in obj)) { + return false; + } } return true; @@ -1489,9 +1502,18 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle // to each element in a collection, returning the desired result — either // identity, an arbitrary callback, a property matcher, or a property accessor. var cb = function(value, context, argCount) { - if (value === null) return _identity; - if (_isFunction(value)) return optimizeCb(value, context, argCount); - if (_isObject(value)) return _matcher(value); + if (value === null) { + return _identity; + } + + if (_isFunction(value)) { + return optimizeCb(value, context, argCount); + } + + if (_isObject(value)) { + return _matcher(value); + } + return _property(value); }; @@ -1503,7 +1525,9 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle var length = (keys || obj).length; for (var index = 0; index < length; index++) { var currentKey = keys ? keys[index] : index; - if (!predicate(obj[currentKey], currentKey, obj)) return false; + if (!predicate(obj[currentKey], currentKey, obj)) { + return false; + } } return true; @@ -1520,7 +1544,7 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle if (!lHlp.isFunction(cb)) { cbName = lHlp.defaultTo(cb, 'cb'); - $log.error(errorHeader + cbName + ' is not a function'); + leafletLogger.error(cbName + ' is not a function', 'iterators'); return true; } @@ -1558,18 +1582,17 @@ angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafle }]); angular.module('leaflet-directive') -.factory('leafletLayerHelpers', ["$rootScope", "$log", "$q", "leafletHelpers", "leafletIterators", function($rootScope, $log, $q, leafletHelpers, leafletIterators) { +.factory('leafletLayerHelpers', ["$rootScope", "leafletLogger", "$q", "leafletHelpers", "leafletIterators", function($rootScope, leafletLogger, $q, leafletHelpers, leafletIterators) { var Helpers = leafletHelpers; var isString = leafletHelpers.isString; var isObject = leafletHelpers.isObject; var isArray = leafletHelpers.isArray; var isDefined = leafletHelpers.isDefined; - var errorHeader = leafletHelpers.errorHeader; var $it = leafletIterators; var utfGridCreateLayer = function(params) { if (!Helpers.UTFGridPlugin.isLoaded()) { - $log.error('[AngularJS - Leaflet] The UTFGrid plugin is not loaded.'); + leafletLogger.error('The UTFGrid plugin is not loaded'); return; } @@ -1812,7 +1835,7 @@ angular.module('leaflet-directive') mustHaveUrl: true, createLayer: function(params) { if (!Helpers.AGSFeatureLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri plugin is not loaded.'); + leafletLogger.warn('The AGS Feature plugin is not loaded.'); return; } @@ -1838,7 +1861,7 @@ angular.module('leaflet-directive') mustHaveUrl: true, createLayer: function(params) { if (!Helpers.AGSTiledMapLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri plugin is not loaded.'); + leafletLogger.warn(' The AGS Tiled plugin is not loaded'); return; } @@ -1851,7 +1874,7 @@ angular.module('leaflet-directive') mustHaveUrl: true, createLayer: function(params) { if (!Helpers.AGSDynamicMapLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri plugin is not loaded.'); + leafletLogger.warn(' The AGS Dynamic plugin is not loaded.'); return; } @@ -1864,7 +1887,7 @@ angular.module('leaflet-directive') mustHaveUrl: true, createLayer: function(params) { if (!Helpers.AGSImageMapLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri plugin is not loaded.'); + leafletLogger.warn('The AGSIImageMapLayer plugin is not loaded.'); return; } @@ -1877,12 +1900,12 @@ angular.module('leaflet-directive') mustHaveUrl: true, createLayer: function(params) { if (!Helpers.AGSClusteredLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri clustered layer plugin is not loaded.'); + leafletLogger.warn(' The AGS clustered layer plugin is not loaded.'); return; } if (!Helpers.MarkerClusterPlugin.isLoaded()) { - $log.warn(errorHeader + ' The markercluster plugin is not loaded.'); + leafletLogger.warn('The markercluster plugin is not loaded.'); return; } @@ -1893,12 +1916,12 @@ angular.module('leaflet-directive') mustHaveUrl: true, createLayer: function(params) { if (!Helpers.AGSHeatmapLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri heatmap layer plugin is not loaded.'); + leafletLogger.warn('The AGS heatmap layer plugin is not loaded.'); return; } if (!Helpers.HeatLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The heatlayer plugin is not loaded.'); + leafletLogger.warn('The heatlayer plugin is not loaded.'); return; } @@ -1909,7 +1932,7 @@ angular.module('leaflet-directive') mustHaveUrl: false, createLayer: function(params) { if (!Helpers.MarkerClusterPlugin.isLoaded()) { - $log.warn(errorHeader + ' The markercluster plugin is not loaded.'); + leafletLogger.warn('The markercluster plugin is not loaded.'); return; } @@ -1997,7 +2020,7 @@ angular.module('leaflet-directive') if (params.layer instanceof L.Class) { return angular.copy(params.layer); } else { - $log.error('[AngularJS - Leaflet] A custom layer must be a leaflet Class'); + leafletLogger.error('A custom layer must be a leaflet Class'); } }, }, @@ -2012,38 +2035,38 @@ angular.module('leaflet-directive') function isValidLayerType(layerDefinition) { // Check if the baselayer has a valid type if (!isString(layerDefinition.type)) { - $log.error('[AngularJS - Leaflet] A layer must have a valid type defined.'); + leafletLogger.error('A layer must have a valid type defined.'); return false; } if (Object.keys(layerTypes).indexOf(layerDefinition.type) === -1) { - $log.error('[AngularJS - Leaflet] A layer must have a valid type: ' + Object.keys(layerTypes)); + leafletLogger.error('A layer must have a valid type: ' + Object.keys(layerTypes)); return false; } // Check if the layer must have an URL if (layerTypes[layerDefinition.type].mustHaveUrl && !isString(layerDefinition.url)) { - $log.error('[AngularJS - Leaflet] A base layer must have an url'); + leafletLogger.error('A base layer must have an url'); return false; } if (layerTypes[layerDefinition.type].mustHaveData && !isDefined(layerDefinition.data)) { - $log.error('[AngularJS - Leaflet] The base layer must have a "data" array attribute'); + leafletLogger.error('The base layer must have a "data" array attribute'); return false; } if (layerTypes[layerDefinition.type].mustHaveLayer && !isDefined(layerDefinition.layer)) { - $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have an layer defined'); + leafletLogger.error('The type of layer ' + layerDefinition.type + ' must have an layer defined'); return false; } if (layerTypes[layerDefinition.type].mustHaveBounds && !isDefined(layerDefinition.bounds)) { - $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have bounds defined'); + leafletLogger.error('The type of layer ' + layerDefinition.type + ' must have bounds defined'); return false; } if (layerTypes[layerDefinition.type].mustHaveKey && !isDefined(layerDefinition.key)) { - $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have key defined'); + leafletLogger.error('The type of layer ' + layerDefinition.type + ' must have key defined'); return false; } @@ -2056,7 +2079,7 @@ angular.module('leaflet-directive') } if (!isString(layerDefinition.name)) { - $log.error('[AngularJS - Leaflet] A base layer must have a name'); + leafletLogger.error('A base layer must have a name'); return; } @@ -2104,7 +2127,6 @@ angular.module('leaflet-directive') if (isDefined(layerOptions) && isDefined(layerOptions.loadedDefer)) { if (angular.isFunction(layerOptions.loadedDefer)) { var defers = layerOptions.loadedDefer(); - $log.debug('Loaded Deferred', defers); var count = defers.length; if (count > 0) { var resolve = function() { @@ -2203,6 +2225,38 @@ angular.module('leaflet-directive').factory('leafletLegendHelpers', function() { }; }); +angular.module('leaflet-directive').service('leafletLogger', ["$log", function($log) { + var prefix = '[angular-leaflet] '; + + return { + log: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.log(prefix + section + msg); + }, + + debug: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.debug(prefix + section + msg); + }, + + info: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.info(prefix + section + msg); + }, + + warn: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.warn(prefix + section + msg); + }, + + error: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.error(prefix + section + msg); + }, + + }; +}]); + angular.module('leaflet-directive').factory('leafletMapDefaults', ["$q", "leafletHelpers", function($q, leafletHelpers) { function _getDefaults() { return { @@ -2378,7 +2432,7 @@ angular.module('leaflet-directive').factory('leafletMapDefaults', ["$q", "leafle }; }]); -angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScope", "$timeout", "leafletHelpers", "$log", "$compile", "leafletGeoJsonHelpers", function($rootScope, $timeout, leafletHelpers, $log, $compile, leafletGeoJsonHelpers) { +angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScope", "$timeout", "leafletHelpers", "leafletLogger", "$compile", "leafletGeoJsonHelpers", function($rootScope, $timeout, leafletHelpers, leafletLogger, $compile, leafletGeoJsonHelpers) { var isDefined = leafletHelpers.isDefined; var defaultTo = leafletHelpers.defaultTo; var MarkerClusterPlugin = leafletHelpers.MarkerClusterPlugin; @@ -2394,7 +2448,6 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop var isObject = leafletHelpers.isObject; var groups = {}; var geoHlp = leafletGeoJsonHelpers; - var errorHeader = leafletHelpers.errorHeader; var _string = function(marker) { //this exists since JSON.stringify barfs on cyclic @@ -2406,15 +2459,10 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop return '[leafletMarker] : \n' + retStr; }; - var _log = function(marker, useConsole) { - var logger = useConsole ? console : $log; - logger.debug(_string(marker)); - }; - var createLeafletIcon = function(iconData) { if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'awesomeMarker') { if (!AwesomeMarkersPlugin.isLoaded()) { - $log.error(errorHeader + ' The AwesomeMarkers Plugin is not loaded.'); + leafletLogger.error('The AwesomeMarkers Plugin is not loaded.'); } return new L.AwesomeMarkers.icon(iconData); @@ -2422,7 +2470,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'vectorMarker') { if (!VectorMarkersPlugin.isLoaded()) { - $log.error(errorHeader + ' The VectorMarkers Plugin is not loaded.'); + leafletLogger.error('The VectorMarkers Plugin is not loaded.'); } return new L.VectorMarkers.icon(iconData); @@ -2430,7 +2478,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'makiMarker') { if (!MakiMarkersPlugin.isLoaded()) { - $log.error(errorHeader + 'The MakiMarkers Plugin is not loaded.'); + leafletLogger.error('The MakiMarkers Plugin is not loaded.'); } return new L.MakiMarkers.icon(iconData); @@ -2438,7 +2486,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'extraMarker') { if (!ExtraMarkersPlugin.isLoaded()) { - $log.error(errorHeader + 'The ExtraMarkers Plugin is not loaded.'); + leafletLogger.error('The ExtraMarkers Plugin is not loaded.'); } return new L.ExtraMarkers.icon(iconData); @@ -2450,7 +2498,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'dom') { if (!DomMarkersPlugin.isLoaded()) { - $log.error(errorHeader + 'The DomMarkers Plugin is not loaded.'); + leafletLogger.error('The DomMarkers Plugin is not loaded.'); } var markerScope = angular.isFunction(iconData.getMarkerScope) ? iconData.getMarkerScope() : $rootScope; @@ -2568,7 +2616,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop if (compileMessage) { if (!isDefined(marker._popup) || !isDefined(marker._popup._contentNode)) { - $log.error(errorHeader + 'Popup is invalid or does not have any content.'); + leafletLogger.error('Popup is invalid or does not have any content.'); return false; } @@ -2600,7 +2648,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop // Update the lat-lng property (always present in marker properties) if (!geoHlp.validateCoords(markerData)) { - $log.warn('There are problems with lat-lng data, please verify your marker model'); + leafletLogger.warn('There are problems with lat-lng data, please verify your marker model'); _deleteMarker(marker, map, layers); return; } @@ -2651,14 +2699,14 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop // The markerData.layer is defined so we add the marker to the layer if it is different from the old data if (!isDefined(layers.overlays[markerData.layer])) { - $log.error(errorHeader + 'You must use a name of an existing layer'); + leafletLogger.error('You must use a name of an existing layer'); return; } // Is a group layer? var layerGroup = layers.overlays[markerData.layer]; if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { - $log.error(errorHeader + 'A marker can only be added to a layer of type "group" or "featureGroup"'); + leafletLogger.error('A marker can only be added to a layer of type "group" or "featureGroup"'); return; } @@ -2771,7 +2819,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop } // The markerData.focus property must be true so we update if there wasn't a previous value or it wasn't true - if (markerData.focus === true && (!isDefined(oldMarkerData.focus) || oldMarkerData.focus === false) || (isInitializing && markerData.focus === true)) { + if (markerData.focus === true && (markerData.lat !== oldMarkerData.lat || markerData.lng !== oldMarkerData.lng || !isDefined(oldMarkerData.focus) || oldMarkerData.focus === false) || (isInitializing && markerData.focus === true)) { // Reopen the popup when focus is still true marker.openPopup(); updatedFocus = true; @@ -2833,14 +2881,14 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop createMarker: function(markerData) { if (!isDefined(markerData) || !geoHlp.validateCoords(markerData)) { - $log.error(errorHeader + 'The marker definition is not valid.'); + leafletLogger.error('The marker definition is not valid.'); return; } var coords = geoHlp.getCoords(markerData); if (!isDefined(coords)) { - $log.error(errorHeader + 'Unable to get coordinates from markerData.'); + leafletLogger.error('Unable to get coordinates from markerData.'); return; } @@ -2872,12 +2920,12 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop addMarkerToGroup: function(marker, groupName, groupOptions, map) { if (!isString(groupName)) { - $log.error(errorHeader + 'The marker group you have specified is invalid.'); + leafletLogger.error('The marker group you have specified is invalid.'); return; } if (!MarkerClusterPlugin.isLoaded()) { - $log.error(errorHeader + 'The MarkerCluster plugin is not loaded.'); + leafletLogger.error('The MarkerCluster plugin is not loaded.'); return; } @@ -2907,8 +2955,9 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop marker.on('add', function(/* event */) { safeApply(leafletScope, function() { - if ('label' in markerData) - _manageOpenLabel(marker, markerData); + if ('label' in markerData) { + _manageOpenLabel(marker, markerData); + } }); }); }, @@ -2931,11 +2980,10 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop }, string: _string, - log: _log, }; }]); -angular.module('leaflet-directive').factory('leafletPathsHelpers', ["$rootScope", "$log", "leafletHelpers", function($rootScope, $log, leafletHelpers) { +angular.module('leaflet-directive').factory('leafletPathsHelpers', ["$rootScope", "leafletLogger", "leafletHelpers", function($rootScope, leafletLogger, leafletHelpers) { var isDefined = leafletHelpers.isDefined; var isArray = leafletHelpers.isArray; var isNumber = leafletHelpers.isNumber; @@ -3202,7 +3250,7 @@ angular.module('leaflet-directive').factory('leafletPathsHelpers', ["$rootScope" var pathData = _getPathData(path); if (!pathTypes[path.type].isValid(pathData)) { - $log.error('[AngularJS - Leaflet] Invalid data passed to the ' + path.type + ' path'); + leafletLogger.error('Invalid data passed to the ' + path.type + ' path'); return; } @@ -3218,8 +3266,9 @@ angular.module('leaflet-directive') //watchOptions.isDeep is/should be ignored in $watchCollection var unWatch = scope[watchFunctionName](thingToWatchStr, function(newValue, oldValue) { initCb(newValue, oldValue); - if (!watchOptions.doWatch) - unWatch(); + if (!watchOptions.doWatch) { + unWatch(); + } }, watchOptions.isDeep); return unWatch; @@ -3275,7 +3324,7 @@ angular.module('leaflet-directive').factory('nominatimService', ["$q", "$http", }; }]); -angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$http", "leafletHelpers", "nominatimService", "leafletBoundsHelpers", function($log, $timeout, $http, leafletHelpers, nominatimService, leafletBoundsHelpers) { +angular.module('leaflet-directive').directive('lfBounds', ["leafletLogger", "$timeout", "$http", "leafletHelpers", "nominatimService", "leafletBoundsHelpers", function(leafletLogger, $timeout, $http, leafletHelpers, nominatimService, leafletBoundsHelpers) { return { restrict: 'A', @@ -3288,7 +3337,6 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h var createLeafletBounds = leafletBoundsHelpers.createLeafletBounds; var leafletScope = controller[0].getLeafletScope(); var mapController = controller[0]; - var errorHeader = leafletHelpers.errorHeader + ' [Bounds] '; var emptyBounds = function(bounds) { return (bounds._southWest.lat === 0 && bounds._southWest.lng === 0 && @@ -3327,8 +3375,10 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h var lastNominatimQuery; leafletScope.$watch('bounds', function(bounds) { - if (scope.settingBoundsFromLeaflet) - return; + if (scope.settingBoundsFromLeaflet) { + return; + } + if (isDefined(bounds.address) && bounds.address !== lastNominatimQuery) { scope.settingBoundsFromScope = true; nominatimService.query(bounds.address, attrs.id).then(function(data) { @@ -3337,7 +3387,7 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h map.fitBounds(newBounds); }, function(errMsg) { - $log.error(errorHeader + ' ' + errMsg + '.'); + leafletLogger.error(errMsg, 'bounds'); }); lastNominatimQuery = bounds.address; @@ -3362,239 +3412,224 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h }; }]); -var centerDirectiveTypes = ['center', 'lfCenter']; -var centerDirectives = {}; - -centerDirectiveTypes.forEach(function(directiveName) { - centerDirectives[directiveName] = ['$log', '$q', '$location', '$timeout', 'leafletMapDefaults', 'leafletHelpers', - 'leafletBoundsHelpers', 'leafletMapEvents', - function($log, $q, $location, $timeout, leafletMapDefaults, leafletHelpers, - leafletBoundsHelpers, leafletMapEvents) { +angular.module('leaflet-directive').directive('lfCenter', ["leafletLogger", "$q", "$location", "$timeout", "leafletMapDefaults", "leafletHelpers", "leafletBoundsHelpers", "leafletMapEvents", function(leafletLogger, $q, $location, $timeout, leafletMapDefaults, leafletHelpers, leafletBoundsHelpers, leafletMapEvents) { + var isDefined = leafletHelpers.isDefined; + var isNumber = leafletHelpers.isNumber; + var isSameCenterOnMap = leafletHelpers.isSameCenterOnMap; + var safeApply = leafletHelpers.safeApply; + var isValidCenter = leafletHelpers.isValidCenter; + var isValidBounds = leafletBoundsHelpers.isValidBounds; + var isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty; - var isDefined = leafletHelpers.isDefined; - var isNumber = leafletHelpers.isNumber; - var isSameCenterOnMap = leafletHelpers.isSameCenterOnMap; - var safeApply = leafletHelpers.safeApply; - var isValidCenter = leafletHelpers.isValidCenter; - var isValidBounds = leafletBoundsHelpers.isValidBounds; - var isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty; - var errorHeader = leafletHelpers.errorHeader; + var shouldInitializeMapWithBounds = function(bounds, center) { + return isDefined(bounds) && isValidBounds(bounds) && isUndefinedOrEmpty(center); + }; - var shouldInitializeMapWithBounds = function(bounds, center) { - return isDefined(bounds) && isValidBounds(bounds) && isUndefinedOrEmpty(center); + var _leafletCenter; + return { + restrict: 'A', + scope: false, + replace: false, + require: 'leaflet', + controller: function() { + _leafletCenter = $q.defer(); + this.getCenter = function() { + return _leafletCenter.promise; }; + }, - var _leafletCenter; - return { - restrict: 'A', - scope: false, - replace: false, - require: 'leaflet', - controller: function() { - _leafletCenter = $q.defer(); - this.getCenter = function() { - return _leafletCenter.promise; - }; - }, + link: function(scope, element, attrs, controller) { + var leafletScope = controller.getLeafletScope(); - link: function(scope, element, attrs, controller) { - var leafletScope = controller.getLeafletScope(); - var centerModel = leafletScope[directiveName]; + if (!isDefined(leafletScope.center)) { + leafletLogger.error('The scope "center" variable is not defined', 'center'); + leafletScope.center = {}; + } - controller.getMap().then(function(map) { - var defaults = leafletMapDefaults.getDefaults(attrs.id); + var centerModel = leafletScope.center; + controller.getMap().then(function(map) { + var defaults = leafletMapDefaults.getDefaults(attrs.id); - if (attrs[directiveName].search('-') !== -1) { - $log.error(errorHeader + ' The "center" variable can\'t use a "-" on its key name: "' + attrs[directiveName] + '".'); - map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - return; - } else if (shouldInitializeMapWithBounds(leafletScope.bounds, centerModel)) { - map.fitBounds(leafletBoundsHelpers.createLeafletBounds(leafletScope.bounds), leafletScope.bounds.options); - centerModel = map.getCenter(); - safeApply(leafletScope, function(scope) { - angular.extend(scope[directiveName], { - lat: map.getCenter().lat, - lng: map.getCenter().lng, - zoom: map.getZoom(), - autoDiscover: false, - }); - }); + if (attrs.lfCenter.search('-') !== -1) { + leafletLogger.error('The "center" variable can\'t use a "-" on its key name: "' + attrs.lfCenter, 'center'); + map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + return; + } else if (shouldInitializeMapWithBounds(leafletScope.bounds, centerModel)) { + map.fitBounds(leafletBoundsHelpers.createLeafletBounds(leafletScope.bounds), leafletScope.bounds.options); + safeApply(leafletScope, function(scope) { + angular.extend(scope.center, { + lat: map.getCenter().lat, + lng: map.getCenter().lng, + zoom: map.getZoom(), + autoDiscover: false, + }); + }); - safeApply(leafletScope, function(scope) { - var mapBounds = map.getBounds(); - scope.bounds = { - northEast: { - lat: mapBounds._northEast.lat, - lng: mapBounds._northEast.lng, - }, - southWest: { - lat: mapBounds._southWest.lat, - lng: mapBounds._southWest.lng, - }, + safeApply(leafletScope, function(scope) { + var mapBounds = map.getBounds(); + scope.bounds = { + northEast: { + lat: mapBounds._northEast.lat, + lng: mapBounds._northEast.lng, + }, + southWest: { + lat: mapBounds._southWest.lat, + lng: mapBounds._southWest.lng, + }, + }; + }); + } else if (!isDefined(centerModel)) { + leafletLogger.error('The "center" property is not defined in the main scope', 'center'); + map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + return; + } else if (!(isDefined(centerModel.lat) && isDefined(centerModel.lng)) && !isDefined(centerModel.autoDiscover)) { + angular.copy(defaults.center, centerModel); + } + + var urlCenterHash; + var mapReady; + if (centerModel.allowUrlHashCenter === true) { + var extractCenterFromUrl = function() { + var search = $location.search(); + var centerParam; + if (isDefined(search.c)) { + var cParam = search.c.split(':'); + if (cParam.length === 3) { + centerParam = { + lat: parseFloat(cParam[0]), + lng: parseFloat(cParam[1]), + zoom: parseInt(cParam[2], 10), + allowUrlHashCenter: centerModel.allowUrlHashCenter, }; - }); - } else if (!isDefined(centerModel)) { - $log.error(errorHeader + ' The "center" property is not defined in the main scope'); - map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - return; - } else if (!(isDefined(centerModel.lat) && isDefined(centerModel.lng)) && !isDefined(centerModel.autoDiscover)) { - angular.copy(defaults.center, centerModel); + } } - var urlCenterHash; - var mapReady; - if (attrs.urlHashCenter === 'yes') { - var extractCenterFromUrl = function() { - var search = $location.search(); - var centerParam; - if (isDefined(search.c)) { - var cParam = search.c.split(':'); - if (cParam.length === 3) { - centerParam = { - lat: parseFloat(cParam[0]), - lng: parseFloat(cParam[1]), - zoom: parseInt(cParam[2], 10), - }; - } - } - - return centerParam; - }; + return centerParam; + }; - urlCenterHash = extractCenterFromUrl(); + urlCenterHash = extractCenterFromUrl(); - leafletScope.$on('$locationChangeSuccess', function(event) { - var scope = event.currentScope; + leafletScope.$on('$locationChangeSuccess', function(event) { + var scope = event.currentScope; - //$log.debug("updated location..."); - var urlCenter = extractCenterFromUrl(); - if (isDefined(urlCenter) && !isSameCenterOnMap(urlCenter, map)) { - //$log.debug("updating center model...", urlCenter); - angular.extend(scope[directiveName], { - lat: urlCenter.lat, - lng: urlCenter.lng, - zoom: urlCenter.zoom, - }); - } + var urlCenter = extractCenterFromUrl(); + if (isDefined(urlCenter) && !isSameCenterOnMap(urlCenter, map)) { + angular.extend(scope.center, { + lat: urlCenter.lat, + lng: urlCenter.lng, + zoom: urlCenter.zoom, + allowUrlHashCenter: centerModel.allowUrlHashCenter, }); } + }); + } - leafletScope.$watch(directiveName, function(center) { - if (leafletScope.settingCenterFromLeaflet) - return; + leafletScope.$watch('center', function(center) { + if (leafletScope.settingCenterFromLeaflet) { + return; + } - //$log.debug("updated center model..."); - // The center from the URL has priority - if (isDefined(urlCenterHash)) { - angular.copy(urlCenterHash, center); - urlCenterHash = undefined; - } + // The center from the URL has priority + if (isDefined(urlCenterHash)) { + angular.copy(urlCenterHash, center); + urlCenterHash = undefined; + } - if (!isValidCenter(center) && center.autoDiscover !== true) { - $log.warn(errorHeader + ' invalid \'center\''); + if (!isValidCenter(center) && center.autoDiscover !== true) { + leafletLogger.warn(' invalid \'center\'', 'center'); - //map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - return; - } + //map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + return; + } - if (center.autoDiscover === true) { - if (!isNumber(center.zoom)) { - map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - } + if (center.autoDiscover === true) { + if (!isNumber(center.zoom)) { + map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + } - if (isNumber(center.zoom) && center.zoom > defaults.center.zoom) { - map.locate({ - setView: true, - maxZoom: center.zoom, - }); - } else if (isDefined(defaults.maxZoom)) { - map.locate({ - setView: true, - maxZoom: defaults.maxZoom, - }); - } else { - map.locate({ - setView: true, - }); - } + if (isNumber(center.zoom) && center.zoom > defaults.center.zoom) { + map.locate({ + setView: true, + maxZoom: center.zoom, + }); + } else if (isDefined(defaults.maxZoom)) { + map.locate({ + setView: true, + maxZoom: defaults.maxZoom, + }); + } else { + map.locate({ + setView: true, + }); + } - return; - } + return; + } - if (mapReady && isSameCenterOnMap(center, map)) { - //$log.debug("no need to update map again."); - return; - } + if (mapReady && isSameCenterOnMap(center, map)) { + return; + } - //$log.debug("updating map center...", center); - leafletScope.settingCenterFromScope = true; - map.setView([center.lat, center.lng], center.zoom); - leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); - $timeout(function() { + leafletScope.settingCenterFromScope = true; + map.setView([center.lat, center.lng], center.zoom); + leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); + $timeout(function() { leafletScope.settingCenterFromScope = false; - - //$log.debug("allow center scope updates"); }); - }, true); + }, true); - map.whenReady(function() { - mapReady = true; - }); + map.whenReady(function() { + mapReady = true; + }); - map.on('moveend', function(/* event */) { - // Resolve the center after the first map position - _leafletCenter.resolve(); - leafletMapEvents.notifyCenterUrlHashChanged(leafletScope, map, attrs, $location.search()); + map.on('moveend', function(/* event */) { + // Resolve the center after the first map position + _leafletCenter.resolve(); - //$log.debug("updated center on map..."); - if (isSameCenterOnMap(centerModel, map) || leafletScope.settingCenterFromScope) { - //$log.debug("same center in model, no need to update again."); - return; - } + if (centerModel.allowUrlHashCenter === true) { + leafletMapEvents.notifyCenterUrlHashChanged(leafletScope, map, $location.search()); + } - leafletScope.settingCenterFromLeaflet = true; - safeApply(leafletScope, function(scope) { - if (!leafletScope.settingCenterFromScope) { - //$log.debug("updating center model...", map.getCenter(), map.getZoom()); - angular.extend(scope[directiveName], { - lat: map.getCenter().lat, - lng: map.getCenter().lng, - zoom: map.getZoom(), - autoDiscover: false, - }); - } + if (isSameCenterOnMap(centerModel, map) || leafletScope.settingCenterFromScope) { + return; + } - leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); - $timeout(function() { - leafletScope.settingCenterFromLeaflet = false; - }); + leafletScope.settingCenterFromLeaflet = true; + safeApply(leafletScope, function(scope) { + if (!leafletScope.settingCenterFromScope) { + angular.extend(scope.center, { + lat: map.getCenter().lat, + lng: map.getCenter().lng, + zoom: map.getZoom(), + autoDiscover: false, }); + } + + leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); + $timeout(function() { + leafletScope.settingCenterFromLeaflet = false; }); + }); + }); - if (centerModel.autoDiscover === true) { - map.on('locationerror', function() { - $log.warn(errorHeader + ' The Geolocation API is unauthorized on this page.'); - if (isValidCenter(centerModel)) { - map.setView([centerModel.lat, centerModel.lng], centerModel.zoom); - leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); - } else { - map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); - } - }); + if (centerModel.autoDiscover === true) { + map.on('locationerror', function() { + leafletLogger.warn('The Geolocation API is unauthorized on this page.', 'center'); + if (isValidCenter(centerModel)) { + map.setView([centerModel.lat, centerModel.lng], centerModel.zoom); + leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); + } else { + map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); } }); - }, - }; + } + }); }, - ]; -}); - -centerDirectiveTypes.forEach(function(dirType) { - angular.module('leaflet-directive').directive(dirType, centerDirectives[dirType]); -}); + }; +}]); -angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpers", "leafletControlHelpers", function($log, leafletHelpers, leafletControlHelpers) { +angular.module('leaflet-directive').directive('lfControls', ["leafletLogger", "leafletHelpers", "leafletControlHelpers", function(leafletLogger, leafletHelpers, leafletControlHelpers) { return { restrict: 'A', @@ -3613,7 +3648,6 @@ angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpe var isDefined = leafletHelpers.isDefined; var isArray = leafletHelpers.isArray; var leafletControls = {}; - var errorHeader = leafletHelpers.errorHeader + ' [Controls] '; controller.getMap().then(function(map) { @@ -3636,7 +3670,7 @@ angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpe var controlType = isDefined(newControls[newName].type) ? newControls[newName].type : newName; if (!isValidControlType(controlType)) { - $log.error(errorHeader + ' Invalid control type: ' + controlType + '.'); + leafletLogger.error(' Invalid control type: ' + controlType, 'controls'); return; } @@ -3666,7 +3700,16 @@ angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpe }; }]); -angular.module('leaflet-directive').directive('decorations', ["$log", "leafletHelpers", function($log, leafletHelpers) { +angular.module('leaflet-directive').directive('decorations', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "decorations" markup code is deprecated now. Please ' + + 'update your HTML with "lf-decorations" markup attributes.', 'decorations'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('lfDecorations', ["leafletLogger", "leafletHelpers", function(leafletLogger, leafletHelpers) { return { restrict: 'A', @@ -3684,7 +3727,7 @@ angular.module('leaflet-directive').directive('decorations', ["$log", "leafletHe function createDecoration(options) { if (isDefined(options) && isDefined(options.coordinates)) { if (!PolylineDecoratorPlugin.isLoaded()) { - $log.error('[AngularJS - Leaflet] The PolylineDecorator Plugin is not loaded.'); + leafletLogger.error('The PolylineDecorator Plugin is not loaded.', 'decorations'); } } @@ -3727,7 +3770,115 @@ angular.module('leaflet-directive').directive('decorations', ["$log", "leafletHe }; }]); -angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootScope", "leafletHelpers", "leafletMapEvents", "leafletIterators", function($log, $rootScope, leafletHelpers, leafletMapEvents, leafletIterators) { +angular.module('leaflet-directive').directive('maxbounds', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "maxbounds" markup code is deprecated now. Please ' + + 'update your HTML with "lf-maxbounds" markup attributes.', 'maxbounds'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('defaults', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "defaults" markup code is deprecated now. Please ' + + 'update your HTML with "lf-defaults" markup attributes.', 'defaults'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('bounds', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "bounds" markup code is deprecated now. Please ' + + 'update your HTML with "lf-bounds" markup attributes.', 'bounds'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('controls', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "controls" markup code is deprecated now. Please ' + + 'update your HTML with "lf-controls" markup attributes.', 'controls'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('center', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "center" markup code is deprecated now. Please ' + + 'update your HTML with "lf-center" markup attributes.', 'center'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('paths', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "paths" markup code is deprecated now. Please ' + + 'update your HTML with "lf-paths" markup attributes.', 'paths'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('tiles', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "tiles" markup code is deprecated now. Please ' + + 'update your HTML with "lf-tiles" markup attributes.', 'tiles'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('markers', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "markers" markup code is deprecated now. Please ' + + 'update your HTML with "lf-markers" markup attributes.', 'markers'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('eventBroadcast', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "event-broadcast" markup code is deprecated now. Please ' + + 'update your HTML with "lf-events" markup attributes.', 'events'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('geojson', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "geojson" markup code is deprecated now. Please ' + + 'update your HTML with "lf-geojson" markup attributes.', 'geojson'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('layers', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "layers" markup code is deprecated now. Please ' + + 'update your HTML with "lf-layers" markup attributes.', 'layers'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('markers', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "markers" markup code is deprecated now. Please ' + + 'update your HTML with "lf-markers" markup attributes.', 'markers'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('lfEvents', ["leafletLogger", "$rootScope", "leafletHelpers", "leafletMapEvents", "leafletIterators", function(leafletLogger, $rootScope, leafletHelpers, leafletMapEvents, leafletIterators) { return { restrict: 'A', @@ -3739,7 +3890,7 @@ angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootS var isObject = leafletHelpers.isObject; var isDefined = leafletHelpers.isDefined; var leafletScope = controller.getLeafletScope(); - var eventBroadcast = leafletScope.eventBroadcast; + var eventBroadcast = leafletScope.lfEvents; var availableMapEvents = leafletMapEvents.getAvailableMapEvents(); var addEvents = leafletMapEvents.addEvents; @@ -3749,24 +3900,24 @@ angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootS var logic = 'broadcast'; // We have a possible valid object - if (!isDefined(eventBroadcast.map)) { + if (!isDefined(eventBroadcast) || !isDefined(eventBroadcast.map)) { // We do not have events enable/disable do we do nothing (all enabled by default) mapEvents = availableMapEvents; } else if (!isObject(eventBroadcast.map)) { // Not a valid object - $log.warn('[AngularJS - Leaflet] event-broadcast.map must be an object check your model.'); + leafletLogger.warn('event-broadcast.map must be an object check your model.', 'events'); } else { // We have a possible valid map object // Event propadation logic if (eventBroadcast.map.logic !== 'emit' && eventBroadcast.map.logic !== 'broadcast') { // This is an error - $log.warn('[AngularJS - Leaflet] Available event propagation logic are: \'emit\' or \'broadcast\'.'); + leafletLogger.warn('Available event propagation logic are: \'emit\' or \'broadcast\'.', 'events'); } else { logic = eventBroadcast.map.logic; } if (!(isObject(eventBroadcast.map.enable) && eventBroadcast.map.enable.length >= 0)) { - $log.warn('[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.'); + leafletLogger.warn('[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.', 'events'); } else { // Enable events leafletIterators.each(eventBroadcast.map.enable, function(eventName) { @@ -3788,7 +3939,7 @@ angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootS }]); angular.module('leaflet-directive') -.directive('geojson', ["$log", "$rootScope", "leafletData", "leafletHelpers", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", "leafletIterators", "leafletGeoJsonEvents", function($log, $rootScope, leafletData, leafletHelpers, +.directive('lfGeojson', ["leafletLogger", "$rootScope", "leafletData", "leafletHelpers", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", "leafletIterators", "leafletGeoJsonEvents", function(leafletLogger, $rootScope, leafletData, leafletHelpers, leafletWatchHelpers, leafletDirectiveControlsHelpers, leafletIterators, leafletGeoJsonEvents) { var _maybeWatch = leafletWatchHelpers.maybeWatch; var _watchOptions = leafletHelpers.watchOptions; @@ -3836,8 +3987,10 @@ angular.module('leaflet-directive') hlp.isTruthy(attrs.geojsonNested)); var _clean = function() { - if (!leafletGeoJSON) - return; + if (!leafletGeoJSON) { + return; + } + var _remove = function(lObject) { if (isDefined(lObject) && map.hasLayer(lObject)) { map.removeLayer(lObject); @@ -3894,8 +4047,10 @@ angular.module('leaflet-directive') var _create = function(model) { _clean(); if (isNested) { - if (!model || !Object.keys(model).length) - return; + if (!model || !Object.keys(model).length) { + return; + } + $it.each(model, function(m, name) { //name could be layerName and or groupName //for now it is not tied to a layer @@ -3918,7 +4073,7 @@ angular.module('leaflet-directive') }; }]); -angular.module('leaflet-directive').directive('layercontrol', ["$filter", "$log", "leafletData", "leafletHelpers", function($filter, $log, leafletData, leafletHelpers) { +angular.module('leaflet-directive').directive('layercontrol', ["$filter", "leafletLogger", "leafletData", "leafletHelpers", function($filter, leafletLogger, leafletData, leafletHelpers) { return { restrict: 'E', @@ -3934,7 +4089,6 @@ angular.module('leaflet-directive').directive('layercontrol', ["$filter", "$log" transclude: false, require: '^leaflet', controller: ["$scope", "$element", "$sce", function($scope, $element, $sce) { - $log.debug('[Angular Directive - Layers] layers', $scope, $element); var safeApply = leafletHelpers.safeApply; var isDefined = leafletHelpers.isDefined; angular.extend($scope, { @@ -4232,7 +4386,7 @@ angular.module('leaflet-directive').directive('layercontrol', ["$filter", "$log" }; }]); -angular.module('leaflet-directive').directive('layers', ["$log", "$q", "leafletData", "leafletHelpers", "leafletLayerHelpers", "leafletControlHelpers", function($log, $q, leafletData, leafletHelpers, leafletLayerHelpers, leafletControlHelpers) { +angular.module('leaflet-directive').directive('lfLayers', ["leafletLogger", "$q", "leafletData", "leafletHelpers", "leafletLayerHelpers", "leafletControlHelpers", function(leafletLogger, $q, leafletData, leafletHelpers, leafletLayerHelpers, leafletControlHelpers) { return { restrict: 'A', @@ -4441,7 +4595,7 @@ angular.module('leaflet-directive').directive('layers', ["$log", "$q", "leafletD }; }]); -angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafletHelpers", "leafletLegendHelpers", function($log, $http, leafletHelpers, leafletLegendHelpers) { +angular.module('leaflet-directive').directive('lfLegend', ["leafletLogger", "$http", "leafletHelpers", "leafletLegendHelpers", function(leafletLogger, $http, leafletHelpers, leafletLegendHelpers) { return { restrict: 'A', @@ -4481,7 +4635,6 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl leafletScope.$watch('legend', function(newLegend) { if (!isDefined(newLegend)) { - if (isDefined(leafletLegend)) { leafletLegend.removeFrom(map); leafletLegend = null; @@ -4491,16 +4644,12 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl } if (!isDefined(newLegend.url) && (type === 'arcgis') && (!isArray(newLegend.colors) || !isArray(newLegend.labels) || newLegend.colors.length !== newLegend.labels.length)) { - - $log.warn('[AngularJS - Leaflet] legend.colors and legend.labels must be set.'); - + leafletLogger.warn('legend.colors and legend.labels must be set.', 'legend'); return; } if (isDefined(newLegend.url)) { - - $log.info('[AngularJS - Leaflet] loading legend service.'); - + leafletLogger.info('loading legend service.', 'legend'); return; } @@ -4512,12 +4661,12 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl leafletLegend = L.control({ position: position, }); + if (type === 'arcgis') { leafletLegend.onAdd = leafletLegendHelpers.getOnAddArrayLegend(newLegend, legendClass); } leafletLegend.addTo(map); - }); leafletScope.$watch('legend.url', function(newURL) { @@ -4526,187 +4675,184 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl return; } - $http.get(newURL) - .success(function(legendData) { - - if (isDefined(leafletLegend)) { - - leafletLegendHelpers.updateLegend(leafletLegend.getContainer(), legendData, type, newURL); - - } else { - - leafletLegend = L.control({ - position: position, - }); - leafletLegend.onAdd = leafletLegendHelpers.getOnAddLegend(legendData, legendClass, type, newURL); - leafletLegend.addTo(map); - } + $http.get(newURL).success(function(legendData) { + if (isDefined(leafletLegend)) { + leafletLegendHelpers.updateLegend(leafletLegend.getContainer(), legendData, type, newURL); + } else { + leafletLegend = L.control({ position: position, }); + leafletLegend.onAdd = leafletLegendHelpers.getOnAddLegend(legendData, legendClass, type, newURL); + leafletLegend.addTo(map); + } - if (isDefined(legend.loadedData) && isFunction(legend.loadedData)) { - legend.loadedData(); - } - }) - .error(function() { - $log.warn('[AngularJS - Leaflet] legend.url not loaded.'); - }); + if (isDefined(legend.loadedData) && isFunction(legend.loadedData)) { + legend.loadedData(); + } + }).error(function() { + leafletLogger.warn('legend.url not loaded.', 'legend'); + }); }); - }); }, }; }]); -angular.module('leaflet-directive').directive('markers', - ["$log", "$rootScope", "$q", "leafletData", "leafletHelpers", "leafletMapDefaults", "leafletMarkersHelpers", "leafletMarkerEvents", "leafletIterators", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", function($log, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults, - leafletMarkersHelpers, leafletMarkerEvents, leafletIterators, leafletWatchHelpers, - leafletDirectiveControlsHelpers) { - //less terse vars to helpers - var isDefined = leafletHelpers.isDefined; - var errorHeader = leafletHelpers.errorHeader; - var Helpers = leafletHelpers; - var isString = leafletHelpers.isString; - var addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher; - var updateMarker = leafletMarkersHelpers.updateMarker; - var listenMarkerEvents = leafletMarkersHelpers.listenMarkerEvents; - var addMarkerToGroup = leafletMarkersHelpers.addMarkerToGroup; - var createMarker = leafletMarkersHelpers.createMarker; - var deleteMarker = leafletMarkersHelpers.deleteMarker; - var $it = leafletIterators; - var _markersWatchOptions = leafletHelpers.watchOptions; - var maybeWatch = leafletWatchHelpers.maybeWatch; - var extendDirectiveControls = leafletDirectiveControlsHelpers.extend; - - var _getLMarker = function(leafletMarkers, name, maybeLayerName) { - if (!Object.keys(leafletMarkers).length) return; - if (maybeLayerName && isString(maybeLayerName)) { - if (!leafletMarkers[maybeLayerName] || !Object.keys(leafletMarkers[maybeLayerName]).length) - return; - return leafletMarkers[maybeLayerName][name]; - } +angular.module('leaflet-directive').directive('lfMarkers', ["leafletLogger", "$rootScope", "$q", "leafletData", "leafletHelpers", "leafletMapDefaults", "leafletMarkersHelpers", "leafletMarkerEvents", "leafletIterators", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", function(leafletLogger, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults, leafletMarkersHelpers, leafletMarkerEvents, leafletIterators, leafletWatchHelpers, leafletDirectiveControlsHelpers) { + var isDefined = leafletHelpers.isDefined; + var Helpers = leafletHelpers; + var isString = leafletHelpers.isString; + var addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher; + var updateMarker = leafletMarkersHelpers.updateMarker; + var listenMarkerEvents = leafletMarkersHelpers.listenMarkerEvents; + var addMarkerToGroup = leafletMarkersHelpers.addMarkerToGroup; + var createMarker = leafletMarkersHelpers.createMarker; + var deleteMarker = leafletMarkersHelpers.deleteMarker; + var $it = leafletIterators; + var _markersWatchOptions = leafletHelpers.watchOptions; + var maybeWatch = leafletWatchHelpers.maybeWatch; + var extendDirectiveControls = leafletDirectiveControlsHelpers.extend; - return leafletMarkers[name]; - }; + var _getLMarker = function(leafletMarkers, name, maybeLayerName) { + if (!Object.keys(leafletMarkers).length) { + return; + } + + if (maybeLayerName && isString(maybeLayerName)) { + if (!leafletMarkers[maybeLayerName] || !Object.keys(leafletMarkers[maybeLayerName]).length) { + return; + } - var _setLMarker = function(lObject, leafletMarkers, name, maybeLayerName) { + return leafletMarkers[maybeLayerName][name]; + } + + return leafletMarkers[name]; + }; + + var _setLMarker = function(lObject, leafletMarkers, name, maybeLayerName) { if (maybeLayerName && isString(maybeLayerName)) { - if (!isDefined(leafletMarkers[maybeLayerName])) - leafletMarkers[maybeLayerName] = {}; + if (!isDefined(leafletMarkers[maybeLayerName])) { + leafletMarkers[maybeLayerName] = {}; + } + leafletMarkers[maybeLayerName][name] = lObject; - } else - leafletMarkers[name] = lObject; + } else { + leafletMarkers[name] = lObject; + } + return lObject; }; - var _maybeAddMarkerToLayer = function(layerName, layers, model, marker, doIndividualWatch, map) { - - if (!isString(layerName)) { - $log.error(errorHeader + ' A layername must be a string'); - return false; - } + var _maybeAddMarkerToLayer = function(layerName, layers, model, marker, doIndividualWatch, map) { - if (!isDefined(layers)) { - $log.error(errorHeader + ' You must add layers to the directive if the markers are going to use this functionality.'); - return false; - } + if (!isString(layerName)) { + leafletLogger.error('A layername must be a string', 'markers'); + return false; + } - if (!isDefined(layers.overlays) || !isDefined(layers.overlays[layerName])) { - $log.error(errorHeader + ' A marker can only be added to a layer of type "group"'); - return false; - } + if (!isDefined(layers)) { + leafletLogger.error('You must add layers to the directive if the markers are going to use this functionality.', 'markers'); + return false; + } - var layerGroup = layers.overlays[layerName]; - if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { - $log.error(errorHeader + ' Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"'); - return false; - } + if (!isDefined(layers.overlays) || !isDefined(layers.overlays[layerName])) { + leafletLogger.error('A marker can only be added to a layer of type "group"', 'markers'); + return false; + } - // The marker goes to a correct layer group, so first of all we add it - layerGroup.addLayer(marker); + var layerGroup = layers.overlays[layerName]; + if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { + leafletLogger.error('Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"', 'markers'); + return false; + } - // The marker is automatically added to the map depending on the visibility - // of the layer, so we only have to open the popup if the marker is in the map - if (!doIndividualWatch && map.hasLayer(marker) && model.focus === true) { - marker.openPopup(); - } + // The marker goes to a correct layer group, so first of all we add it + layerGroup.addLayer(marker); - return true; - }; + // The marker is automatically added to the map depending on the visibility + // of the layer, so we only have to open the popup if the marker is in the map + if (!doIndividualWatch && map.hasLayer(marker) && model.focus === true) { + marker.openPopup(); + } - //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already) - var _addMarkers = function(mapId, markersToRender, oldModels, map, layers, leafletMarkers, leafletScope, - watchOptions, maybeLayerName, skips) { - for (var newName in markersToRender) { - if (skips[newName]) - continue; + return true; + }; - if (newName.search('-') !== -1) { - $log.error('The marker can\'t use a "-" on his key name: "' + newName + '".'); - continue; - } + //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already) + var _addMarkers = function(mapId, markersToRender, oldModels, map, layers, leafletMarkers, leafletScope, + watchOptions, maybeLayerName, skips) { + for (var newName in markersToRender) { + if (skips[newName]) { + continue; + } - var model = Helpers.copy(markersToRender[newName]); - var pathToMarker = Helpers.getObjectDotPath(maybeLayerName ? [maybeLayerName, newName] : [newName]); - var maybeLMarker = _getLMarker(leafletMarkers, newName, maybeLayerName); - if (!isDefined(maybeLMarker)) { - //(nmccready) very important to not have model changes when lObject is changed - //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal - //if it is left as the reference then all changes from oldModel vs newModel are ignored - //see _destroy (where modelDiff becomes meaningless if we do not copy here) - var marker = createMarker(model); - var layerName = (model ? model.layer : undefined) || maybeLayerName; //original way takes pref - if (!isDefined(marker)) { - $log.error(errorHeader + ' Received invalid data on the marker ' + newName + '.'); - continue; - } + if (newName.search('-') !== -1) { + leafletLogger.error('The marker can\'t use a "-" on his key name: "' + newName + '".', 'markers'); + continue; + } - _setLMarker(marker, leafletMarkers, newName, maybeLayerName); + var model = Helpers.copy(markersToRender[newName]); + var pathToMarker = Helpers.getObjectDotPath(maybeLayerName ? [maybeLayerName, newName] : [newName]); + var maybeLMarker = _getLMarker(leafletMarkers, newName, maybeLayerName); + if (!isDefined(maybeLMarker)) { + //(nmccready) very important to not have model changes when lObject is changed + //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal + //if it is left as the reference then all changes from oldModel vs newModel are ignored + //see _destroy (where modelDiff becomes meaningless if we do not copy here) + var marker = createMarker(model); + var layerName = (model ? model.layer : undefined) || maybeLayerName; //original way takes pref + if (!isDefined(marker)) { + leafletLogger.error('Received invalid data on the marker ' + newName, 'markers'); + continue; + } - // Bind message - if (isDefined(model.message)) { - marker.bindPopup(model.message, model.popupOptions); - } + _setLMarker(marker, leafletMarkers, newName, maybeLayerName); - // Add the marker to a cluster group if needed - if (isDefined(model.group)) { - var groupOptions = isDefined(model.groupOption) ? model.groupOption : null; - addMarkerToGroup(marker, model.group, groupOptions, map); - } + // Bind message + if (isDefined(model.message)) { + marker.bindPopup(model.message, model.popupOptions); + } - // Show label if defined - if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) { - marker.bindLabel(model.label.message, model.label.options); - } + // Add the marker to a cluster group if needed + if (isDefined(model.group)) { + var groupOptions = isDefined(model.groupOption) ? model.groupOption : null; + addMarkerToGroup(marker, model.group, groupOptions, map); + } - // Check if the marker should be added to a layer - if (isDefined(model) && (isDefined(model.layer) || isDefined(maybeLayerName))) { - - var pass = _maybeAddMarkerToLayer(layerName, layers, model, marker, - watchOptions.individual.doWatch, map); - if (!pass) - continue; //something went wrong move on in the loop - } else if (!isDefined(model.group)) { - // We do not have a layer attr, so the marker goes to the map layer - map.addLayer(marker); - if (!watchOptions.individual.doWatch && model.focus === true) { - marker.openPopup(); - } - } + // Show label if defined + if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) { + marker.bindLabel(model.label.message, model.label.options); + } - if (watchOptions.individual.doWatch) { - addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map, - watchOptions.individual.isDeep); - } + // Check if the marker should be added to a layer + if (isDefined(model) && (isDefined(model.layer) || isDefined(maybeLayerName))) { - listenMarkerEvents(marker, model, leafletScope, watchOptions.individual.doWatch, map); - leafletMarkerEvents.bindEvents(mapId, marker, pathToMarker, model, leafletScope, layerName); - } else { - var oldModel = isDefined(oldModel) ? oldModels[newName] : undefined; - updateMarker(model, oldModel, maybeLMarker, pathToMarker, leafletScope, layers, map); + var pass = _maybeAddMarkerToLayer(layerName, layers, model, marker, + watchOptions.individual.doWatch, map); + if (!pass) { + continue; //something went wrong move on in the loop + } + } else if (!isDefined(model.group)) { + // We do not have a layer attr, so the marker goes to the map layer + map.addLayer(marker); + if (!watchOptions.individual.doWatch && model.focus === true) { + marker.openPopup(); } } - }; - var _seeWhatWeAlreadyHave = function(markerModels, oldMarkerModels, lMarkers, isEqual, cb) { + if (watchOptions.individual.doWatch) { + addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map, + watchOptions.individual.isDeep); + } + + listenMarkerEvents(marker, model, leafletScope, watchOptions.individual.doWatch, map); + leafletMarkerEvents.bindEvents(mapId, marker, pathToMarker, model, leafletScope, layerName); + } else { + var oldModel = isDefined(oldModel) ? oldModels[newName] : undefined; + updateMarker(model, oldModel, maybeLMarker, pathToMarker, leafletScope, layers, map); + } + } + }; + + var _seeWhatWeAlreadyHave = function(markerModels, oldMarkerModels, lMarkers, isEqual, cb) { var hasLogged = false; var equals = false; var oldMarker; @@ -4715,7 +4861,6 @@ angular.module('leaflet-directive').directive('markers', var doCheckOldModel = isDefined(oldMarkerModels); for (var name in lMarkers) { if (!hasLogged) { - $log.debug(errorHeader + '[markers] destroy: '); hasLogged = true; } @@ -4732,37 +4877,38 @@ angular.module('leaflet-directive').directive('markers', !isDefined(markerModels[name]) || !Object.keys(markerModels[name]).length || equals) { - if (cb && Helpers.isFunction(cb)) - cb(newMarker, oldMarker, name); + if (cb && Helpers.isFunction(cb)) { + cb(newMarker, oldMarker, name); + } } } }; - var _destroy = function(markerModels, oldMarkerModels, lMarkers, map, layers) { + var _destroy = function(markerModels, oldMarkerModels, lMarkers, map, layers) { _seeWhatWeAlreadyHave(markerModels, oldMarkerModels, lMarkers, false, function(newMarker, oldMarker, lMarkerName) { - $log.debug(errorHeader + '[marker] is deleting marker: ' + lMarkerName); + leafletLogger.debug('Deleting marker: ' + lMarkerName, 'markers'); deleteMarker(lMarkers[lMarkerName], map, layers); delete lMarkers[lMarkerName]; }); }; - var _getNewModelsToSkipp = function(newModels, oldModels, lMarkers) { + var _getNewModelsToSkipp = function(newModels, oldModels, lMarkers) { var skips = {}; _seeWhatWeAlreadyHave(newModels, oldModels, lMarkers, true, function(newMarker, oldMarker, lMarkerName) { - $log.debug(errorHeader + '[marker] is already rendered, marker: ' + lMarkerName); + leafletLogger.debug('Already rendered marker: ' + lMarkerName, 'markers'); skips[lMarkerName] = newMarker; }); return skips; }; - return { + return { restrict: 'A', scope: false, replace: false, - require: ['leaflet', '?layers'], + require: ['leaflet', '?lfLayers'], link: function(scope, element, attrs, controller) { var mapController = controller[0]; @@ -4786,9 +4932,10 @@ angular.module('leaflet-directive').directive('markers', var watchOptions = leafletScope.markersWatchOptions || _markersWatchOptions; // backwards compat - if (isDefined(attrs.watchMarkers)) - watchOptions.doWatch = watchOptions.individual.doWatch = - (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers)); + if (isDefined(attrs.watchMarkers)) { + watchOptions.doWatch = watchOptions.individual.doWatch = + (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers)); + } var isNested = (isDefined(attrs.markersNested) && Helpers.isTruthy(attrs.markersNested)); @@ -4835,9 +4982,9 @@ angular.module('leaflet-directive').directive('markers', }); }, }; - }]); +}]); -angular.module('leaflet-directive').directive('maxbounds', ["$log", "leafletMapDefaults", "leafletBoundsHelpers", "leafletHelpers", function($log, leafletMapDefaults, leafletBoundsHelpers, leafletHelpers) { +angular.module('leaflet-directive').directive('lfMaxbounds', ["leafletLogger", "leafletMapDefaults", "leafletBoundsHelpers", "leafletHelpers", function(leafletLogger, leafletMapDefaults, leafletBoundsHelpers, leafletHelpers) { return { restrict: 'A', @@ -4873,13 +5020,13 @@ angular.module('leaflet-directive').directive('maxbounds', ["$log", "leafletMapD }; }]); -angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletData", "leafletMapDefaults", "leafletHelpers", "leafletPathsHelpers", "leafletPathEvents", function($log, $q, leafletData, leafletMapDefaults, leafletHelpers, leafletPathsHelpers, leafletPathEvents) { +angular.module('leaflet-directive').directive('lfPaths', ["leafletLogger", "$q", "leafletData", "leafletMapDefaults", "leafletHelpers", "leafletPathsHelpers", "leafletPathEvents", function(leafletLogger, $q, leafletData, leafletMapDefaults, leafletHelpers, leafletPathsHelpers, leafletPathEvents) { return { restrict: 'A', scope: false, replace: false, - require: ['leaflet', '?layers'], + require: ['leaflet', '?lfLayers'], link: function(scope, element, attrs, controller) { var mapController = controller[0]; @@ -4955,7 +5102,7 @@ angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletDa } if (newName.search('-') !== -1) { - $log.error('[AngularJS - Leaflet] The path name "' + newName + '" is not valid. It must not include "-" and a number.'); + leafletLogger.error('The path name "' + newName + '" is not valid. It must not include "-" and a number.', 'paths'); continue; } @@ -4977,23 +5124,23 @@ angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletDa if (isDefined(pathData) && isDefined(pathData.layer)) { if (!isString(pathData.layer)) { - $log.error('[AngularJS - Leaflet] A layername must be a string'); + leafletLogger.error('A layername must be a string', 'paths'); continue; } if (!isDefined(layers)) { - $log.error('[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.'); + leafletLogger.error('You must add layers to the directive if the markers are going to use this functionality', 'paths'); continue; } if (!isDefined(layers.overlays) || !isDefined(layers.overlays[pathData.layer])) { - $log.error('[AngularJS - Leaflet] A path can only be added to a layer of type "group"'); + leafletLogger.error('A path can only be added to a layer of type "group"', 'paths'); continue; } var layerGroup = layers.overlays[pathData.layer]; if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { - $log.error('[AngularJS - Leaflet] Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"'); + leafletLogger.error('Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"', 'paths'); continue; } @@ -5030,7 +5177,7 @@ angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletDa }; }]); -angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", "leafletMapDefaults", "leafletHelpers", function($log, leafletData, leafletMapDefaults, leafletHelpers) { +angular.module('leaflet-directive').directive('lfTiles', ["leafletLogger", "leafletData", "leafletMapDefaults", "leafletHelpers", function(leafletLogger, leafletData, leafletMapDefaults, leafletHelpers) { return { restrict: 'A', @@ -5044,14 +5191,16 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", " var tiles = leafletScope.tiles; if (!isDefined(tiles) || !isDefined(tiles.url)) { - $log.warn('[AngularJS - Leaflet] The \'tiles\' definition doesn\'t have the \'url\' property.'); + leafletLogger.warn('[AngularJS - Leaflet] The \'tiles\' definition doesn\'t have the \'url\' property.', 'tiles'); return; } controller.getMap().then(function(map) { var defaults = leafletMapDefaults.getDefaults(attrs.id); var tileLayerObj; + leafletScope.$watch('tiles', function(tiles, oldtiles) { + var tileLayerOptions = defaults.tileLayerOptions; var tileLayerUrl = defaults.tileLayer; @@ -5082,7 +5231,7 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", " return; } - // If the options of the tilelayer is changed, we need to redraw the layer + // If the options of the tilelayer are changed, we need to redraw the layer if (isDefined(tiles.url) && isDefined(tiles.options) && (tiles.type !== oldtiles.type || !angular.equals(tiles.options, tileLayerOptions))) { map.removeLayer(tileLayerObj); @@ -5118,13 +5267,12 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", " */ ['markers', 'geojson'].forEach(function(name) { angular.module('leaflet-directive').directive(name + 'WatchOptions', [ - '$log', '$rootScope', '$q', 'leafletData', 'leafletHelpers', - function($log, $rootScope, $q, leafletData, leafletHelpers) { + 'leafletLogger', '$rootScope', '$q', 'leafletData', 'leafletHelpers', + function(leafletLogger, $rootScope, $q, leafletData, leafletHelpers) { - var isDefined = leafletHelpers.isDefined, - errorHeader = leafletHelpers.errorHeader, - isObject = leafletHelpers.isObject, - _watchOptions = leafletHelpers.watchOptions; + var isDefined = leafletHelpers.isDefined; + var isObject = leafletHelpers.isObject; + var _watchOptions = leafletHelpers.watchOptions; return { restrict: 'A', @@ -5141,26 +5289,24 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", " if (isObject(scope[name + 'WatchOptions'])) angular.extend(_watchOptions, scope[name + 'WatchOptions']); else - $log.error(errorHeader + '[' + name + 'WatchOptions] is not an object'); + leafletLogger.error('is not an object', 'watch options'); leafletScope[name + 'WatchOptions'] = _watchOptions; } }); }, }; - },]); + }, ]); }); angular.module('leaflet-directive') -.factory('LeafletEventsHelpersFactory', ["$rootScope", "$q", "$log", "leafletHelpers", function($rootScope, $q, $log, leafletHelpers) { +.factory('LeafletEventsHelpersFactory', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", function($rootScope, $q, leafletLogger, leafletHelpers) { var safeApply = leafletHelpers.safeApply; var isDefined = leafletHelpers.isDefined; var isObject = leafletHelpers.isObject; var isArray = leafletHelpers.isArray; - var errorHeader = leafletHelpers.errorHeader; 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; @@ -5190,12 +5336,12 @@ angular.module('leaflet-directive') var _this = this; maybeMapId = maybeMapId || ''; - if (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); }; }; @@ -5209,8 +5355,9 @@ angular.module('leaflet-directive') modelName: modelName, model: model, }; - if (isDefined(layerName)) - angular.extend(toSend, {layerName: layerName}); + if (isDefined(layerName)) { + angular.extend(toSend, {layerName: layerName}); + } if (logic === 'emit') { scope.$emit(broadcastName, toSend); @@ -5230,7 +5377,7 @@ angular.module('leaflet-directive') events = this.getAvailableEvents(); } else if (!isObject(leafletScope.eventBroadcast)) { // Not a valid object - $log.error(errorHeader + 'event-broadcast must be an object check your model.'); + leafletLogger.error('event-broadcast must be an object check your model.'); } else { // We have a possible valid object if (!isDefined(leafletScope.eventBroadcast[_this.lObjectType])) { @@ -5238,33 +5385,37 @@ angular.module('leaflet-directive') 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.'); + 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') - $log.warn(errorHeader + 'Available event propagation logic are: \'emit\' or \'broadcast\'.'); + 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; + isArray(leafletScope.eventBroadcast[_this.lObjectType].enable)) { + eventsEnable = true; + } + if (isDefined(leafletScope.eventBroadcast[_this.lObjectType].disable) && - isArray(leafletScope.eventBroadcast[_this.lObjectType].disable)) - eventsDisable = true; + 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'); + leafletLogger.warn('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'); + leafletLogger.warn('must enable or disable events'); } else { // At this point the object is OK, lets enable or disable events if (eventsEnable) { @@ -5273,12 +5424,12 @@ angular.module('leaflet-directive') // 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'); + 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 - $log.warn(errorHeader + 'This event ' + eventName + ' does not exist'); + leafletLogger.warn('This event ' + eventName + ' does not exist'); } else { // All ok enable the event events.push(eventName); @@ -5292,7 +5443,7 @@ angular.module('leaflet-directive') 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'); + leafletLogger.warn('This event ' + eventName + ' does not exist or has been already disabled'); } else { events.splice(index, 1); @@ -5317,7 +5468,7 @@ angular.module('leaflet-directive') }]); angular.module('leaflet-directive') -.factory('leafletGeoJsonEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletData", function($rootScope, $q, $log, leafletHelpers, +.factory('leafletGeoJsonEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletData", function($rootScope, $q, leafletLogger, leafletHelpers, LeafletEventsHelpersFactory, leafletData) { var safeApply = leafletHelpers.safeApply; var EventsHelper = LeafletEventsHelpersFactory; @@ -5365,7 +5516,7 @@ angular.module('leaflet-directive') }]); angular.module('leaflet-directive') -.factory('leafletLabelEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", function($rootScope, $q, $log, leafletHelpers, LeafletEventsHelpersFactory) { +.factory('leafletLabelEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "LeafletEventsHelpersFactory", function($rootScope, $q, leafletLogger, leafletHelpers, LeafletEventsHelpersFactory) { var Helpers = leafletHelpers; var EventsHelper = LeafletEventsHelpersFactory; @@ -5408,7 +5559,7 @@ angular.module('leaflet-directive') }]); angular.module('leaflet-directive') -.factory('leafletMapEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletEventsHelpers", "leafletIterators", function($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers, leafletIterators) { +.factory('leafletMapEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "leafletEventsHelpers", "leafletIterators", function($rootScope, $q, leafletLogger, leafletHelpers, leafletEventsHelpers, leafletIterators) { var isDefined = leafletHelpers.isDefined; var fire = leafletEventsHelpers.fire; @@ -5462,12 +5613,13 @@ angular.module('leaflet-directive') }; var _genDispatchMapEvent = function(scope, eventName, logic, maybeMapId) { - if (maybeMapId) + if (maybeMapId) { maybeMapId = maybeMapId + '.'; + } + return function(e) { // Put together broadcast name var broadcastName = 'leafletDirectiveMap.' + maybeMapId + eventName; - $log.debug(broadcastName); // Safely broadcast the event fire(scope, broadcastName, logic, e, e.target, scope); @@ -5478,15 +5630,10 @@ angular.module('leaflet-directive') scope.$broadcast('boundsChanged'); }; - var _notifyCenterUrlHashChanged = function(scope, map, attrs, search) { - if (!isDefined(attrs.urlHashCenter)) { - return; - } - + var _notifyCenterUrlHashChanged = function(scope, map, search) { var center = map.getCenter(); var centerUrlHash = (center.lat).toFixed(4) + ':' + (center.lng).toFixed(4) + ':' + map.getZoom(); if (!isDefined(search.c) || search.c !== centerUrlHash) { - //$log.debug("notified new center..."); scope.$emit('centerUrlHash', centerUrlHash); } }; @@ -5509,7 +5656,7 @@ angular.module('leaflet-directive') }]); angular.module('leaflet-directive') -.factory('leafletMarkerEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletLabelEvents", function($rootScope, $q, $log, leafletHelpers, LeafletEventsHelpersFactory, leafletLabelEvents) { +.factory('leafletMarkerEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletLabelEvents", function($rootScope, $q, leafletLogger, leafletHelpers, LeafletEventsHelpersFactory, leafletLabelEvents) { var safeApply = leafletHelpers.safeApply; var isDefined = leafletHelpers.isDefined; var Helpers = leafletHelpers; @@ -5580,11 +5727,10 @@ angular.module('leaflet-directive') }]); angular.module('leaflet-directive') -.factory('leafletPathEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletLabelEvents", "leafletEventsHelpers", function($rootScope, $q, $log, leafletHelpers, leafletLabelEvents, leafletEventsHelpers) { +.factory('leafletPathEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "leafletLabelEvents", "leafletEventsHelpers", function($rootScope, $q, leafletLogger, leafletHelpers, leafletLabelEvents, leafletEventsHelpers) { var isDefined = leafletHelpers.isDefined; var isObject = leafletHelpers.isObject; var Helpers = leafletHelpers; - var errorHeader = leafletHelpers.errorHeader; var lblHelp = leafletLabelEvents; var fire = leafletEventsHelpers.fire; @@ -5595,12 +5741,12 @@ angular.module('leaflet-directive') var _genDispatchPathEvent = function(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName) { maybeMapId = maybeMapId || ''; - if (maybeMapId) + if (maybeMapId) { maybeMapId = '.' + maybeMapId; + } return function(e) { var broadcastName = 'leafletDirectivePath' + maybeMapId + '.' + eventName; - $log.debug(broadcastName); fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName); }; }; @@ -5616,7 +5762,7 @@ angular.module('leaflet-directive') pathEvents = _getAvailablePathEvents(); } else if (!isObject(leafletScope.eventBroadcast)) { // Not a valid object - $log.error(errorHeader + 'event-broadcast must be an object check your model.'); + leafletLogger.error('event-broadcast must be an object check your model.'); } else { // We have a possible valid object if (!isDefined(leafletScope.eventBroadcast.path)) { @@ -5624,7 +5770,7 @@ angular.module('leaflet-directive') pathEvents = _getAvailablePathEvents(); } else if (isObject(leafletScope.eventBroadcast.paths)) { // Not a valid object - $log.warn(errorHeader + 'event-broadcast.path must be an object check your model.'); + leafletLogger.warn('event-broadcast.path must be an object check your model.'); } else { // We have a possible valid map object // Event propadation logic @@ -5632,7 +5778,7 @@ angular.module('leaflet-directive') // We take care of possible propagation logic if (leafletScope.eventBroadcast.path.logic !== 'emit' && leafletScope.eventBroadcast.path.logic !== 'broadcast') { // This is an error - $log.warn(errorHeader + 'Available event propagation logic are: \'emit\' or \'broadcast\'.'); + leafletLogger.warn('Available event propagation logic are: \'emit\' or \'broadcast\'.'); } else if (leafletScope.eventBroadcast.path.logic === 'emit') { logic = 'emit'; } @@ -5655,10 +5801,10 @@ angular.module('leaflet-directive') if (pathEventsEnable && pathEventsDisable) { // Both are active, this is an error - $log.warn(errorHeader + 'can not enable and disable events at the same time'); + leafletLogger.warn('can not enable and disable events at the same time'); } else if (!pathEventsEnable && !pathEventsDisable) { // Both are inactive, this is an error - $log.warn(errorHeader + 'must enable or disable events'); + leafletLogger.warn('must enable or disable events'); } else { // At this point the path object is OK, lets enable or disable events if (pathEventsEnable) { @@ -5669,12 +5815,12 @@ angular.module('leaflet-directive') // Do we have already the event enabled? if (pathEvents.indexOf(eventName) !== -1) { // Repeated event, this is an error - $log.warn(errorHeader + 'This event ' + eventName + ' is already enabled'); + leafletLogger.warn('This event ' + eventName + ' is already enabled'); } else { // Does the event exists? if (_getAvailablePathEvents().indexOf(eventName) === -1) { // The event does not exists, this is an error - $log.warn(errorHeader + 'This event ' + eventName + ' does not exist'); + leafletLogger.warn('This event ' + eventName + ' does not exist'); } else { // All ok enable the event pathEvents.push(eventName); @@ -5689,7 +5835,7 @@ angular.module('leaflet-directive') var index = pathEvents.indexOf(eventName); if (index === -1) { // The event does not exist - $log.warn(errorHeader + 'This event ' + eventName + ' does not exist or has been already disabled'); + leafletLogger.warn('This event ' + eventName + ' does not exist or has been already disabled'); } else { pathEvents.splice(index, 1); diff --git a/dist/angular-leaflet-directive.min.js b/dist/angular-leaflet-directive.min.js index cbcd8406..5676c0b8 100644 --- a/dist/angular-leaflet-directive.min.js +++ b/dist/angular-leaflet-directive.min.js @@ -28,13 +28,13 @@ */ /*! -* angular-leaflet-directive 2015-11-06 +* angular-leaflet-directive 0.10.1 2015-11-13 * angular-leaflet-directive - An AngularJS directive to easily interact with Leaflet maps * git: https://github.com/tombatossals/angular-leaflet-directive */ (function(angular){ 'use strict'; -!function(angular){"use strict";angular.module("leaflet-directive",[]).directive("leaflet",["$q","leafletData","leafletMapDefaults","leafletHelpers","leafletMapEvents",function(a,b,c,d,e){return{restrict:"EA",replace:!0,scope:{center:"=",lfCenter:"=",defaults:"=",maxbounds:"=",bounds:"=",markers:"=",legend:"=",geojson:"=",paths:"=",tiles:"=",layers:"=",controls:"=",decorations:"=",eventBroadcast:"=",markersWatchOptions:"=",geojsonWatchOptions:"="},transclude:!0,template:'
',controller:["$scope",function(b){this._leafletMap=a.defer(),this.getMap=function(){return this._leafletMap.promise},this.getLeafletScope=function(){return b}}],link:function(a,f,g,h){function i(){isNaN(g.width)?f.css("width",g.width):f.css("width",g.width+"px")}function j(){isNaN(g.height)?f.css("height",g.height):f.css("height",g.height+"px")}var k=d.isDefined,l=c.setDefaults(a.defaults,g.id),m=e.getAvailableMapEvents(),n=e.addEvents;a.mapId=g.id,b.setDirectiveControls({},g.id),k(g.width)&&(i(),a.$watch(function(){return f[0].getAttribute("width")},function(){i(),o.invalidateSize()})),k(g.height)&&(j(),a.$watch(function(){return f[0].getAttribute("height")},function(){j(),o.invalidateSize()}));var o=new L.Map(f[0],c.getMapCreationDefaults(g.id));if(h._leafletMap.resolve(o),k(g.center)||k(g.lfCenter)||o.setView([l.center.lat,l.center.lng],l.center.zoom),!k(g.tiles)&&!k(g.layers)){var p=L.tileLayer(l.tileLayer,l.tileLayerOptions);p.addTo(o),b.setTiles(p,g.id)}if(k(o.zoomControl)&&k(l.zoomControlPosition)&&o.zoomControl.setPosition(l.zoomControlPosition),k(o.zoomControl)&&l.zoomControl===!1&&o.zoomControl.removeFrom(o),k(o.zoomsliderControl)&&k(l.zoomsliderControl)&&l.zoomsliderControl===!1&&o.zoomsliderControl.removeFrom(o),!k(g.eventBroadcast)){var q="broadcast";n(o,m,"eventName",a,q)}o.whenReady(function(){b.setMap(o,g.id)}),a.$on("$destroy",function(){c.reset(),o.remove(),b.unresolveMap(g.id)}),a.$on("invalidateSize",function(){o.invalidateSize()})}}}]),angular.module("leaflet-directive").factory("leafletBoundsHelpers",["$log","leafletHelpers",function(a,b){function c(a){return angular.isDefined(a)&&angular.isDefined(a.southWest)&&angular.isDefined(a.northEast)&&angular.isNumber(a.southWest.lat)&&angular.isNumber(a.southWest.lng)&&angular.isNumber(a.northEast.lat)&&angular.isNumber(a.northEast.lng)}var d=b.isArray,e=b.isNumber,f=b.isFunction,g=b.isDefined;return{createLeafletBounds:function(a){return c(a)?L.latLngBounds([a.southWest.lat,a.southWest.lng],[a.northEast.lat,a.northEast.lng]):void 0},isValidBounds:c,createBoundsFromArray:function(b){return d(b)&&2===b.length&&d(b[0])&&d(b[1])&&2===b[0].length&&2===b[1].length&&e(b[0][0])&&e(b[0][1])&&e(b[1][0])&&e(b[1][1])?{northEast:{lat:b[0][0],lng:b[0][1]},southWest:{lat:b[1][0],lng:b[1][1]}}:void a.error("[AngularJS - Leaflet] The bounds array is not valid.")},createBoundsFromLeaflet:function(b){if(!(g(b)&&f(b.getNorthEast)&&f(b.getSouthWest)))return void a.error("[AngularJS - Leaflet] The leaflet bounds is not valid object.");var c=b.getNorthEast(),d=b.getSouthWest();return{northEast:{lat:c.lat,lng:c.lng},southWest:{lat:d.lat,lng:d.lng}}}}}]),angular.module("leaflet-directive").factory("leafletControlHelpers",["$rootScope","$log","leafletHelpers","leafletLayerHelpers","leafletMapDefaults",function(a,b,c,d,e){var f=c.isDefined,g=c.isObject,h=d.createLayer,i={},j=c.errorHeader+" [Controls] ",k=function(a,b,c){var d=e.getDefaults(c);if(!d.controls.layers.visible)return!1;var h=!1;return g(a)&&Object.keys(a).forEach(function(b){var c=a[b];f(c.layerOptions)&&c.layerOptions.showOnSelector===!1||(h=!0)}),g(b)&&Object.keys(b).forEach(function(a){var c=b[a];f(c.layerParams)&&c.layerParams.showOnSelector===!1||(h=!0)}),h},l=function(a){var b=e.getDefaults(a),c={collapsed:b.controls.layers.collapsed,position:b.controls.layers.position,autoZIndex:!1};angular.extend(c,b.controls.layers.options);var d;return d=b.controls.layers&&f(b.controls.layers.control)?b.controls.layers.control.apply(this,[[],[],c]):new L.control.layers([],[],c)},m={draw:{isPluginLoaded:function(){return angular.isDefined(L.Control.Draw)?!0:(b.error(j+" Draw plugin is not loaded."),!1)},checkValidParams:function(){return!0},createControl:function(a){return new L.Control.Draw(a)}},scale:{isPluginLoaded:function(){return!0},checkValidParams:function(){return!0},createControl:function(a){return new L.control.scale(a)}},fullscreen:{isPluginLoaded:function(){return angular.isDefined(L.Control.Fullscreen)?!0:(b.error(j+" Fullscreen plugin is not loaded."),!1)},checkValidParams:function(){return!0},createControl:function(a){return new L.Control.Fullscreen(a)}},search:{isPluginLoaded:function(){return angular.isDefined(L.Control.Search)?!0:(b.error(j+" Search plugin is not loaded."),!1)},checkValidParams:function(){return!0},createControl:function(a){return new L.Control.Search(a)}},custom:{},minimap:{isPluginLoaded:function(){return angular.isDefined(L.Control.MiniMap)?!0:(b.error(j+" Minimap plugin is not loaded."),!1)},checkValidParams:function(a){return f(a.layer)?!0:(b.warn(j+' minimap "layer" option should be defined.'),!1)},createControl:function(a){var c=h(a.layer);return f(c)?new L.Control.MiniMap(c,a):void b.warn(j+' minimap control "layer" could not be created.')}}};return{layersControlMustBeVisible:k,isValidControlType:function(a){return-1!==Object.keys(m).indexOf(a)},createControl:function(a,b){return m[a].checkValidParams(b)?m[a].createControl(b):void 0},updateLayersControl:function(a,b,c,d,e,g){var h,j=i[b],m=k(d,e,b);if(f(j)&&c){for(h in g.baselayers)j.removeLayer(g.baselayers[h]);for(h in g.overlays)j.removeLayer(g.overlays[h]);a.removeControl(j),delete i[b]}if(m){j=l(b),i[b]=j;for(h in d){var n=f(d[h].layerOptions)&&d[h].layerOptions.showOnSelector===!1;!n&&f(g.baselayers[h])&&j.addBaseLayer(g.baselayers[h],d[h].name)}for(h in e){var o=f(e[h].layerParams)&&e[h].layerParams.showOnSelector===!1;!o&&f(g.overlays[h])&&j.addOverlay(g.overlays[h],e[h].name)}a.addControl(j)}return m}}}]),angular.module("leaflet-directive").service("leafletData",["$log","$q","leafletHelpers",function(a,b,c){var d=c.getDefer,e=c.getUnresolvedDefer,f=c.setResolvedDefer,g={},h=this,i=function(a){return a.charAt(0).toUpperCase()+a.slice(1)},j=["map","tiles","layers","paths","markers","geoJSON","UTFGrid","decorations","directiveControls"];j.forEach(function(a){g[a]={}}),this.unresolveMap=function(a){var b=c.obtainEffectiveMapId(g.map,a);j.forEach(function(a){g[a][b]=void 0})},j.forEach(function(a){var b=i(a);h["set"+b]=function(b,c){var d=e(g[a],c);d.resolve(b),f(g[a],c)},h["get"+b]=function(b){var c=d(g[a],b);return c.promise}})}]),angular.module("leaflet-directive").service("leafletDirectiveControlsHelpers",["$log","leafletData","leafletHelpers",function(a,b,c){var d=c.isDefined,e=c.isString,f=c.isObject,g=c.errorHeader,h=g+"[leafletDirectiveControlsHelpers",i=function(c,g,i,j){var k=h+".extend] ",l={};if(!d(g))return void a.error(k+"thingToAddName cannot be undefined");if(e(g)&&d(i)&&d(j))l[g]={create:i,clean:j};else{if(!f(g)||d(i)||d(j))return void a.error(k+"incorrect arguments");l=g}b.getDirectiveControls().then(function(a){angular.extend(a,l),b.setDirectiveControls(a,c)})};return{extend:i}}]),angular.module("leaflet-directive").service("leafletGeoJsonHelpers",["leafletHelpers","leafletIterators",function(a,b){var c=a,d=b,e=function(a,b){return this.lat=a,this.lng=b,this},f=function(a){return Array.isArray(a)&&2===a.length?a[1]:c.isDefined(a.type)&&"Point"===a.type?+a.coordinates[1]:+a.lat},g=function(a){return Array.isArray(a)&&2===a.length?a[0]:c.isDefined(a.type)&&"Point"===a.type?+a.coordinates[0]:+a.lng},h=function(a){if(c.isUndefined(a))return!1;if(c.isArray(a)){if(2===a.length&&c.isNumber(a[0])&&c.isNumber(a[1]))return!0}else if(c.isDefined(a.type)&&"Point"===a.type&&c.isArray(a.coordinates)&&2===a.coordinates.length&&c.isNumber(a.coordinates[0])&&c.isNumber(a.coordinates[1]))return!0;var b=d.all(["lat","lng"],function(b){return c.isDefined(a[b])&&c.isNumber(a[b])});return b},i=function(a){if(a&&h(a)){var b=null;if(Array.isArray(a)&&2===a.length)b=new e(a[1],a[0]);else{if(!c.isDefined(a.type)||"Point"!==a.type)return a;b=new e(a.coordinates[1],a.coordinates[0])}return angular.extend(a,b)}};return{getLat:f,getLng:g,validateCoords:h,getCoords:i}}]),angular.module("leaflet-directive").service("leafletHelpers",["$q","$log",function(a,b){function c(a,c){var d,f;if(angular.isDefined(c))d=c;else if(0===Object.keys(a).length)d="main";else if(Object.keys(a).length>=1)for(f in a)a.hasOwnProperty(f)&&(d=f);else b.error(e+"- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call");return d}function d(b,d){var e,f=c(b,d);return angular.isDefined(b[f])&&b[f].resolvedDefer!==!0?e=b[f].defer:(e=a.defer(),b[f]={defer:e,resolvedDefer:!1}),e}var e="[AngularJS - Leaflet] ",f=angular.copy,g=f,h=function(a,b){var c;if(a&&angular.isObject(a))return null!==b&&angular.isString(b)?(c=a,b.split(".").forEach(function(a){c&&(c=c[a])}),c):b},i=function(a){return a.split(".").reduce(function(a,b){return a+'["'+b+'"]'})},j=function(a){return a.reduce(function(a,b){return a+"."+b})},k=function(a){return angular.isDefined(a)&&null!==a},l=function(a){return!k(a)},m=/([\:\-\_]+(.))/g,n=/^moz([A-Z])/,o=/^((?:x|data)[\:\-_])/i,p=function(a){return a.replace(m,function(a,b,c,d){return d?c.toUpperCase():c}).replace(n,"Moz$1")},q=function(a){return p(a.replace(o,""))};return{camelCase:p,directiveNormalize:q,copy:f,clone:g,errorHeader:e,getObjectValue:h,getObjectArrayPath:i,getObjectDotPath:j,defaultTo:function(a,b){return k(a)?a:b},isTruthy:function(a){return"true"===a||a===!0},isEmpty:function(a){return 0===Object.keys(a).length},isUndefinedOrEmpty:function(a){return angular.isUndefined(a)||null===a||0===Object.keys(a).length},isDefined:k,isUndefined:l,isNumber:angular.isNumber,isString:angular.isString,isArray:angular.isArray,isObject:angular.isObject,isFunction:angular.isFunction,equals:angular.equals,isValidCenter:function(a){return angular.isDefined(a)&&angular.isNumber(a.lat)&&angular.isNumber(a.lng)&&angular.isNumber(a.zoom)},isValidPoint:function(a){return angular.isDefined(a)?angular.isArray(a)?2===a.length&&angular.isNumber(a[0])&&angular.isNumber(a[1]):angular.isNumber(a.lat)&&angular.isNumber(a.lng):!1},isSameCenterOnMap:function(a,b){var c=b.getCenter(),d=b.getZoom();return a.lat&&a.lng&&c.lat.toFixed(4)===a.lat.toFixed(4)&&c.lng.toFixed(4)===a.lng.toFixed(4)&&d===a.zoom?!0:!1},safeApply:function(a,b){var c=a.$root.$$phase;"$apply"===c||"$digest"===c?a.$eval(b):a.$evalAsync(b)},obtainEffectiveMapId:c,getDefer:function(a,b){var e,f=c(a,b);return e=angular.isDefined(a[f])&&a[f].resolvedDefer!==!1?a[f].defer:d(a,b)},getUnresolvedDefer:d,setResolvedDefer:function(a,b){var d=c(a,b);a[d].resolvedDefer=!0},rangeIsSupported:function(){var a=document.createElement("input");return a.setAttribute("type","range"),"range"===a.type},FullScreenControlPlugin:{isLoaded:function(){return angular.isDefined(L.Control.Fullscreen)}},MiniMapControlPlugin:{isLoaded:function(){return angular.isDefined(L.Control.MiniMap)}},AwesomeMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.AwesomeMarkers)&&angular.isDefined(L.AwesomeMarkers.Icon)},is:function(a){return this.isLoaded()?a instanceof L.AwesomeMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},VectorMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.VectorMarkers)&&angular.isDefined(L.VectorMarkers.Icon)},is:function(a){return this.isLoaded()?a instanceof L.VectorMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},DomMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.DomMarkers)&&angular.isDefined(L.DomMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.DomMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},PolylineDecoratorPlugin:{isLoaded:function(){return angular.isDefined(L.PolylineDecorator)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.PolylineDecorator:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},MakiMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.MakiMarkers)&&angular.isDefined(L.MakiMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.MakiMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},ExtraMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.ExtraMarkers)&&angular.isDefined(L.ExtraMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.ExtraMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},LabelPlugin:{isLoaded:function(){return angular.isDefined(L.Label)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},MarkerClusterPlugin:{isLoaded:function(){return angular.isDefined(L.MarkerClusterGroup)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},GoogleLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Google)},is:function(a){return this.isLoaded()?a instanceof L.Google:!1}},LeafletProviderPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.Provider)},is:function(a){return this.isLoaded()?a instanceof L.TileLayer.Provider:!1}},ChinaLayerPlugin:{isLoaded:function(){return angular.isDefined(L.tileLayer.chinaProvider)}},HeatLayerPlugin:{isLoaded:function(){return angular.isDefined(L.heatLayer)}},WebGLHeatMapLayerPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.WebGLHeatMap)}},BingLayerPlugin:{isLoaded:function(){return angular.isDefined(L.BingLayer)},is:function(a){return this.isLoaded()?a instanceof L.BingLayer:!1}},WFSLayerPlugin:{isLoaded:function(){return void 0!==L.GeoJSON.WFS},is:function(a){return this.isLoaded()?a instanceof L.GeoJSON.WFS:!1}},AGSBaseLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.basemapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.basemapLayer:!1}},AGSLayerPlugin:{isLoaded:function(){return void 0!==lvector&&void 0!==lvector.AGS},is:function(a){return this.isLoaded()?a instanceof lvector.AGS:!1}},AGSFeatureLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.featureLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.featureLayer:!1}},AGSTiledMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.tiledMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.tiledMapLayer:!1}},AGSDynamicMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.dynamicMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.dynamicMapLayer:!1}},AGSImageMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.imageMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.imageMapLayer:!1}},AGSClusteredLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.clusteredFeatureLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.clusteredFeatureLayer:!1}},AGSHeatmapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.heatmapFeatureLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.heatmapFeatureLayer:!1}},YandexLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Yandex)},is:function(a){return this.isLoaded()?a instanceof L.Yandex:!1}},GeoJSONPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.GeoJSON)},is:function(a){return this.isLoaded()?a instanceof L.TileLayer.GeoJSON:!1}},UTFGridPlugin:{isLoaded:function(){return angular.isDefined(L.UtfGrid)},is:function(a){return this.isLoaded()?a instanceof L.UtfGrid:(b.error("[AngularJS - Leaflet] No UtfGrid plugin found."),!1)}},CartoDB:{isLoaded:function(){return cartodb},is:function(){return!0}},Leaflet:{DivIcon:{is:function(a){return a instanceof L.DivIcon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}},Icon:{is:function(a){return a instanceof L.Icon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}}},watchOptions:{doWatch:!0,isDeep:!0,individual:{doWatch:!0,isDeep:!0}}}}]),angular.module("leaflet-directive").service("leafletIterators",["$log","leafletHelpers",function(a,b){var c,d=b,e=b.errorHeader+"leafletIterators: ",f=Object.keys,g=d.isFunction,h=d.isObject,i=Math.pow(2,53)-1,j=function(a){var b=null!==a&&a.length;return d.isNumber(b)&&b>=0&&i>=b},k=function(a){return a},l=function(a){return function(b){return null===b?void 0:b[a]}},m=function(a,b,c){if(void 0===b)return a;switch(null===c?3:c){case 1:return function(c){return a.call(b,c)};case 2:return function(c,d){return a.call(b,c,d)};case 3:return function(c,d,e){return a.call(b,c,d,e)};case 4:return function(c,d,e,f){return a.call(b,c,d,e,f)}}return function(){return a.apply(b,arguments)}},n=function(a,b){return function(c){var d=arguments.length;if(2>d||null===c)return c;for(var e=1;d>e;e++)for(var f=arguments[e],g=a(f),h=g.length,i=0;h>i;i++){var j=g[i];b&&void 0!==c[j]||(c[j]=f[j])}return c}},o=null;c=o=n(f);var p,q=function(a,b){var c=f(b),d=c.length;if(null===a)return!d;for(var e=Object(a),g=0;d>g;g++){var h=c[g];if(b[h]!==e[h]||!(h in e))return!1}return!0},r=null;p=r=function(a){return a=c({},a),function(b){return q(b,a)}};var s,t=function(a,b,c){return null===a?k:g(a)?m(a,b,c):h(a)?p(a):l(a)},u=null;s=u=function(a,b,c){b=t(b,c);for(var d=!j(a)&&f(a),e=(d||a).length,g=0;e>g;g++){var h=d?d[g]:g;if(!b(a[h],h,a))return!1}return!0};var v=function(b,c,f,g){return f||d.isDefined(b)&&d.isDefined(c)?d.isFunction(c)?!1:(g=d.defaultTo(c,"cb"),a.error(e+g+" is not a function"),!0):!0},w=function(a,b,c){if(!v(void 0,c,!0,"internalCb")&&!v(a,b))for(var d in a)a.hasOwnProperty(d)&&c(a[d],d)},x=function(a,b){w(a,b,function(a,c){b(a,c)})};return{each:x,forEach:x,every:s,all:u}}]),angular.module("leaflet-directive").factory("leafletLayerHelpers",["$rootScope","$log","$q","leafletHelpers","leafletIterators",function($rootScope,$log,$q,leafletHelpers,leafletIterators){function isValidLayerType(a){return isString(a.type)?-1===Object.keys(layerTypes).indexOf(a.type)?($log.error("[AngularJS - Leaflet] A layer must have a valid type: "+Object.keys(layerTypes)),!1):layerTypes[a.type].mustHaveUrl&&!isString(a.url)?($log.error("[AngularJS - Leaflet] A base layer must have an url"),!1):layerTypes[a.type].mustHaveData&&!isDefined(a.data)?($log.error('[AngularJS - Leaflet] The base layer must have a "data" array attribute'),!1):layerTypes[a.type].mustHaveLayer&&!isDefined(a.layer)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have an layer defined"),!1):layerTypes[a.type].mustHaveBounds&&!isDefined(a.bounds)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have bounds defined"),!1):layerTypes[a.type].mustHaveKey&&!isDefined(a.key)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have key defined"),!1):!0:($log.error("[AngularJS - Leaflet] A layer must have a valid type defined."),!1)}function createLayer(a){if(isValidLayerType(a)){if(!isString(a.name))return void $log.error("[AngularJS - Leaflet] A base layer must have a name");isObject(a.layerParams)||(a.layerParams={}),isObject(a.layerOptions)||(a.layerOptions={});for(var b in a.layerParams)a.layerOptions[b]=a.layerParams[b];var c={url:a.url,data:a.data,options:a.layerOptions,layer:a.layer,icon:a.icon,type:a.layerType,bounds:a.bounds,key:a.key,apiKey:a.apiKey,pluginOptions:a.pluginOptions,user:a.user};return layerTypes[a.type].createLayer(c)}}function safeAddLayer(a,b){b&&"function"==typeof b.addTo?b.addTo(a):a.addLayer(b)}function safeRemoveLayer(a,b,c){if(isDefined(c)&&isDefined(c.loadedDefer))if(angular.isFunction(c.loadedDefer)){var d=c.loadedDefer();$log.debug("Loaded Deferred",d);var e=d.length;if(e>0)for(var f=function(){e--,0===e&&a.removeLayer(b)},g=0;g'+b.error.message+"";else if("arcgis"===c)for(var e=0;e'+f.layerName+"";for(var g=0;g
'+h.label+"
"}}else"image"===c&&(a.innerHTML='')},b=function(b,c,d,e){return function(){var f=L.DomUtil.create("div",c);return L.Browser.touch?L.DomEvent.on(f,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(f),L.DomEvent.on(f,"mousewheel",L.DomEvent.stopPropagation)),a(f,b,d,e),f}},c=function(a,b){return function(){for(var c=L.DomUtil.create("div",b),d=0;d
'+a.labels[d]+"
";return L.Browser.touch?L.DomEvent.on(c,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(c),L.DomEvent.on(c,"mousewheel",L.DomEvent.stopPropagation)),c}};return{getOnAddLegend:b,getOnAddArrayLegend:c,updateLegend:a}}),angular.module("leaflet-directive").factory("leafletMapDefaults",["$q","leafletHelpers",function(a,b){function c(){return{keyboard:!0,dragging:!0,worldCopyJump:!1,doubleClickZoom:!0,scrollWheelZoom:!0,tap:!0,touchZoom:!0,zoomControl:!0,zoomsliderControl:!1,zoomControlPosition:"topleft",attributionControl:!0,controls:{layers:{visible:!0,position:"topright",collapsed:!0}},nominatim:{server:" http://nominatim.openstreetmap.org/search"},crs:L.CRS.EPSG3857,tileLayer:"//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",tileLayerOptions:{attribution:'© OpenStreetMap contributors'},path:{weight:10,opacity:1,color:"#0000ff"},center:{lat:0,lng:0,zoom:1}}}var d=b.isDefined,e=b.isObject,f=b.obtainEffectiveMapId,g={};return{reset:function(){g={}},getDefaults:function(a){var b=f(g,a);return g[b]},getMapCreationDefaults:function(a){var b=f(g,a),c=g[b],e={maxZoom:c.maxZoom,keyboard:c.keyboard,dragging:c.dragging,zoomControl:c.zoomControl,doubleClickZoom:c.doubleClickZoom,scrollWheelZoom:c.scrollWheelZoom,tap:c.tap,touchZoom:c.touchZoom,attributionControl:c.attributionControl,worldCopyJump:c.worldCopyJump,crs:c.crs};if(d(c.minZoom)&&(e.minZoom=c.minZoom),d(c.zoomAnimation)&&(e.zoomAnimation=c.zoomAnimation),d(c.fadeAnimation)&&(e.fadeAnimation=c.fadeAnimation),d(c.markerZoomAnimation)&&(e.markerZoomAnimation=c.markerZoomAnimation),c.map)for(var h in c.map)e[h]=c.map[h];return e},setDefaults:function(a,b){var h=c();d(a)&&(h.doubleClickZoom=d(a.doubleClickZoom)?a.doubleClickZoom:h.doubleClickZoom,h.scrollWheelZoom=d(a.scrollWheelZoom)?a.scrollWheelZoom:h.doubleClickZoom,h.tap=d(a.tap)?a.tap:h.tap,h.touchZoom=d(a.touchZoom)?a.touchZoom:h.doubleClickZoom,h.zoomControl=d(a.zoomControl)?a.zoomControl:h.zoomControl,h.zoomsliderControl=d(a.zoomsliderControl)?a.zoomsliderControl:h.zoomsliderControl,h.attributionControl=d(a.attributionControl)?a.attributionControl:h.attributionControl,h.tileLayer=d(a.tileLayer)?a.tileLayer:h.tileLayer,h.zoomControlPosition=d(a.zoomControlPosition)?a.zoomControlPosition:h.zoomControlPosition,h.keyboard=d(a.keyboard)?a.keyboard:h.keyboard,h.dragging=d(a.dragging)?a.dragging:h.dragging,d(a.controls)&&angular.extend(h.controls,a.controls),e(a.crs)?h.crs=a.crs:d(L.CRS[a.crs])&&(h.crs=L.CRS[a.crs]),d(a.center)&&angular.copy(a.center,h.center),d(a.tileLayerOptions)&&angular.copy(a.tileLayerOptions,h.tileLayerOptions),d(a.maxZoom)&&(h.maxZoom=a.maxZoom),d(a.minZoom)&&(h.minZoom=a.minZoom),d(a.zoomAnimation)&&(h.zoomAnimation=a.zoomAnimation),d(a.fadeAnimation)&&(h.fadeAnimation=a.fadeAnimation),d(a.markerZoomAnimation)&&(h.markerZoomAnimation=a.markerZoomAnimation),d(a.worldCopyJump)&&(h.worldCopyJump=a.worldCopyJump),d(a.map)&&(h.map=a.map),d(a.path)&&(h.path=a.path));var i=f(g,b);return g[i]=h,h}}}]),angular.module("leaflet-directive").service("leafletMarkersHelpers",["$rootScope","$timeout","leafletHelpers","$log","$compile","leafletGeoJsonHelpers",function(a,b,c,d,e,f){var g=c.isDefined,h=c.defaultTo,i=c.MarkerClusterPlugin,j=c.AwesomeMarkersPlugin,k=c.VectorMarkersPlugin,l=c.MakiMarkersPlugin,m=c.ExtraMarkersPlugin,n=c.DomMarkersPlugin,o=c.safeApply,p=c,q=c.isString,r=c.isNumber,s=c.isObject,t={},u=f,v=c.errorHeader,w=function(a){ -var b="";return["_icon","_latlng","_leaflet_id","_map","_shadow"].forEach(function(c){b+=c+": "+h(a[c],"undefined")+" \n"}),"[leafletMarker] : \n"+b},x=function(a,b){var c=b?console:d;c.debug(w(a))},y=function(b){if(g(b)&&g(b.type)&&"awesomeMarker"===b.type)return j.isLoaded()||d.error(v+" The AwesomeMarkers Plugin is not loaded."),new L.AwesomeMarkers.icon(b);if(g(b)&&g(b.type)&&"vectorMarker"===b.type)return k.isLoaded()||d.error(v+" The VectorMarkers Plugin is not loaded."),new L.VectorMarkers.icon(b);if(g(b)&&g(b.type)&&"makiMarker"===b.type)return l.isLoaded()||d.error(v+"The MakiMarkers Plugin is not loaded."),new L.MakiMarkers.icon(b);if(g(b)&&g(b.type)&&"extraMarker"===b.type)return m.isLoaded()||d.error(v+"The ExtraMarkers Plugin is not loaded."),new L.ExtraMarkers.icon(b);if(g(b)&&g(b.type)&&"div"===b.type)return new L.divIcon(b);if(g(b)&&g(b.type)&&"dom"===b.type){n.isLoaded()||d.error(v+"The DomMarkers Plugin is not loaded.");var c=angular.isFunction(b.getMarkerScope)?b.getMarkerScope():a,f=e(b.template)(c),h=angular.copy(b);return h.element=f[0],new L.DomMarkers.icon(h)}if(g(b)&&g(b.type)&&"icon"===b.type)return b.icon;var i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAGmklEQVRYw7VXeUyTZxjvNnfELFuyIzOabermMZEeQC/OclkO49CpOHXOLJl/CAURuYbQi3KLgEhbrhZ1aDwmaoGqKII6odATmH/scDFbdC7LvFqOCc+e95s2VG50X/LLm/f4/Z7neY/ne18aANCmAr5E/xZf1uDOkTcGcWR6hl9247tT5U7Y6SNvWsKT63P58qbfeLJG8M5qcgTknrvvrdDbsT7Ml+tv82X6vVxJE33aRmgSyYtcWVMqX97Yv2JvW39UhRE2HuyBL+t+gK1116ly06EeWFNlAmHxlQE0OMiV6mQCScusKRlhS3QLeVJdl1+23h5dY4FNB3thrbYboqptEFlphTC1hSpJnbRvxP4NWgsE5Jyz86QNNi/5qSUTGuFk1gu54tN9wuK2wc3o+Wc13RCmsoBwEqzGcZsxsvCSy/9wJKf7UWf1mEY8JWfewc67UUoDbDjQC+FqK4QqLVMGGR9d2wurKzqBk3nqIT/9zLxRRjgZ9bqQgub+DdoeCC03Q8j+0QhFhBHR/eP3U/zCln7Uu+hihJ1+bBNffLIvmkyP0gpBZWYXhKussK6mBz5HT6M1Nqpcp+mBCPXosYQfrekGvrjewd59/GvKCE7TbK/04/ZV5QZYVWmDwH1mF3xa2Q3ra3DBC5vBT1oP7PTj4C0+CcL8c7C2CtejqhuCnuIQHaKHzvcRfZpnylFfXsYJx3pNLwhKzRAwAhEqG0SpusBHfAKkxw3w4627MPhoCH798z7s0ZnBJ/MEJbZSbXPhER2ih7p2ok/zSj2cEJDd4CAe+5WYnBCgR2uruyEw6zRoW6/DWJ/OeAP8pd/BGtzOZKpG8oke0SX6GMmRk6GFlyAc59K32OTEinILRJRchah8HQwND8N435Z9Z0FY1EqtxUg+0SO6RJ/mmXz4VuS+DpxXC3gXmZwIL7dBSH4zKE50wESf8qwVgrP1EIlTO5JP9Igu0aexdh28F1lmAEGJGfh7jE6ElyM5Rw/FDcYJjWhbeiBYoYNIpc2FT/SILivp0F1ipDWk4BIEo2VuodEJUifhbiltnNBIXPUFCMpthtAyqws/BPlEF/VbaIxErdxPphsU7rcCp8DohC+GvBIPJS/tW2jtvTmmAeuNO8BNOYQeG8G/2OzCJ3q+soYB5i6NhMaKr17FSal7GIHheuV3uSCY8qYVuEm1cOzqdWr7ku/R0BDoTT+DT+ohCM6/CCvKLKO4RI+dXPeAuaMqksaKrZ7L3FE5FIFbkIceeOZ2OcHO6wIhTkNo0ffgjRGxEqogXHYUPHfWAC/lADpwGcLRY3aeK4/oRGCKYcZXPVoeX/kelVYY8dUGf8V5EBRbgJXT5QIPhP9ePJi428JKOiEYhYXFBqou2Guh+p/mEB1/RfMw6rY7cxcjTrneI1FrDyuzUSRm9miwEJx8E/gUmqlyvHGkneiwErR21F3tNOK5Tf0yXaT+O7DgCvALTUBXdM4YhC/IawPU+2PduqMvuaR6eoxSwUk75ggqsYJ7VicsnwGIkZBSXKOUww73WGXyqP+J2/b9c+gi1YAg/xpwck3gJuucNrh5JvDPvQr0WFXf0piyt8f8/WI0hV4pRxxkQZdJDfDJNOAmM0Ag8jyT6hz0WGXWuP94Yh2jcfjmXAGvHCMslRimDHYuHuDsy2QtHuIavznhbYURq5R57KpzBBRZKPJi8eQg48h4j8SDdowifdIrEVdU+gbO6QNvRRt4ZBthUaZhUnjlYObNagV3keoeru3rU7rcuceqU1mJBxy+BWZYlNEBH+0eH4vRiB+OYybU2hnblYlTvkHinM4m54YnxSyaZYSF6R3jwgP7udKLGIX6r/lbNa9N6y5MFynjWDtrHd75ZvTYAPO/6RgF0k76mQla3FGq7dO+cH8sKn0Vo7nDllwAhqwLPkxrHwWmHJOo+AKJ4rab5OgrM7rVu8eWb2Pu0Dh4eDgXoOfvp7Y7QeqknRmvcTBEyq9m/HQQSCSz6LHq3z0yzsNySRfMS253wl2KyRDbcZPcfJKjZmSEOjcxyi+Y8dUOtsIEH6R2wNykdqrkYJ0RV92H0W58pkfQk7cKevsLK10Py8SdMGfXNXATY+pPbyJR/ET6n9nIfztNtZYRV9XniQu9IA2vOVgy4ir7GCLVmmd+zjkH0eAF9Po6K61pmCXHxU5rHMYd1ftc3owjwRSVRzLjKvqZEty6cRUD7jGqiOdu5HG6MdHjNcNYGqfDm5YRzLBBCCDl/2bk8a8gdbqcfwECu62Fg/HrggAAAABJRU5ErkJggg==",o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=";return g(b)&&g(b.iconUrl)?new L.Icon(b):new L.Icon.Default({iconUrl:i,shadowUrl:o,iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]})},z=function(a){g(t[a])&&t.splice(a,1)},A=function(){t={}},B=function(a,b,c){if(a.closePopup(),g(c)&&g(c.overlays))for(var d in c.overlays)if((c.overlays[d]instanceof L.LayerGroup||c.overlays[d]instanceof L.FeatureGroup)&&c.overlays[d].hasLayer(a))return void c.overlays[d].removeLayer(a);if(g(t))for(var e in t)t[e].hasLayer(a)&&t[e].removeLayer(a);b.hasLayer(a)&&b.removeLayer(a)},C=function(a,b){var c=a._popup._container.offsetHeight,d=new L.Point(a._popup._containerLeft,-c-a._popup._containerBottom),e=b.layerPointToContainerPoint(d);null!==e&&a._popup._adjustPan()},D=function(a,b){e(a._popup._contentNode)(b)},E=function(a,c,d){var e=a._popup._contentNode.innerText||a._popup._contentNode.textContent;e.length<1&&b(function(){E(a,c,d)});var f=a._popup._contentNode.offsetWidth;return a._popup._updateLayout(),a._popup._updatePosition(),a._popup.options.autoPan&&C(a,d),f},F=function(b,c,e){var f=angular.isFunction(c.getMessageScope)?c.getMessageScope():a,h=g(c.compileMessage)?c.compileMessage:!0;if(h){if(!g(b._popup)||!g(b._popup._contentNode))return d.error(v+"Popup is invalid or does not have any content."),!1;D(b,f),E(b,c,e)}},G=function(b,c){var d=angular.isFunction(c.getMessageScope)?c.getMessageScope():a,f=angular.isFunction(c.getLabelScope)?c.getLabelScope():d,h=g(c.compileMessage)?c.compileMessage:!0;p.LabelPlugin.isLoaded()&&g(c.label)&&(g(c.label.options)&&c.label.options.noHide===!0&&b.showLabel(),h&&g(b.label)&&e(b.label._container)(f))},H=function(a,b,c,e,f,h,i){if(g(b)){if(!u.validateCoords(a))return d.warn("There are problems with lat-lng data, please verify your marker model"),void B(c,i,h);var j=a===b;if(g(a.iconAngle)&&b.iconAngle!==a.iconAngle&&c.setIconAngle(a.iconAngle),q(a.layer)||q(b.layer)&&(g(h.overlays[b.layer])&&h.overlays[b.layer].hasLayer(c)&&(h.overlays[b.layer].removeLayer(c),c.closePopup()),i.hasLayer(c)||i.addLayer(c)),(r(a.opacity)||r(parseFloat(a.opacity)))&&a.opacity!==b.opacity&&c.setOpacity(a.opacity),q(a.layer)&&b.layer!==a.layer){if(q(b.layer)&&g(h.overlays[b.layer])&&h.overlays[b.layer].hasLayer(c)&&h.overlays[b.layer].removeLayer(c),c.closePopup(),i.hasLayer(c)&&i.removeLayer(c),!g(h.overlays[a.layer]))return void d.error(v+"You must use a name of an existing layer");var k=h.overlays[a.layer];if(!(k instanceof L.LayerGroup||k instanceof L.FeatureGroup))return void d.error(v+'A marker can only be added to a layer of type "group" or "featureGroup"');k.addLayer(c),i.hasLayer(c)&&a.focus===!0&&c.openPopup()}if(a.draggable!==!0&&b.draggable===!0&&g(c.dragging)&&c.dragging.disable(),a.draggable===!0&&b.draggable!==!0&&(c.dragging?c.dragging.enable():L.Handler.MarkerDrag&&(c.dragging=new L.Handler.MarkerDrag(c),c.options.draggable=!0,c.dragging.enable())),s(a.icon)||s(b.icon)&&(c.setIcon(y()),c.closePopup(),c.unbindPopup(),q(a.message)&&c.bindPopup(a.message,a.popupOptions)),s(a.icon)&&s(b.icon)&&!angular.equals(a.icon,b.icon)){var l=!1;c.dragging&&(l=c.dragging.enabled()),c.setIcon(y(a.icon)),l&&c.dragging.enable(),c.closePopup(),c.unbindPopup(),q(a.message)&&(c.bindPopup(a.message,a.popupOptions),i.hasLayer(c)&&a.focus===!0&&c.openPopup())}!q(a.message)&&q(b.message)&&(c.closePopup(),c.unbindPopup()),p.LabelPlugin.isLoaded()&&(g(a.label)&&g(a.label.message)?"label"in b&&"message"in b.label&&!angular.equals(a.label.message,b.label.message)?c.updateLabelContent(a.label.message):!angular.isFunction(c.getLabel)||angular.isFunction(c.getLabel)&&!g(c.getLabel())?(c.bindLabel(a.label.message,a.label.options),G(c,a)):G(c,a):(!("label"in a)||"message"in a.label)&&angular.isFunction(c.unbindLabel)&&c.unbindLabel()),q(a.message)&&!q(b.message)&&c.bindPopup(a.message,a.popupOptions),q(a.message)&&q(b.message)&&a.message!==b.message&&c.setPopupContent(a.message);var m=!1;a.focus!==!0&&b.focus===!0&&(c.closePopup(),m=!0),(a.focus===!0&&(!g(b.focus)||b.focus===!1)||j&&a.focus===!0)&&(c.openPopup(),m=!0),b.zIndexOffset!==a.zIndexOffset&&c.setZIndexOffset(a.zIndexOffset);var n=c.getLatLng(),o=q(a.layer)&&p.MarkerClusterPlugin.is(h.overlays[a.layer]);o?m?(a.lat!==b.lat||a.lng!==b.lng)&&(h.overlays[a.layer].removeLayer(c),c.setLatLng([a.lat,a.lng]),h.overlays[a.layer].addLayer(c)):n.lat!==a.lat||n.lng!==a.lng?(h.overlays[a.layer].removeLayer(c),c.setLatLng([a.lat,a.lng]),h.overlays[a.layer].addLayer(c)):a.lat!==b.lat||a.lng!==b.lng?(h.overlays[a.layer].removeLayer(c),c.setLatLng([a.lat,a.lng]),h.overlays[a.layer].addLayer(c)):s(a.icon)&&s(b.icon)&&!angular.equals(a.icon,b.icon)&&(h.overlays[a.layer].removeLayer(c),h.overlays[a.layer].addLayer(c)):(n.lat!==a.lat||n.lng!==a.lng)&&c.setLatLng([a.lat,a.lng])}};return{resetMarkerGroup:z,resetMarkerGroups:A,deleteMarker:B,manageOpenPopup:F,manageOpenLabel:G,createMarker:function(a){if(!g(a)||!u.validateCoords(a))return void d.error(v+"The marker definition is not valid.");var b=u.getCoords(a);if(!g(b))return void d.error(v+"Unable to get coordinates from markerData.");var c={icon:y(a.icon),title:g(a.title)?a.title:"",draggable:g(a.draggable)?a.draggable:!1,clickable:g(a.clickable)?a.clickable:!0,riseOnHover:g(a.riseOnHover)?a.riseOnHover:!1,zIndexOffset:g(a.zIndexOffset)?a.zIndexOffset:0,iconAngle:g(a.iconAngle)?a.iconAngle:0};for(var e in a)a.hasOwnProperty(e)&&!c.hasOwnProperty(e)&&(c[e]=a[e]);var f=new L.marker(b,c);return q(a.message)||f.unbindPopup(),f},addMarkerToGroup:function(a,b,c,e){return q(b)?i.isLoaded()?(g(t[b])||(t[b]=new L.MarkerClusterGroup(c),e.addLayer(t[b])),void t[b].addLayer(a)):void d.error(v+"The MarkerCluster plugin is not loaded."):void d.error(v+"The marker group you have specified is invalid.")},listenMarkerEvents:function(a,b,c,d,e){a.on("popupopen",function(){o(c,function(){(g(a._popup)||g(a._popup._contentNode))&&(b.focus=!0,F(a,b,e))})}),a.on("popupclose",function(){o(c,function(){b.focus=!1})}),a.on("add",function(){o(c,function(){"label"in b&&G(a,b)})})},updateMarker:H,addMarkerWatcher:function(a,b,c,d,e,f){var i=p.getObjectArrayPath("markers."+b);f=h(f,!0);var j=c.$watch(i,function(f,h){return g(f)?void H(f,h,a,b,c,d,e):(B(a,e,d),void j())},f)},string:w,log:x}}]),angular.module("leaflet-directive").factory("leafletPathsHelpers",["$rootScope","$log","leafletHelpers",function(a,b,c){function d(a){return a.filter(function(a){return k(a)}).map(function(a){return e(a)})}function e(a){return i(a)?new L.LatLng(a[0],a[1]):new L.LatLng(a.lat,a.lng)}function f(a){return a.map(function(a){return d(a)})}function g(a,b){for(var c={},d=0;d0&&e(a[0].boundingbox)?i.resolve(a[0]):i.reject("[Nominatim] Invalid address")}),i.promise}}}]),angular.module("leaflet-directive").directive("bounds",["$log","$timeout","$http","leafletHelpers","nominatimService","leafletBoundsHelpers",function(a,b,c,d,e,f){return{restrict:"A",scope:!1,replace:!1,require:["leaflet"],link:function(c,g,h,i){var j=d.isDefined,k=f.createLeafletBounds,l=i[0].getLeafletScope(),m=i[0],n=d.errorHeader+" [Bounds] ",o=function(a){return 0===a._southWest.lat&&0===a._southWest.lng&&0===a._northEast.lat&&0===a._northEast.lng};m.getMap().then(function(d){l.$on("boundsChanged",function(a){var c=a.currentScope,e=d.getBounds();if(!o(e)&&!c.settingBoundsFromScope){c.settingBoundsFromLeaflet=!0;var f={northEast:{lat:e._northEast.lat,lng:e._northEast.lng},southWest:{lat:e._southWest.lat,lng:e._southWest.lng},options:e.options};angular.equals(c.bounds,f)||(c.bounds=f),b(function(){c.settingBoundsFromLeaflet=!1})}});var f;l.$watch("bounds",function(g){if(!c.settingBoundsFromLeaflet){if(j(g.address)&&g.address!==f)return c.settingBoundsFromScope=!0,e.query(g.address,h.id).then(function(a){var b=a.boundingbox,c=[[b[0],b[2]],[b[1],b[3]]];d.fitBounds(c)},function(b){a.error(n+" "+b+".")}),f=g.address,void b(function(){c.settingBoundsFromScope=!1});var i=k(g);i&&!d.getBounds().equals(i)&&(c.settingBoundsFromScope=!0,d.fitBounds(i,g.options),b(function(){c.settingBoundsFromScope=!1}))}},!0)})}}}]);var centerDirectiveTypes=["center","lfCenter"],centerDirectives={};centerDirectiveTypes.forEach(function(a){centerDirectives[a]=["$log","$q","$location","$timeout","leafletMapDefaults","leafletHelpers","leafletBoundsHelpers","leafletMapEvents",function(b,c,d,e,f,g,h,i){var j,k=g.isDefined,l=g.isNumber,m=g.isSameCenterOnMap,n=g.safeApply,o=g.isValidCenter,p=h.isValidBounds,q=g.isUndefinedOrEmpty,r=g.errorHeader,s=function(a,b){return k(a)&&p(a)&&q(b)};return{restrict:"A",scope:!1,replace:!1,require:"leaflet",controller:function(){j=c.defer(),this.getCenter=function(){return j.promise}},link:function(c,g,p,q){var t=q.getLeafletScope(),u=t[a];q.getMap().then(function(c){var g=f.getDefaults(p.id);if(-1!==p[a].search("-"))return b.error(r+' The "center" variable can\'t use a "-" on its key name: "'+p[a]+'".'),void c.setView([g.center.lat,g.center.lng],g.center.zoom);if(s(t.bounds,u))c.fitBounds(h.createLeafletBounds(t.bounds),t.bounds.options),u=c.getCenter(),n(t,function(b){angular.extend(b[a],{lat:c.getCenter().lat,lng:c.getCenter().lng,zoom:c.getZoom(),autoDiscover:!1})}),n(t,function(a){var b=c.getBounds();a.bounds={northEast:{lat:b._northEast.lat,lng:b._northEast.lng},southWest:{lat:b._southWest.lat,lng:b._southWest.lng}}});else{if(!k(u))return b.error(r+' The "center" property is not defined in the main scope'),void c.setView([g.center.lat,g.center.lng],g.center.zoom);k(u.lat)&&k(u.lng)||k(u.autoDiscover)||angular.copy(g.center,u)}var q,v;if("yes"===p.urlHashCenter){var w=function(){var a,b=d.search();if(k(b.c)){var c=b.c.split(":");3===c.length&&(a={lat:parseFloat(c[0]),lng:parseFloat(c[1]),zoom:parseInt(c[2],10)})}return a};q=w(),t.$on("$locationChangeSuccess",function(b){var d=b.currentScope,e=w();k(e)&&!m(e,c)&&angular.extend(d[a],{lat:e.lat,lng:e.lng,zoom:e.zoom})})}t.$watch(a,function(a){return t.settingCenterFromLeaflet?void 0:(k(q)&&(angular.copy(q,a),q=void 0),o(a)||a.autoDiscover===!0?a.autoDiscover===!0?(l(a.zoom)||c.setView([g.center.lat,g.center.lng],g.center.zoom),void(l(a.zoom)&&a.zoom>g.center.zoom?c.locate({setView:!0,maxZoom:a.zoom}):k(g.maxZoom)?c.locate({setView:!0,maxZoom:g.maxZoom}):c.locate({setView:!0}))):void(v&&m(a,c)||(t.settingCenterFromScope=!0,c.setView([a.lat,a.lng],a.zoom),i.notifyCenterChangedToBounds(t,c),e(function(){t.settingCenterFromScope=!1}))):void b.warn(r+" invalid 'center'"))},!0),c.whenReady(function(){v=!0}),c.on("moveend",function(){j.resolve(),i.notifyCenterUrlHashChanged(t,c,p,d.search()),m(u,c)||t.settingCenterFromScope||(t.settingCenterFromLeaflet=!0,n(t,function(b){t.settingCenterFromScope||angular.extend(b[a],{lat:c.getCenter().lat,lng:c.getCenter().lng,zoom:c.getZoom(),autoDiscover:!1}),i.notifyCenterChangedToBounds(t,c),e(function(){t.settingCenterFromLeaflet=!1})}))}),u.autoDiscover===!0&&c.on("locationerror",function(){b.warn(r+" The Geolocation API is unauthorized on this page."),o(u)?(c.setView([u.lat,u.lng],u.zoom),i.notifyCenterChangedToBounds(t,c)):(c.setView([g.center.lat,g.center.lng],g.center.zoom),i.notifyCenterChangedToBounds(t,c))})})}}}]}),centerDirectiveTypes.forEach(function(a){angular.module("leaflet-directive").directive(a,centerDirectives[a])}),angular.module("leaflet-directive").directive("controls",["$log","leafletHelpers","leafletControlHelpers",function(a,b,c){return{restrict:"A",scope:!1,replace:!1,require:"?^leaflet",link:function(d,e,f,g){if(g){var h=c.createControl,i=c.isValidControlType,j=g.getLeafletScope(),k=b.isDefined,l=b.isArray,m={},n=b.errorHeader+" [Controls] ";g.getMap().then(function(b){j.$watchCollection("controls",function(c){for(var d in m)k(c[d])||(b.hasControl(m[d])&&b.removeControl(m[d]),delete m[d]);for(var e in c){var f,g=k(c[e].type)?c[e].type:e;if(!i(g))return void a.error(n+" Invalid control type: "+g+".");if("custom"!==g)f=h(g,c[e]),b.addControl(f),m[e]=f;else{var j=c[e];if(l(j))for(var o in j){var p=j[o];b.addControl(p),m[e]=k(m[e])?m[e].concat([p]):[p]}else b.addControl(j),m[e]=j}}})})}}}}]),angular.module("leaflet-directive").directive("decorations",["$log","leafletHelpers",function(a,b){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(c,d,e,f){function g(b){return k(b)&&k(b.coordinates)&&(j.isLoaded()||a.error("[AngularJS - Leaflet] The PolylineDecorator Plugin is not loaded.")),L.polylineDecorator(b.coordinates)}function h(a,b){return k(a)&&k(b)&&k(b.coordinates)&&k(b.patterns)?(a.setPaths(b.coordinates),a.setPatterns(b.patterns),a):void 0}var i=f.getLeafletScope(),j=b.PolylineDecoratorPlugin,k=b.isDefined,l={};f.getMap().then(function(a){i.$watch("decorations",function(b){for(var c in l)k(b[c])&&angular.equals(b[c],l)||(a.removeLayer(l[c]),delete l[c]);for(var d in b){var e=b[d],f=g(e);k(f)&&(l[d]=f,a.addLayer(f),h(f,e))}},!0)})}}}]),angular.module("leaflet-directive").directive("eventBroadcast",["$log","$rootScope","leafletHelpers","leafletMapEvents","leafletIterators",function(a,b,c,d,e){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(b,f,g,h){var i=c.isObject,j=c.isDefined,k=h.getLeafletScope(),l=k.eventBroadcast,m=d.getAvailableMapEvents(),n=d.addEvents;h.getMap().then(function(b){var c=[],d="broadcast";j(l.map)?i(l.map)?("emit"!==l.map.logic&&"broadcast"!==l.map.logic?a.warn("[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'."):d=l.map.logic,i(l.map.enable)&&l.map.enable.length>=0?e.each(l.map.enable,function(a){-1===c.indexOf(a)&&-1!==m.indexOf(a)&&c.push(a)}):a.warn("[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.")):a.warn("[AngularJS - Leaflet] event-broadcast.map must be an object check your model."):c=m,n(b,c,"eventName",k,d)})}}}]),angular.module("leaflet-directive").directive("geojson",["$log","$rootScope","leafletData","leafletHelpers","leafletWatchHelpers","leafletDirectiveControlsHelpers","leafletIterators","leafletGeoJsonEvents",function(a,b,c,d,e,f,g,h){var i=e.maybeWatch,j=d.watchOptions,k=f.extend,l=d,m=g;return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(a,b,e,f){var g=d.isDefined,n=f.getLeafletScope(),o={},p=!1;f.getMap().then(function(a){var b=n.geojsonWatchOptions||j,f=function(a,b){var c;return c=angular.isFunction(a.onEachFeature)?a.onEachFeature:function(c,f){d.LabelPlugin.isLoaded()&&g(c.properties.description)&&f.bindLabel(c.properties.description),h.bindEvents(e.id,f,null,c,n,b,{resetStyleOnMouseout:a.resetStyleOnMouseout,mapId:e.id})}},q=l.isDefined(e.geojsonNested)&&l.isTruthy(e.geojsonNested),r=function(){if(o){var b=function(b){g(b)&&a.hasLayer(b)&&a.removeLayer(b)};return q?void m.each(o,function(a){b(a)}):void b(o)}},s=function(b,d){var h=angular.copy(b);if(g(h)&&g(h.data)){var i=f(h,d);g(h.options)||(h.options={style:h.style,filter:h.filter,onEachFeature:i,pointToLayer:h.pointToLayer});var j=L.geoJson(h.data,h.options);d&&l.isString(d)?o[d]=j:o=j,j.addTo(a),p||(p=!0,c.setGeoJSON(o,e.id))}},t=function(a){if(r(),q){if(!a||!Object.keys(a).length)return;return void m.each(a,function(a,b){s(a,b)})}s(a)};k(e.id,"geojson",t,r),i(n,"geojson",b,function(a){t(a)})})}}}]),angular.module("leaflet-directive").directive("layercontrol",["$filter","$log","leafletData","leafletHelpers",function(a,b,c,d){return{restrict:"E",scope:{icons:"=?",autoHideOpacity:"=?",showGroups:"=?",title:"@",baseTitle:"@",overlaysTitle:"@"},replace:!0,transclude:!1,require:"^leaflet",controller:["$scope","$element","$sce",function(a,e,f){b.debug("[Angular Directive - Layers] layers",a,e);var g=d.safeApply,h=d.isDefined;angular.extend(a,{baselayer:"",oldGroup:"",layerProperties:{},groupProperties:{},rangeIsSupported:d.rangeIsSupported(),changeBaseLayer:function(b,e){d.safeApply(a,function(d){d.baselayer=b,c.getMap().then(function(e){c.getLayers().then(function(c){if(!e.hasLayer(c.baselayers[b])){for(var f in d.layers.baselayers)d.layers.baselayers[f].icon=d.icons.unradio,e.hasLayer(c.baselayers[f])&&e.removeLayer(c.baselayers[f]);e.addLayer(c.baselayers[b]),d.layers.baselayers[b].icon=a.icons.radio}})})}),e.preventDefault()},moveLayer:function(b,c,d){var e=Object.keys(a.layers.baselayers).length;if(c>=1+e&&c<=a.overlaysArray.length+e){var f;for(var h in a.layers.overlays)if(a.layers.overlays[h].index===c){f=a.layers.overlays[h];break}f&&g(a,function(){f.index=b.index,b.index=c})}d.stopPropagation(),d.preventDefault()},initIndex:function(b,c){var d=Object.keys(a.layers.baselayers).length;b.index=h(b.index)?b.index:c+d+1},initGroup:function(b){a.groupProperties[b]=a.groupProperties[b]?a.groupProperties[b]:{}},toggleOpacity:function(b,c){if(c.visible){if(a.autoHideOpacity&&!a.layerProperties[c.name].opacityControl)for(var d in a.layerProperties)a.layerProperties[d].opacityControl=!1;a.layerProperties[c.name].opacityControl=!a.layerProperties[c.name].opacityControl}b.stopPropagation(),b.preventDefault()},toggleLegend:function(b){a.layerProperties[b.name].showLegend=!a.layerProperties[b.name].showLegend},showLegend:function(b){return b.legend&&a.layerProperties[b.name].showLegend},unsafeHTML:function(a){return f.trustAsHtml(a)},getOpacityIcon:function(b){return b.visible&&a.layerProperties[b.name].opacityControl?a.icons.close:a.icons.open},getGroupIcon:function(b){return b.visible?a.icons.check:a.icons.uncheck},changeOpacity:function(b){var d=a.layerProperties[b.name].opacity;c.getMap().then(function(e){c.getLayers().then(function(c){var f;for(var g in a.layers.overlays)if(a.layers.overlays[g]===b){f=c.overlays[g];break}e.hasLayer(f)&&(f.setOpacity&&f.setOpacity(d/100),f.getLayers&&f.eachLayer&&f.eachLayer(function(a){a.setOpacity&&a.setOpacity(d/100)}))})})},changeGroupVisibility:function(b){if(h(a.groupProperties[b])){var c=a.groupProperties[b].visible;for(var d in a.layers.overlays){var e=a.layers.overlays[d];e.group===b&&(e.visible=c)}}}});var i=e.get(0);L.Browser.touch?L.DomEvent.on(i,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(i),L.DomEvent.on(i,"mousewheel",L.DomEvent.stopPropagation))}],template:'

{{ title }}

{{ baseTitle }}
{{ overlaysTitle }}
Range is not supported in this browser
',link:function(a,b,e,f){var g=d.isDefined,h=f.getLeafletScope(),i=h.layers;a.$watch("icons",function(){var b={uncheck:"fa fa-square-o",check:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",unradio:"fa fa-circle-o",up:"fa fa-angle-up",down:"fa fa-angle-down",open:"fa fa-angle-double-down",close:"fa fa-angle-double-up",toggleLegend:"fa fa-pencil-square-o"};g(a.icons)?(angular.extend(b,a.icons),angular.extend(a.icons,b)):a.icons=b}),e.order=!g(e.order)||"normal"!==e.order&&"reverse"!==e.order?"normal":e.order,a.order="normal"===e.order,a.orderNumber="normal"===e.order?-1:1,a.layers=i,f.getMap().then(function(b){h.$watch("layers.baselayers",function(d){var e={};c.getLayers().then(function(c){var f;for(f in d){var g=d[f];g.icon=a.icons[b.hasLayer(c.baselayers[f])?"radio":"unradio"],e[f]=g}a.baselayersArray=e})}),h.$watch("layers.overlays",function(b){var d=[],e={};c.getLayers().then(function(c){var f;for(f in b){var h=b[f];h.icon=a.icons[h.visible?"check":"uncheck"],d.push(h),g(a.layerProperties[h.name])||(a.layerProperties[h.name]={opacity:g(h.layerOptions.opacity)?100*h.layerOptions.opacity:100,opacityControl:!1,showLegend:!0}),g(h.group)&&(g(a.groupProperties[h.group])||(a.groupProperties[h.group]={visible:!1}),e[h.group]=g(e[h.group])?e[h.group]:{count:0,visibles:0},e[h.group].count++,h.visible&&e[h.group].visibles++),g(h.index)&&c.overlays[f].setZIndex&&c.overlays[f].setZIndex(b[f].index)}for(f in e)a.groupProperties[f].visible=e[f].visibles===e[f].count;a.overlaysArray=d})},!0)})}}}]),angular.module("leaflet-directive").directive("layers",["$log","$q","leafletData","leafletHelpers","leafletLayerHelpers","leafletControlHelpers",function(a,b,c,d,e,f){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",controller:["$scope",function(a){a._leafletLayers=b.defer(),this.getLayers=function(){return a._leafletLayers.promise}}],link:function(a,b,g,h){var i=d.isDefined,j={},k=h.getLeafletScope(),l=k.layers,m=e.createLayer,n=e.safeAddLayer,o=e.safeRemoveLayer,p=f.updateLayersControl,q=!1;h.getMap().then(function(b){a._leafletLayers.resolve(j),c.setLayers(j,g.id),j.baselayers={},j.overlays={};var d=g.id,e=!1;for(var f in l.baselayers){var h=m(l.baselayers[f]);i(h)?(j.baselayers[f]=h,l.baselayers[f].top===!0&&(n(b,j.baselayers[f]),e=!0)):delete l.baselayers[f]}!e&&Object.keys(j.baselayers).length>0&&n(b,j.baselayers[Object.keys(l.baselayers)[0]]);for(f in l.overlays){var r=m(l.overlays[f]);i(r)?(j.overlays[f]=r,l.overlays[f].visible===!0&&n(b,j.overlays[f])):delete l.overlays[f]}k.$watch("layers.baselayers",function(a,c){if(angular.equals(a,c))return q=p(b,d,q,a,l.overlays,j),!0;for(var e in j.baselayers)(!i(a[e])||a[e].doRefresh)&&(b.hasLayer(j.baselayers[e])&&b.removeLayer(j.baselayers[e]),delete j.baselayers[e],a[e]&&a[e].doRefresh&&(a[e].doRefresh=!1));for(var f in a)if(i(j.baselayers[f]))a[f].top!==!0||b.hasLayer(j.baselayers[f])?a[f].top===!1&&b.hasLayer(j.baselayers[f])&&b.removeLayer(j.baselayers[f]):n(b,j.baselayers[f]);else{var g=m(a[f]);i(g)&&(j.baselayers[f]=g,a[f].top===!0&&n(b,j.baselayers[f]))}var h=!1;for(var k in j.baselayers)if(b.hasLayer(j.baselayers[k])){h=!0;break}!h&&Object.keys(j.baselayers).length>0&&n(b,j.baselayers[Object.keys(j.baselayers)[0]]),q=p(b,d,q,a,l.overlays,j)},!0),k.$watch("layers.overlays",function(a,c){if(angular.equals(a,c))return q=p(b,d,q,l.baselayers,a,j),!0;for(var e in j.overlays)if(!i(a[e])||a[e].doRefresh){if(b.hasLayer(j.overlays[e])){var f=i(a[e])?a[e].layerOptions:null;o(b,j.overlays[e],f)}delete j.overlays[e],a[e]&&a[e].doRefresh&&(a[e].doRefresh=!1)}for(var g in a){if(i(j.overlays[g]))a[g].visible&&!b.hasLayer(j.overlays[g])?n(b,j.overlays[g]):a[g].visible===!1&&b.hasLayer(j.overlays[g])&&o(b,j.overlays[g],a[g].layerOptions);else{ -var h=m(a[g]);if(!i(h))continue;j.overlays[g]=h,a[g].visible===!0&&n(b,j.overlays[g])}a[g].visible&&b._loaded&&a[g].data&&"heatmap"===a[g].type&&(j.overlays[g].setData(a[g].data),j.overlays[g].update())}q=p(b,d,q,l.baselayers,a,j)},!0)})}}}]),angular.module("leaflet-directive").directive("legend",["$log","$http","leafletHelpers","leafletLegendHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i,j,k,l,m=c.isArray,n=c.isDefined,o=c.isFunction,p=h.getLeafletScope(),q=p.legend;p.$watch("legend",function(a){n(a)&&(i=a.legendClass?a.legendClass:"legend",j=a.position||"bottomright",l=a.type||"arcgis")},!0),h.getMap().then(function(c){p.$watch("legend",function(b){return n(b)?n(b.url)||"arcgis"!==l||m(b.colors)&&m(b.labels)&&b.colors.length===b.labels.length?n(b.url)?void a.info("[AngularJS - Leaflet] loading legend service."):(n(k)&&(k.removeFrom(c),k=null),k=L.control({position:j}),"arcgis"===l&&(k.onAdd=d.getOnAddArrayLegend(b,i)),void k.addTo(c)):void a.warn("[AngularJS - Leaflet] legend.colors and legend.labels must be set."):void(n(k)&&(k.removeFrom(c),k=null))}),p.$watch("legend.url",function(e){n(e)&&b.get(e).success(function(a){n(k)?d.updateLegend(k.getContainer(),a,l,e):(k=L.control({position:j}),k.onAdd=d.getOnAddLegend(a,i,l,e),k.addTo(c)),n(q.loadedData)&&o(q.loadedData)&&q.loadedData()}).error(function(){a.warn("[AngularJS - Leaflet] legend.url not loaded.")})})})}}}]),angular.module("leaflet-directive").directive("markers",["$log","$rootScope","$q","leafletData","leafletHelpers","leafletMapDefaults","leafletMarkersHelpers","leafletMarkerEvents","leafletIterators","leafletWatchHelpers","leafletDirectiveControlsHelpers",function(a,b,c,d,e,f,g,h,i,j,k){var l=e.isDefined,m=e.errorHeader,n=e,o=e.isString,p=g.addMarkerWatcher,q=g.updateMarker,r=g.listenMarkerEvents,s=g.addMarkerToGroup,t=g.createMarker,u=g.deleteMarker,v=i,w=e.watchOptions,x=j.maybeWatch,y=k.extend,z=function(a,b,c){if(Object.keys(a).length){if(c&&o(c)){if(!a[c]||!Object.keys(a[c]).length)return;return a[c][b]}return a[b]}},A=function(a,b,c,d){return d&&o(d)?(l(b[d])||(b[d]={}),b[d][c]=a):b[c]=a,a},B=function(b,c,d,e,f,g){if(!o(b))return a.error(m+" A layername must be a string"),!1;if(!l(c))return a.error(m+" You must add layers to the directive if the markers are going to use this functionality."),!1;if(!l(c.overlays)||!l(c.overlays[b]))return a.error(m+' A marker can only be added to a layer of type "group"'),!1;var h=c.overlays[b];return h instanceof L.LayerGroup||h instanceof L.FeatureGroup?(h.addLayer(e),!f&&g.hasLayer(e)&&d.focus===!0&&e.openPopup(),!0):(a.error(m+' Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"'),!1)},C=function(b,c,d,e,f,g,i,j,k,o){for(var u in c)if(!o[u])if(-1===u.search("-")){var v=n.copy(c[u]),w=n.getObjectDotPath(k?[k,u]:[u]),x=z(g,u,k);if(l(x)){var y=l(y)?d[u]:void 0;q(v,y,x,w,i,f,e)}else{var C=t(v),D=(v?v.layer:void 0)||k;if(!l(C)){a.error(m+" Received invalid data on the marker "+u+".");continue}if(A(C,g,u,k),l(v.message)&&C.bindPopup(v.message,v.popupOptions),l(v.group)){var E=l(v.groupOption)?v.groupOption:null;s(C,v.group,E,e)}if(n.LabelPlugin.isLoaded()&&l(v.label)&&l(v.label.message)&&C.bindLabel(v.label.message,v.label.options),l(v)&&(l(v.layer)||l(k))){var F=B(D,f,v,C,j.individual.doWatch,e);if(!F)continue}else l(v.group)||(e.addLayer(C),j.individual.doWatch||v.focus!==!0||C.openPopup());j.individual.doWatch&&p(C,w,i,f,e,j.individual.isDeep),r(C,v,i,j.individual.doWatch,e),h.bindEvents(b,C,w,v,i,D)}}else a.error('The marker can\'t use a "-" on his key name: "'+u+'".')},D=function(b,c,d,e,f){var g,h,i=!1,j=!1,k=l(c);for(var o in d)i||(a.debug(m+"[markers] destroy: "),i=!0),k&&(h=b[o],g=c[o],j=angular.equals(h,g)&&e),l(b)&&Object.keys(b).length&&l(b[o])&&Object.keys(b[o]).length&&!j||f&&n.isFunction(f)&&f(h,g,o)},E=function(b,c,d,e,f){D(b,c,d,!1,function(b,c,g){a.debug(m+"[marker] is deleting marker: "+g),u(d[g],e,f),delete d[g]})},F=function(b,c,d){var e={};return D(b,c,d,!0,function(b,c,d){a.debug(m+"[marker] is already rendered, marker: "+d),e[d]=b}),e};return{restrict:"A",scope:!1,replace:!1,require:["leaflet","?layers"],link:function(a,b,e,f){var g=f[0],h=g.getLeafletScope();g.getMap().then(function(a){var b,g={};b=l(f[1])?f[1].getLayers:function(){var a=c.defer();return a.resolve(),a.promise};var i=h.markersWatchOptions||w;l(e.watchMarkers)&&(i.doWatch=i.individual.doWatch=!l(e.watchMarkers)||n.isTruthy(e.watchMarkers));var j=l(e.markersNested)&&n.isTruthy(e.markersNested);b().then(function(b){var c=function(c,d){return j?void v.each(c,function(c,e){var f=l(f)?d[e]:void 0;E(c,f,g[e],a,b)}):void E(c,d,g,a,b)},f=function(d,f){c(d,f);var k=null;return j?void v.each(d,function(c,j){var m=l(m)?f[j]:void 0;k=F(d[j],m,g[j]),C(e.id,c,f,a,b,g,h,i,j,k)}):(k=F(d,f,g),void C(e.id,d,f,a,b,g,h,i,void 0,k))};y(e.id,"markers",f,c),d.setMarkers(g,e.id),x(h,"markers",i,function(a,b){f(a,b)})})})}}}]),angular.module("leaflet-directive").directive("maxbounds",["$log","leafletMapDefaults","leafletBoundsHelpers","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(a,b,e,f){var g=f.getLeafletScope(),h=c.isValidBounds,i=d.isNumber;f.getMap().then(function(a){g.$watch("maxbounds",function(b){if(!h(b))return void a.setMaxBounds();var d=c.createLeafletBounds(b);i(b.pad)&&(d=d.pad(b.pad)),a.setMaxBounds(d),e.center||e.lfCenter||a.fitBounds(d)})})}}}]),angular.module("leaflet-directive").directive("paths",["$log","$q","leafletData","leafletMapDefaults","leafletHelpers","leafletPathsHelpers","leafletPathEvents",function(a,b,c,d,e,f,g){return{restrict:"A",scope:!1,replace:!1,require:["leaflet","?layers"],link:function(h,i,j,k){var l=k[0],m=e.isDefined,n=e.isString,o=l.getLeafletScope(),p=o.paths,q=f.createPath,r=g.bindPathEvents,s=f.setPathOptions;l.getMap().then(function(f){var g,h=d.getDefaults(j.id);g=m(k[1])?k[1].getLayers:function(){var a=b.defer();return a.resolve(),a.promise},m(p)&&g().then(function(b){var d={};c.setPaths(d,j.id);var g=!m(j.watchPaths)||"true"===j.watchPaths,i=function(a,c){var d=o.$watch('paths["'+c+'"]',function(c,e){if(!m(c)){if(m(e.layer))for(var g in b.overlays){var h=b.overlays[g];h.removeLayer(a)}return f.removeLayer(a),void d()}s(a,c.type,c)},!0)};o.$watchCollection("paths",function(c){for(var k in d)m(c[k])||(f.removeLayer(d[k]),delete d[k]);for(var l in c)if(0!==l.search("\\$"))if(-1===l.search("-")){if(!m(d[l])){var p=c[l],t=q(l,c[l],h);if(m(t)&&m(p.message)&&t.bindPopup(p.message,p.popupOptions),e.LabelPlugin.isLoaded()&&m(p.label)&&m(p.label.message)&&t.bindLabel(p.label.message,p.label.options),m(p)&&m(p.layer)){if(!n(p.layer)){a.error("[AngularJS - Leaflet] A layername must be a string");continue}if(!m(b)){a.error("[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.");continue}if(!m(b.overlays)||!m(b.overlays[p.layer])){a.error('[AngularJS - Leaflet] A path can only be added to a layer of type "group"');continue}var u=b.overlays[p.layer];if(!(u instanceof L.LayerGroup||u instanceof L.FeatureGroup)){a.error('[AngularJS - Leaflet] Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"');continue}d[l]=t,u.addLayer(t),g?i(t,l):s(t,p.type,p)}else m(t)&&(d[l]=t,f.addLayer(t),g?i(t,l):s(t,p.type,p));r(j.id,t,l,p,o)}}else a.error('[AngularJS - Leaflet] The path name "'+l+'" is not valid. It must not include "-" and a number.')})})})}}}]),angular.module("leaflet-directive").directive("tiles",["$log","leafletData","leafletMapDefaults","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i=d.isDefined,j=h.getLeafletScope(),k=j.tiles;return i(k)&&i(k.url)?void h.getMap().then(function(a){var d,e=c.getDefaults(g.id);j.$watch("tiles",function(c,f){var h=e.tileLayerOptions,j=e.tileLayer;return!i(c.url)&&i(d)?void a.removeLayer(d):i(d)?!i(c.url)||!i(c.options)||c.type===f.type&&angular.equals(c.options,h)?void(i(c.url)&&d.setUrl(c.url)):(a.removeLayer(d),h=e.tileLayerOptions,angular.copy(c.options,h),j=c.url,d="wms"===c.type?L.tileLayer.wms(j,h):L.tileLayer(j,h),d.addTo(a),void b.setTiles(d,g.id)):(i(c.options)&&angular.copy(c.options,h),i(c.url)&&(j=c.url),d="wms"===c.type?L.tileLayer.wms(j,h):L.tileLayer(j,h),d.addTo(a),void b.setTiles(d,g.id))},!0)}):void a.warn("[AngularJS - Leaflet] The 'tiles' definition doesn't have the 'url' property.")}}}]),["markers","geojson"].forEach(function(a){angular.module("leaflet-directive").directive(a+"WatchOptions",["$log","$rootScope","$q","leafletData","leafletHelpers",function(b,c,d,e,f){var g=f.isDefined,h=f.errorHeader,i=f.isObject,j=f.watchOptions;return{restrict:"A",scope:!1,replace:!1,require:["leaflet"],link:function(c,d,e,f){var k=f[0],l=k.getLeafletScope();k.getMap().then(function(){g(c[a+"WatchOptions"])&&(i(c[a+"WatchOptions"])?angular.extend(j,c[a+"WatchOptions"]):b.error(h+"["+a+"WatchOptions] is not an object"),l[a+"WatchOptions"]=j)})}}}])}),angular.module("leaflet-directive").factory("LeafletEventsHelpersFactory",["$rootScope","$q","$log","leafletHelpers",function(a,b,c,d){var e=d.safeApply,f=d.isDefined,g=d.isObject,h=d.isArray,i=d.errorHeader,j=function(a,b){this.rootBroadcastName=a,c.debug("LeafletEventsHelpersFactory: lObjectType: "+b+"rootBroadcastName: "+a),this.lObjectType=b};return j.prototype.getAvailableEvents=function(){return[]},j.prototype.genDispatchEvent=function(a,b,d,e,f,g,h,i,j){var k=this;return a=a||"",a&&(a="."+a),function(l){var m=k.rootBroadcastName+a+"."+b;c.debug(m),k.fire(e,m,d,l,l.target||f,h,g,i,j)}},j.prototype.fire=function(b,c,d,g,h,i,j,k){e(b,function(){var e={leafletEvent:g,leafletObject:h,modelName:j,model:i};f(k)&&angular.extend(e,{layerName:k}),"emit"===d?b.$emit(c,e):a.$broadcast(c,e)})},j.prototype.bindEvents=function(a,b,d,e,j,k,l){var m=[],n="emit",o=this;if(f(j.eventBroadcast))if(g(j.eventBroadcast))if(f(j.eventBroadcast[o.lObjectType]))if(g(j.eventBroadcast[o.lObjectType])){f(j.eventBroadcast[this.lObjectType].logic)&&"emit"!==j.eventBroadcast[o.lObjectType].logic&&"broadcast"!==j.eventBroadcast[o.lObjectType].logic&&c.warn(i+"Available event propagation logic are: 'emit' or 'broadcast'.");var p=!1,q=!1;f(j.eventBroadcast[o.lObjectType].enable)&&h(j.eventBroadcast[o.lObjectType].enable)&&(p=!0),f(j.eventBroadcast[o.lObjectType].disable)&&h(j.eventBroadcast[o.lObjectType].disable)&&(q=!0),p&&q?c.warn(i+"can not enable and disable events at the same time"):p||q?p?j.eventBroadcast[this.lObjectType].enable.forEach(function(a){-1!==m.indexOf(a)?c.warn(i+"This event "+a+" is already enabled"):-1===o.getAvailableEvents().indexOf(a)?c.warn(i+"This event "+a+" does not exist"):m.push(a)}):(m=this.getAvailableEvents(),j.eventBroadcast[o.lObjectType].disable.forEach(function(a){var b=m.indexOf(a);-1===b?c.warn(i+"This event "+a+" does not exist or has been already disabled"):m.splice(b,1)})):c.warn(i+"must enable or disable events")}else c.warn(i+"event-broadcast."+[o.lObjectType]+" must be an object check your model.");else m=this.getAvailableEvents();else c.error(i+"event-broadcast must be an object check your model.");else m=this.getAvailableEvents();return m.forEach(function(c){b.on(c,o.genDispatchEvent(a,c,n,j,b,d,e,k,l))}),n},j}]).service("leafletEventsHelpers",["LeafletEventsHelpersFactory",function(a){return new a}]),angular.module("leaflet-directive").factory("leafletGeoJsonEvents",["$rootScope","$q","$log","leafletHelpers","LeafletEventsHelpersFactory","leafletData",function(a,b,c,d,e,f){var g=d.safeApply,h=e,i=function(){h.call(this,"leafletDirectiveGeoJson","geojson")};return i.prototype=new h,i.prototype.genDispatchEvent=function(b,c,d,e,i,j,k,l,m){var n=h.prototype.genDispatchEvent.call(this,b,c,d,e,i,j,k,l),o=this;return function(b){"mouseout"===c&&(m.resetStyleOnMouseout&&f.getGeoJSON(m.mapId).then(function(a){var c=l?a[l]:a;c.resetStyle(b.target)}),g(e,function(){a.$broadcast(o.rootBroadcastName+".mouseout",b)})),n(b)}},i.prototype.getAvailableEvents=function(){return["click","dblclick","mouseover","mouseout"]},new i}]),angular.module("leaflet-directive").factory("leafletLabelEvents",["$rootScope","$q","$log","leafletHelpers","LeafletEventsHelpersFactory",function(a,b,c,d,e){var f=d,g=e,h=function(){g.call(this,"leafletDirectiveLabel","markers")};return h.prototype=new g,h.prototype.genDispatchEvent=function(a,b,c,d,e,f,h,i){var j=f.replace("markers.","");return g.prototype.genDispatchEvent.call(this,a,b,c,d,e,j,h,i)},h.prototype.getAvailableEvents=function(){return["click","dblclick","mousedown","mouseover","mouseout","contextmenu"]},h.prototype.genEvents=function(a,b,c,d,e,g,h,i){var j=this,k=this.getAvailableEvents(),l=f.getObjectArrayPath("markers."+g);k.forEach(function(b){e.label.on(b,j.genDispatchEvent(a,b,c,d,e.label,l,h,i))})},h.prototype.bindEvents=function(){},new h}]),angular.module("leaflet-directive").factory("leafletMapEvents",["$rootScope","$q","$log","leafletHelpers","leafletEventsHelpers","leafletIterators",function(a,b,c,d,e,f){var g=d.isDefined,h=e.fire,i=function(){return["click","dblclick","mousedown","mouseup","mouseover","mouseout","mousemove","contextmenu","focus","blur","preclick","load","unload","viewreset","movestart","move","moveend","dragstart","drag","dragend","zoomstart","zoomanim","zoomend","zoomlevelschange","resize","autopanstart","layeradd","layerremove","baselayerchange","overlayadd","overlayremove","locationfound","locationerror","popupopen","popupclose","draw:created","draw:edited","draw:deleted","draw:drawstart","draw:drawstop","draw:editstart","draw:editstop","draw:deletestart","draw:deletestop"]},j=function(a,b,d,e){return e&&(e+="."),function(f){var g="leafletDirectiveMap."+e+b;c.debug(g),h(a,g,d,f,f.target,a)}},k=function(a){a.$broadcast("boundsChanged")},l=function(a,b,c,d){if(g(c.urlHashCenter)){var e=b.getCenter(),f=e.lat.toFixed(4)+":"+e.lng.toFixed(4)+":"+b.getZoom();g(d.c)&&d.c===f||a.$emit("centerUrlHash",f)}},m=function(a,b,c,d,e){f.each(b,function(b){var f={};f[c]=b,a.on(b,j(d,b,e,a._container.id||""),f)})};return{getAvailableMapEvents:i,genDispatchMapEvent:j,notifyCenterChangedToBounds:k,notifyCenterUrlHashChanged:l,addEvents:m}}]),angular.module("leaflet-directive").factory("leafletMarkerEvents",["$rootScope","$q","$log","leafletHelpers","LeafletEventsHelpersFactory","leafletLabelEvents",function(a,b,c,d,e,f){var g=d.safeApply,h=d.isDefined,i=d,j=f,k=e,l=function(){k.call(this,"leafletDirectiveMarker","markers")};return l.prototype=new k,l.prototype.genDispatchEvent=function(b,c,d,e,f,h,i,j){var l=k.prototype.genDispatchEvent.call(this,b,c,d,e,f,h,i,j);return function(b){"click"===c?g(e,function(){a.$broadcast("leafletDirectiveMarkersClick",h)}):"dragend"===c&&(g(e,function(){i.lat=f.getLatLng().lat,i.lng=f.getLatLng().lng}),i.message&&i.focus===!0&&f.openPopup()),l(b)}},l.prototype.getAvailableEvents=function(){return["click","dblclick","mousedown","mouseover","mouseout","contextmenu","dragstart","drag","dragend","move","remove","popupopen","popupclose","touchend","touchstart","touchmove","touchcancel","touchleave"]},l.prototype.bindEvents=function(a,b,c,d,e,f){var g=k.prototype.bindEvents.call(this,a,b,c,d,e,f);i.LabelPlugin.isLoaded()&&h(b.label)&&j.genEvents(a,c,g,e,b,d,f)},new l}]),angular.module("leaflet-directive").factory("leafletPathEvents",["$rootScope","$q","$log","leafletHelpers","leafletLabelEvents","leafletEventsHelpers",function(a,b,c,d,e,f){var g=d.isDefined,h=d.isObject,i=d,j=d.errorHeader,k=e,l=f.fire,m=function(a,b,d,e,f,g,h,i){return a=a||"",a&&(a="."+a),function(j){var k="leafletDirectivePath"+a+"."+b;c.debug(k),l(e,k,d,j,j.target||f,h,g,i)}},n=function(a,b,d,e,f){var l,n,p=[],q="broadcast";if(g(f.eventBroadcast))if(h(f.eventBroadcast))if(g(f.eventBroadcast.path))if(h(f.eventBroadcast.paths))c.warn(j+"event-broadcast.path must be an object check your model.");else{void 0!==f.eventBroadcast.path.logic&&null!==f.eventBroadcast.path.logic&&("emit"!==f.eventBroadcast.path.logic&&"broadcast"!==f.eventBroadcast.path.logic?c.warn(j+"Available event propagation logic are: 'emit' or 'broadcast'."):"emit"===f.eventBroadcast.path.logic&&(q="emit"));var r=!1,s=!1;if(void 0!==f.eventBroadcast.path.enable&&null!==f.eventBroadcast.path.enable&&"object"==typeof f.eventBroadcast.path.enable&&(r=!0),void 0!==f.eventBroadcast.path.disable&&null!==f.eventBroadcast.path.disable&&"object"==typeof f.eventBroadcast.path.disable&&(s=!0),r&&s)c.warn(j+"can not enable and disable events at the same time");else if(r||s)if(r)for(l=0;l
',controller:["$scope",function(b){this._leafletMap=a.defer(),this.getMap=function(){return this._leafletMap.promise},this.getLeafletScope=function(){return b}}],link:function(a,f,g,h){function i(){isNaN(g.width)?f.css("width",g.width):f.css("width",g.width+"px")}function j(){isNaN(g.height)?f.css("height",g.height):f.css("height",g.height+"px")}var k=d.isDefined,l=c.setDefaults(a.defaults,g.id),m=e.getAvailableMapEvents(),n=e.addEvents;a.mapId=g.id,b.setDirectiveControls({},g.id),k(g.width)&&(i(),a.$watch(function(){return f[0].getAttribute("width")},function(){i(),o.invalidateSize()})),k(g.height)&&(j(),a.$watch(function(){return f[0].getAttribute("height")},function(){j(),o.invalidateSize()}));var o=new L.Map(f[0],c.getMapCreationDefaults(g.id));if(h._leafletMap.resolve(o),k(g.lfCenter)||o.setView([l.center.lat,l.center.lng],l.center.zoom),!k(g.lfTiles)&&!k(g.lfLayers)){var p=L.tileLayer(l.tileLayer,l.tileLayerOptions);p.addTo(o),b.setTiles(p,g.id)}if(k(o.zoomControl)&&k(l.zoomControlPosition)&&o.zoomControl.setPosition(l.zoomControlPosition),k(o.zoomControl)&&l.zoomControl===!1&&o.zoomControl.removeFrom(o),k(o.zoomsliderControl)&&k(l.zoomsliderControl)&&l.zoomsliderControl===!1&&o.zoomsliderControl.removeFrom(o),!k(g.lfEvents)){var q="broadcast";n(o,m,"eventName",a,q)}o.whenReady(function(){b.setMap(o,g.id)}),a.$on("$destroy",function(){c.reset(),o.remove(),b.unresolveMap(g.id)}),a.$on("invalidateSize",function(){o.invalidateSize()})}}}]),angular.module("leaflet-directive").factory("leafletBoundsHelpers",["leafletLogger","leafletHelpers",function(a,b){function c(a){return angular.isDefined(a)&&angular.isDefined(a.southWest)&&angular.isDefined(a.northEast)&&angular.isNumber(a.southWest.lat)&&angular.isNumber(a.southWest.lng)&&angular.isNumber(a.northEast.lat)&&angular.isNumber(a.northEast.lng)}var d=b.isArray,e=b.isNumber,f=b.isFunction,g=b.isDefined;return{createLeafletBounds:function(a){return c(a)?L.latLngBounds([a.southWest.lat,a.southWest.lng],[a.northEast.lat,a.northEast.lng]):void 0},isValidBounds:c,createBoundsFromArray:function(b){return d(b)&&2===b.length&&d(b[0])&&d(b[1])&&2===b[0].length&&2===b[1].length&&e(b[0][0])&&e(b[0][1])&&e(b[1][0])&&e(b[1][1])?{northEast:{lat:b[0][0],lng:b[0][1]},southWest:{lat:b[1][0],lng:b[1][1]}}:void a.error("The bounds array is not valid.")},createBoundsFromLeaflet:function(b){if(!(g(b)&&f(b.getNorthEast)&&f(b.getSouthWest)))return void a.error("The leaflet bounds is not valid object.");var c=b.getNorthEast(),d=b.getSouthWest();return{northEast:{lat:c.lat,lng:c.lng},southWest:{lat:d.lat,lng:d.lng}}}}}]),angular.module("leaflet-directive").factory("leafletControlHelpers",["$rootScope","leafletLogger","leafletHelpers","leafletLayerHelpers","leafletMapDefaults",function(a,b,c,d,e){var f=c.isDefined,g=c.isObject,h=d.createLayer,i={},j=function(a,b,c){var d=e.getDefaults(c);if(!d.controls.layers.visible)return!1;var h=!1;return g(a)&&Object.keys(a).forEach(function(b){var c=a[b];f(c.layerOptions)&&c.layerOptions.showOnSelector===!1||(h=!0)}),g(b)&&Object.keys(b).forEach(function(a){var c=b[a];f(c.layerParams)&&c.layerParams.showOnSelector===!1||(h=!0)}),h},k=function(a){var b=e.getDefaults(a),c={collapsed:b.controls.layers.collapsed,position:b.controls.layers.position,autoZIndex:!1};angular.extend(c,b.controls.layers.options);var d;return d=b.controls.layers&&f(b.controls.layers.control)?b.controls.layers.control.apply(this,[[],[],c]):new L.control.layers([],[],c)},l={draw:{isPluginLoaded:function(){return angular.isDefined(L.Control.Draw)?!0:(b.error("Draw plugin is not loaded."),!1)},checkValidParams:function(){return!0},createControl:function(a){return new L.Control.Draw(a)}},scale:{isPluginLoaded:function(){return!0},checkValidParams:function(){return!0},createControl:function(a){return new L.control.scale(a)}},fullscreen:{isPluginLoaded:function(){return angular.isDefined(L.Control.Fullscreen)?!0:(b.error("Fullscreen plugin is not loaded."),!1)},checkValidParams:function(){return!0},createControl:function(a){return new L.Control.Fullscreen(a)}},search:{isPluginLoaded:function(){return angular.isDefined(L.Control.Search)?!0:(b.error(" Search plugin is not loaded."),!1)},checkValidParams:function(){return!0},createControl:function(a){return new L.Control.Search(a)}},custom:{},minimap:{isPluginLoaded:function(){return angular.isDefined(L.Control.MiniMap)?!0:(b.error("Minimap plugin is not loaded."),!1)},checkValidParams:function(a){return f(a.layer)?!0:(b.warn('minimap "layer" option should be defined.'),!1)},createControl:function(a){var c=h(a.layer);return f(c)?new L.Control.MiniMap(c,a):void b.warn('minimap control "layer" could not be created.')}}};return{layersControlMustBeVisible:j,isValidControlType:function(a){return-1!==Object.keys(l).indexOf(a)},createControl:function(a,b){return l[a].checkValidParams(b)?l[a].createControl(b):void 0},updateLayersControl:function(a,b,c,d,e,g){var h,l=i[b],m=j(d,e,b);if(f(l)&&c){for(h in g.baselayers)l.removeLayer(g.baselayers[h]);for(h in g.overlays)l.removeLayer(g.overlays[h]);a.removeControl(l),delete i[b]}if(m){l=k(b),i[b]=l;for(h in d){var n=f(d[h].layerOptions)&&d[h].layerOptions.showOnSelector===!1;!n&&f(g.baselayers[h])&&l.addBaseLayer(g.baselayers[h],d[h].name)}for(h in e){var o=f(e[h].layerParams)&&e[h].layerParams.showOnSelector===!1;!o&&f(g.overlays[h])&&l.addOverlay(g.overlays[h],e[h].name)}a.addControl(l)}return m}}}]),angular.module("leaflet-directive").service("leafletData",["leafletLogger","$q","leafletHelpers",function(a,b,c){var d=c.getDefer,e=c.getUnresolvedDefer,f=c.setResolvedDefer,g={},h=this,i=function(a){return a.charAt(0).toUpperCase()+a.slice(1)},j=["map","tiles","layers","paths","markers","geoJSON","UTFGrid","decorations","directiveControls"];j.forEach(function(a){g[a]={}}),this.unresolveMap=function(a){var b=c.obtainEffectiveMapId(g.map,a);j.forEach(function(a){g[a][b]=void 0})},j.forEach(function(a){var b=i(a);h["set"+b]=function(b,c){var d=e(g[a],c);d.resolve(b),f(g[a],c)},h["get"+b]=function(b){var c=d(g[a],b);return c.promise}})}]),angular.module("leaflet-directive").service("leafletDirectiveControlsHelpers",["leafletLogger","leafletData","leafletHelpers",function(a,b,c){var d=c.isDefined,e=c.isString,f=c.isObject,g=function(c,g,h,i){var j={};if(!d(g))return void a.error("control name cannot be undefined");if(e(g)&&d(h)&&d(i))j[g]={create:h,clean:i};else{if(!f(g)||d(h)||d(i))return void a.error("incorrect arguments");j=g}b.getDirectiveControls().then(function(a){angular.extend(a,j),b.setDirectiveControls(a,c)})};return{extend:g}}]),angular.module("leaflet-directive").service("leafletGeoJsonHelpers",["leafletHelpers","leafletIterators",function(a,b){var c=a,d=b,e=function(a,b){return this.lat=a,this.lng=b,this},f=function(a){return Array.isArray(a)&&2===a.length?a[1]:c.isDefined(a.type)&&"Point"===a.type?+a.coordinates[1]:+a.lat},g=function(a){return Array.isArray(a)&&2===a.length?a[0]:c.isDefined(a.type)&&"Point"===a.type?+a.coordinates[0]:+a.lng},h=function(a){if(c.isUndefined(a))return!1;if(c.isArray(a)){if(2===a.length&&c.isNumber(a[0])&&c.isNumber(a[1]))return!0}else if(c.isDefined(a.type)&&"Point"===a.type&&c.isArray(a.coordinates)&&2===a.coordinates.length&&c.isNumber(a.coordinates[0])&&c.isNumber(a.coordinates[1]))return!0;var b=d.all(["lat","lng"],function(b){return c.isDefined(a[b])&&c.isNumber(a[b])});return b},i=function(a){if(a&&h(a)){var b=null;if(Array.isArray(a)&&2===a.length)b=new e(a[1],a[0]);else{if(!c.isDefined(a.type)||"Point"!==a.type)return a;b=new e(a.coordinates[1],a.coordinates[0])}return angular.extend(a,b)}};return{getLat:f,getLng:g,validateCoords:h,getCoords:i}}]),angular.module("leaflet-directive").service("leafletHelpers",["$q","leafletLogger",function(a,b){function c(a,c){var d,e;if(angular.isDefined(c))d=c;else if(0===Object.keys(a).length)d="main";else if(Object.keys(a).length>=1)for(e in a)a.hasOwnProperty(e)&&(d=e);else b.error("You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call");return d}function d(b,d){var e,f=c(b,d);return angular.isDefined(b[f])&&b[f].resolvedDefer!==!0?e=b[f].defer:(e=a.defer(),b[f]={defer:e,resolvedDefer:!1}),e}var e=angular.copy,f=e,g=function(a,b){var c;if(a&&angular.isObject(a))return null!==b&&angular.isString(b)?(c=a,b.split(".").forEach(function(a){c&&(c=c[a])}),c):b},h=function(a){return a.split(".").reduce(function(a,b){return a+'["'+b+'"]'})},i=function(a){return a.reduce(function(a,b){return a+"."+b})},j=function(a){return angular.isDefined(a)&&null!==a},k=function(a){return!j(a)},l=/([\:\-\_]+(.))/g,m=/^moz([A-Z])/,n=/^((?:x|data)[\:\-_])/i,o=function(a){return a.replace(l,function(a,b,c,d){return d?c.toUpperCase():c}).replace(m,"Moz$1")},p=function(a){return o(a.replace(n,""))};return{camelCase:o,directiveNormalize:p,copy:e,clone:f,getObjectValue:g,getObjectArrayPath:h,getObjectDotPath:i,defaultTo:function(a,b){return j(a)?a:b},isTruthy:function(a){return"true"===a||a===!0},isEmpty:function(a){return 0===Object.keys(a).length},isUndefinedOrEmpty:function(a){return angular.isUndefined(a)||null===a||0===Object.keys(a).length},isDefined:j,isUndefined:k,isNumber:angular.isNumber,isString:angular.isString,isArray:angular.isArray,isObject:angular.isObject,isFunction:angular.isFunction,equals:angular.equals,isValidCenter:function(a){return angular.isDefined(a)&&angular.isNumber(a.lat)&&angular.isNumber(a.lng)&&angular.isNumber(a.zoom)},isValidPoint:function(a){return angular.isDefined(a)?angular.isArray(a)?2===a.length&&angular.isNumber(a[0])&&angular.isNumber(a[1]):angular.isNumber(a.lat)&&angular.isNumber(a.lng):!1},isSameCenterOnMap:function(a,b){var c=b.getCenter(),d=b.getZoom();return a.lat&&a.lng&&c.lat.toFixed(4)===a.lat.toFixed(4)&&c.lng.toFixed(4)===a.lng.toFixed(4)&&d===a.zoom?!0:!1},safeApply:function(a,b){var c=a.$root.$$phase;"$apply"===c||"$digest"===c?a.$eval(b):a.$evalAsync(b)},obtainEffectiveMapId:c,getDefer:function(a,b){var e,f=c(a,b);return e=angular.isDefined(a[f])&&a[f].resolvedDefer!==!1?a[f].defer:d(a,b)},getUnresolvedDefer:d,setResolvedDefer:function(a,b){var d=c(a,b);a[d].resolvedDefer=!0},rangeIsSupported:function(){var a=document.createElement("input");return a.setAttribute("type","range"),"range"===a.type},FullScreenControlPlugin:{isLoaded:function(){return angular.isDefined(L.Control.Fullscreen)}},MiniMapControlPlugin:{isLoaded:function(){return angular.isDefined(L.Control.MiniMap)}},AwesomeMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.AwesomeMarkers)&&angular.isDefined(L.AwesomeMarkers.Icon)},is:function(a){return this.isLoaded()?a instanceof L.AwesomeMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},VectorMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.VectorMarkers)&&angular.isDefined(L.VectorMarkers.Icon)},is:function(a){return this.isLoaded()?a instanceof L.VectorMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},DomMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.DomMarkers)&&angular.isDefined(L.DomMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.DomMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},PolylineDecoratorPlugin:{isLoaded:function(){return angular.isDefined(L.PolylineDecorator)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.PolylineDecorator:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},MakiMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.MakiMarkers)&&angular.isDefined(L.MakiMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.MakiMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},ExtraMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.ExtraMarkers)&&angular.isDefined(L.ExtraMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.ExtraMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},LabelPlugin:{isLoaded:function(){return angular.isDefined(L.Label)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},MarkerClusterPlugin:{isLoaded:function(){return angular.isDefined(L.MarkerClusterGroup)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},GoogleLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Google)},is:function(a){return this.isLoaded()?a instanceof L.Google:!1}},LeafletProviderPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.Provider)},is:function(a){return this.isLoaded()?a instanceof L.TileLayer.Provider:!1}},ChinaLayerPlugin:{isLoaded:function(){return angular.isDefined(L.tileLayer.chinaProvider)}},HeatLayerPlugin:{isLoaded:function(){return angular.isDefined(L.heatLayer)}},WebGLHeatMapLayerPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.WebGLHeatMap)}},BingLayerPlugin:{isLoaded:function(){return angular.isDefined(L.BingLayer)},is:function(a){return this.isLoaded()?a instanceof L.BingLayer:!1}},WFSLayerPlugin:{isLoaded:function(){return void 0!==L.GeoJSON.WFS},is:function(a){return this.isLoaded()?a instanceof L.GeoJSON.WFS:!1}},AGSBaseLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.basemapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.basemapLayer:!1}},AGSLayerPlugin:{isLoaded:function(){return void 0!==lvector&&void 0!==lvector.AGS},is:function(a){return this.isLoaded()?a instanceof lvector.AGS:!1}},AGSFeatureLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.featureLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.featureLayer:!1}},AGSTiledMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.tiledMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.tiledMapLayer:!1}},AGSDynamicMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.dynamicMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.dynamicMapLayer:!1}},AGSImageMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.imageMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.imageMapLayer:!1}},AGSClusteredLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.clusteredFeatureLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.clusteredFeatureLayer:!1}},AGSHeatmapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.heatmapFeatureLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.heatmapFeatureLayer:!1}},YandexLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Yandex)},is:function(a){return this.isLoaded()?a instanceof L.Yandex:!1}},GeoJSONPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.GeoJSON)},is:function(a){return this.isLoaded()?a instanceof L.TileLayer.GeoJSON:!1}},UTFGridPlugin:{isLoaded:function(){return angular.isDefined(L.UtfGrid)},is:function(a){return this.isLoaded()?a instanceof L.UtfGrid:(b.error("No UtfGrid plugin found."),!1)}},CartoDB:{isLoaded:function(){return cartodb},is:function(){return!0}},Leaflet:{DivIcon:{is:function(a){return a instanceof L.DivIcon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}},Icon:{is:function(a){return a instanceof L.Icon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}}},watchOptions:{doWatch:!0,isDeep:!0,individual:{doWatch:!0,isDeep:!0}}}}]),angular.module("leaflet-directive").service("leafletIterators",["leafletLogger","leafletHelpers",function(a,b){var c,d=b,e=Object.keys,f=d.isFunction,g=d.isObject,h=Math.pow(2,53)-1,i=function(a){var b=null!==a&&a.length;return d.isNumber(b)&&b>=0&&h>=b},j=function(a){return a},k=function(a){return function(b){return null===b?void 0:b[a]}},l=function(a,b,c){if(void 0===b)return a;switch(null===c?3:c){case 1:return function(c){return a.call(b,c)};case 2:return function(c,d){return a.call(b,c,d)};case 3:return function(c,d,e){return a.call(b,c,d,e)};case 4:return function(c,d,e,f){return a.call(b,c,d,e,f)}}return function(){return a.apply(b,arguments)}},m=function(a,b){return function(c){var d=arguments.length;if(2>d||null===c)return c;for(var e=1;d>e;e++)for(var f=arguments[e],g=a(f),h=g.length,i=0;h>i;i++){var j=g[i];b&&void 0!==c[j]||(c[j]=f[j])}return c}},n=null;c=n=m(e);var o,p=function(a,b){var c=e(b),d=c.length;if(null===a)return!d;for(var f=Object(a),g=0;d>g;g++){var h=c[g];if(b[h]!==f[h]||!(h in f))return!1}return!0},q=null;o=q=function(a){return a=c({},a),function(b){return p(b,a)}};var r,s=function(a,b,c){return null===a?j:f(a)?l(a,b,c):g(a)?o(a):k(a)},t=null;r=t=function(a,b,c){b=s(b,c);for(var d=!i(a)&&e(a),f=(d||a).length,g=0;f>g;g++){var h=d?d[g]:g;if(!b(a[h],h,a))return!1}return!0};var u=function(b,c,e,f){return e||d.isDefined(b)&&d.isDefined(c)?d.isFunction(c)?!1:(f=d.defaultTo(c,"cb"),a.error(f+" is not a function","iterators"),!0):!0},v=function(a,b,c){if(!u(void 0,c,!0,"internalCb")&&!u(a,b))for(var d in a)a.hasOwnProperty(d)&&c(a[d],d)},w=function(a,b){v(a,b,function(a,c){b(a,c)})};return{each:w,forEach:w,every:r,all:t}}]),angular.module("leaflet-directive").factory("leafletLayerHelpers",["$rootScope","leafletLogger","$q","leafletHelpers","leafletIterators",function($rootScope,leafletLogger,$q,leafletHelpers,leafletIterators){function isValidLayerType(a){return isString(a.type)?-1===Object.keys(layerTypes).indexOf(a.type)?(leafletLogger.error("A layer must have a valid type: "+Object.keys(layerTypes)),!1):layerTypes[a.type].mustHaveUrl&&!isString(a.url)?(leafletLogger.error("A base layer must have an url"),!1):layerTypes[a.type].mustHaveData&&!isDefined(a.data)?(leafletLogger.error('The base layer must have a "data" array attribute'),!1):layerTypes[a.type].mustHaveLayer&&!isDefined(a.layer)?(leafletLogger.error("The type of layer "+a.type+" must have an layer defined"),!1):layerTypes[a.type].mustHaveBounds&&!isDefined(a.bounds)?(leafletLogger.error("The type of layer "+a.type+" must have bounds defined"),!1):layerTypes[a.type].mustHaveKey&&!isDefined(a.key)?(leafletLogger.error("The type of layer "+a.type+" must have key defined"),!1):!0:(leafletLogger.error("A layer must have a valid type defined."),!1)}function createLayer(a){if(isValidLayerType(a)){if(!isString(a.name))return void leafletLogger.error("A base layer must have a name");isObject(a.layerParams)||(a.layerParams={}),isObject(a.layerOptions)||(a.layerOptions={});for(var b in a.layerParams)a.layerOptions[b]=a.layerParams[b];var c={url:a.url,data:a.data,options:a.layerOptions,layer:a.layer,icon:a.icon,type:a.layerType,bounds:a.bounds,key:a.key,apiKey:a.apiKey,pluginOptions:a.pluginOptions,user:a.user};return layerTypes[a.type].createLayer(c)}}function safeAddLayer(a,b){b&&"function"==typeof b.addTo?b.addTo(a):a.addLayer(b)}function safeRemoveLayer(a,b,c){if(isDefined(c)&&isDefined(c.loadedDefer))if(angular.isFunction(c.loadedDefer)){var d=c.loadedDefer(),e=d.length;if(e>0)for(var f=function(){e--,0===e&&a.removeLayer(b)},g=0;g'+b.error.message+"";else if("arcgis"===c)for(var e=0;e'+f.layerName+"";for(var g=0;g
'+h.label+"
"}}else"image"===c&&(a.innerHTML='')},b=function(b,c,d,e){return function(){var f=L.DomUtil.create("div",c);return L.Browser.touch?L.DomEvent.on(f,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(f),L.DomEvent.on(f,"mousewheel",L.DomEvent.stopPropagation)),a(f,b,d,e),f}},c=function(a,b){return function(){for(var c=L.DomUtil.create("div",b),d=0;d
'+a.labels[d]+"
";return L.Browser.touch?L.DomEvent.on(c,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(c),L.DomEvent.on(c,"mousewheel",L.DomEvent.stopPropagation)),c}};return{getOnAddLegend:b,getOnAddArrayLegend:c,updateLegend:a}}),angular.module("leaflet-directive").service("leafletLogger",["$log",function(a){var b="[angular-leaflet] ";return{log:function(c,d){d=d?"["+d+"] ":"",a.log(b+d+c)},debug:function(c,d){d=d?"["+d+"] ":"",a.debug(b+d+c)},info:function(c,d){d=d?"["+d+"] ":"",a.info(b+d+c)},warn:function(c,d){d=d?"["+d+"] ":"",a.warn(b+d+c)},error:function(c,d){d=d?"["+d+"] ":"",a.error(b+d+c)}}}]),angular.module("leaflet-directive").factory("leafletMapDefaults",["$q","leafletHelpers",function(a,b){function c(){return{keyboard:!0,dragging:!0,worldCopyJump:!1,doubleClickZoom:!0,scrollWheelZoom:!0,tap:!0,touchZoom:!0,zoomControl:!0,zoomsliderControl:!1,zoomControlPosition:"topleft",attributionControl:!0,controls:{layers:{visible:!0,position:"topright",collapsed:!0}},nominatim:{server:" http://nominatim.openstreetmap.org/search"},crs:L.CRS.EPSG3857,tileLayer:"//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",tileLayerOptions:{attribution:'© OpenStreetMap contributors'},path:{weight:10,opacity:1,color:"#0000ff"},center:{lat:0,lng:0,zoom:1}}}var d=b.isDefined,e=b.isObject,f=b.obtainEffectiveMapId,g={};return{reset:function(){g={}},getDefaults:function(a){var b=f(g,a);return g[b]},getMapCreationDefaults:function(a){var b=f(g,a),c=g[b],e={maxZoom:c.maxZoom,keyboard:c.keyboard,dragging:c.dragging,zoomControl:c.zoomControl,doubleClickZoom:c.doubleClickZoom,scrollWheelZoom:c.scrollWheelZoom,tap:c.tap,touchZoom:c.touchZoom,attributionControl:c.attributionControl,worldCopyJump:c.worldCopyJump,crs:c.crs};if(d(c.minZoom)&&(e.minZoom=c.minZoom),d(c.zoomAnimation)&&(e.zoomAnimation=c.zoomAnimation),d(c.fadeAnimation)&&(e.fadeAnimation=c.fadeAnimation),d(c.markerZoomAnimation)&&(e.markerZoomAnimation=c.markerZoomAnimation),c.map)for(var h in c.map)e[h]=c.map[h];return e},setDefaults:function(a,b){var h=c();d(a)&&(h.doubleClickZoom=d(a.doubleClickZoom)?a.doubleClickZoom:h.doubleClickZoom,h.scrollWheelZoom=d(a.scrollWheelZoom)?a.scrollWheelZoom:h.doubleClickZoom,h.tap=d(a.tap)?a.tap:h.tap,h.touchZoom=d(a.touchZoom)?a.touchZoom:h.doubleClickZoom,h.zoomControl=d(a.zoomControl)?a.zoomControl:h.zoomControl,h.zoomsliderControl=d(a.zoomsliderControl)?a.zoomsliderControl:h.zoomsliderControl,h.attributionControl=d(a.attributionControl)?a.attributionControl:h.attributionControl,h.tileLayer=d(a.tileLayer)?a.tileLayer:h.tileLayer,h.zoomControlPosition=d(a.zoomControlPosition)?a.zoomControlPosition:h.zoomControlPosition,h.keyboard=d(a.keyboard)?a.keyboard:h.keyboard,h.dragging=d(a.dragging)?a.dragging:h.dragging,d(a.controls)&&angular.extend(h.controls,a.controls),e(a.crs)?h.crs=a.crs:d(L.CRS[a.crs])&&(h.crs=L.CRS[a.crs]),d(a.center)&&angular.copy(a.center,h.center),d(a.tileLayerOptions)&&angular.copy(a.tileLayerOptions,h.tileLayerOptions),d(a.maxZoom)&&(h.maxZoom=a.maxZoom),d(a.minZoom)&&(h.minZoom=a.minZoom),d(a.zoomAnimation)&&(h.zoomAnimation=a.zoomAnimation),d(a.fadeAnimation)&&(h.fadeAnimation=a.fadeAnimation),d(a.markerZoomAnimation)&&(h.markerZoomAnimation=a.markerZoomAnimation),d(a.worldCopyJump)&&(h.worldCopyJump=a.worldCopyJump),d(a.map)&&(h.map=a.map),d(a.path)&&(h.path=a.path));var i=f(g,b);return g[i]=h,h}}}]),angular.module("leaflet-directive").service("leafletMarkersHelpers",["$rootScope","$timeout","leafletHelpers","leafletLogger","$compile","leafletGeoJsonHelpers",function(a,b,c,d,e,f){ +var g=c.isDefined,h=c.defaultTo,i=c.MarkerClusterPlugin,j=c.AwesomeMarkersPlugin,k=c.VectorMarkersPlugin,l=c.MakiMarkersPlugin,m=c.ExtraMarkersPlugin,n=c.DomMarkersPlugin,o=c.safeApply,p=c,q=c.isString,r=c.isNumber,s=c.isObject,t={},u=f,v=function(a){var b="";return["_icon","_latlng","_leaflet_id","_map","_shadow"].forEach(function(c){b+=c+": "+h(a[c],"undefined")+" \n"}),"[leafletMarker] : \n"+b},w=function(b){if(g(b)&&g(b.type)&&"awesomeMarker"===b.type)return j.isLoaded()||d.error("The AwesomeMarkers Plugin is not loaded."),new L.AwesomeMarkers.icon(b);if(g(b)&&g(b.type)&&"vectorMarker"===b.type)return k.isLoaded()||d.error("The VectorMarkers Plugin is not loaded."),new L.VectorMarkers.icon(b);if(g(b)&&g(b.type)&&"makiMarker"===b.type)return l.isLoaded()||d.error("The MakiMarkers Plugin is not loaded."),new L.MakiMarkers.icon(b);if(g(b)&&g(b.type)&&"extraMarker"===b.type)return m.isLoaded()||d.error("The ExtraMarkers Plugin is not loaded."),new L.ExtraMarkers.icon(b);if(g(b)&&g(b.type)&&"div"===b.type)return new L.divIcon(b);if(g(b)&&g(b.type)&&"dom"===b.type){n.isLoaded()||d.error("The DomMarkers Plugin is not loaded.");var c=angular.isFunction(b.getMarkerScope)?b.getMarkerScope():a,f=e(b.template)(c),h=angular.copy(b);return h.element=f[0],new L.DomMarkers.icon(h)}if(g(b)&&g(b.type)&&"icon"===b.type)return b.icon;var i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAGmklEQVRYw7VXeUyTZxjvNnfELFuyIzOabermMZEeQC/OclkO49CpOHXOLJl/CAURuYbQi3KLgEhbrhZ1aDwmaoGqKII6odATmH/scDFbdC7LvFqOCc+e95s2VG50X/LLm/f4/Z7neY/ne18aANCmAr5E/xZf1uDOkTcGcWR6hl9247tT5U7Y6SNvWsKT63P58qbfeLJG8M5qcgTknrvvrdDbsT7Ml+tv82X6vVxJE33aRmgSyYtcWVMqX97Yv2JvW39UhRE2HuyBL+t+gK1116ly06EeWFNlAmHxlQE0OMiV6mQCScusKRlhS3QLeVJdl1+23h5dY4FNB3thrbYboqptEFlphTC1hSpJnbRvxP4NWgsE5Jyz86QNNi/5qSUTGuFk1gu54tN9wuK2wc3o+Wc13RCmsoBwEqzGcZsxsvCSy/9wJKf7UWf1mEY8JWfewc67UUoDbDjQC+FqK4QqLVMGGR9d2wurKzqBk3nqIT/9zLxRRjgZ9bqQgub+DdoeCC03Q8j+0QhFhBHR/eP3U/zCln7Uu+hihJ1+bBNffLIvmkyP0gpBZWYXhKussK6mBz5HT6M1Nqpcp+mBCPXosYQfrekGvrjewd59/GvKCE7TbK/04/ZV5QZYVWmDwH1mF3xa2Q3ra3DBC5vBT1oP7PTj4C0+CcL8c7C2CtejqhuCnuIQHaKHzvcRfZpnylFfXsYJx3pNLwhKzRAwAhEqG0SpusBHfAKkxw3w4627MPhoCH798z7s0ZnBJ/MEJbZSbXPhER2ih7p2ok/zSj2cEJDd4CAe+5WYnBCgR2uruyEw6zRoW6/DWJ/OeAP8pd/BGtzOZKpG8oke0SX6GMmRk6GFlyAc59K32OTEinILRJRchah8HQwND8N435Z9Z0FY1EqtxUg+0SO6RJ/mmXz4VuS+DpxXC3gXmZwIL7dBSH4zKE50wESf8qwVgrP1EIlTO5JP9Igu0aexdh28F1lmAEGJGfh7jE6ElyM5Rw/FDcYJjWhbeiBYoYNIpc2FT/SILivp0F1ipDWk4BIEo2VuodEJUifhbiltnNBIXPUFCMpthtAyqws/BPlEF/VbaIxErdxPphsU7rcCp8DohC+GvBIPJS/tW2jtvTmmAeuNO8BNOYQeG8G/2OzCJ3q+soYB5i6NhMaKr17FSal7GIHheuV3uSCY8qYVuEm1cOzqdWr7ku/R0BDoTT+DT+ohCM6/CCvKLKO4RI+dXPeAuaMqksaKrZ7L3FE5FIFbkIceeOZ2OcHO6wIhTkNo0ffgjRGxEqogXHYUPHfWAC/lADpwGcLRY3aeK4/oRGCKYcZXPVoeX/kelVYY8dUGf8V5EBRbgJXT5QIPhP9ePJi428JKOiEYhYXFBqou2Guh+p/mEB1/RfMw6rY7cxcjTrneI1FrDyuzUSRm9miwEJx8E/gUmqlyvHGkneiwErR21F3tNOK5Tf0yXaT+O7DgCvALTUBXdM4YhC/IawPU+2PduqMvuaR6eoxSwUk75ggqsYJ7VicsnwGIkZBSXKOUww73WGXyqP+J2/b9c+gi1YAg/xpwck3gJuucNrh5JvDPvQr0WFXf0piyt8f8/WI0hV4pRxxkQZdJDfDJNOAmM0Ag8jyT6hz0WGXWuP94Yh2jcfjmXAGvHCMslRimDHYuHuDsy2QtHuIavznhbYURq5R57KpzBBRZKPJi8eQg48h4j8SDdowifdIrEVdU+gbO6QNvRRt4ZBthUaZhUnjlYObNagV3keoeru3rU7rcuceqU1mJBxy+BWZYlNEBH+0eH4vRiB+OYybU2hnblYlTvkHinM4m54YnxSyaZYSF6R3jwgP7udKLGIX6r/lbNa9N6y5MFynjWDtrHd75ZvTYAPO/6RgF0k76mQla3FGq7dO+cH8sKn0Vo7nDllwAhqwLPkxrHwWmHJOo+AKJ4rab5OgrM7rVu8eWb2Pu0Dh4eDgXoOfvp7Y7QeqknRmvcTBEyq9m/HQQSCSz6LHq3z0yzsNySRfMS253wl2KyRDbcZPcfJKjZmSEOjcxyi+Y8dUOtsIEH6R2wNykdqrkYJ0RV92H0W58pkfQk7cKevsLK10Py8SdMGfXNXATY+pPbyJR/ET6n9nIfztNtZYRV9XniQu9IA2vOVgy4ir7GCLVmmd+zjkH0eAF9Po6K61pmCXHxU5rHMYd1ftc3owjwRSVRzLjKvqZEty6cRUD7jGqiOdu5HG6MdHjNcNYGqfDm5YRzLBBCCDl/2bk8a8gdbqcfwECu62Fg/HrggAAAABJRU5ErkJggg==",o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=";return g(b)&&g(b.iconUrl)?new L.Icon(b):new L.Icon.Default({iconUrl:i,shadowUrl:o,iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]})},x=function(a){g(t[a])&&t.splice(a,1)},y=function(){t={}},z=function(a,b,c){if(a.closePopup(),g(c)&&g(c.overlays))for(var d in c.overlays)if((c.overlays[d]instanceof L.LayerGroup||c.overlays[d]instanceof L.FeatureGroup)&&c.overlays[d].hasLayer(a))return void c.overlays[d].removeLayer(a);if(g(t))for(var e in t)t[e].hasLayer(a)&&t[e].removeLayer(a);b.hasLayer(a)&&b.removeLayer(a)},A=function(a,b){var c=a._popup._container.offsetHeight,d=new L.Point(a._popup._containerLeft,-c-a._popup._containerBottom),e=b.layerPointToContainerPoint(d);null!==e&&a._popup._adjustPan()},B=function(a,b){e(a._popup._contentNode)(b)},C=function(a,c,d){var e=a._popup._contentNode.innerText||a._popup._contentNode.textContent;e.length<1&&b(function(){C(a,c,d)});var f=a._popup._contentNode.offsetWidth;return a._popup._updateLayout(),a._popup._updatePosition(),a._popup.options.autoPan&&A(a,d),f},D=function(b,c,e){var f=angular.isFunction(c.getMessageScope)?c.getMessageScope():a,h=g(c.compileMessage)?c.compileMessage:!0;if(h){if(!g(b._popup)||!g(b._popup._contentNode))return d.error("Popup is invalid or does not have any content."),!1;B(b,f),C(b,c,e)}},E=function(b,c){var d=angular.isFunction(c.getMessageScope)?c.getMessageScope():a,f=angular.isFunction(c.getLabelScope)?c.getLabelScope():d,h=g(c.compileMessage)?c.compileMessage:!0;p.LabelPlugin.isLoaded()&&g(c.label)&&(g(c.label.options)&&c.label.options.noHide===!0&&b.showLabel(),h&&g(b.label)&&e(b.label._container)(f))},F=function(a,b,c,e,f,h,i){if(g(b)){if(!u.validateCoords(a))return d.warn("There are problems with lat-lng data, please verify your marker model"),void z(c,i,h);var j=a===b;if(g(a.iconAngle)&&b.iconAngle!==a.iconAngle&&c.setIconAngle(a.iconAngle),q(a.layer)||q(b.layer)&&(g(h.overlays[b.layer])&&h.overlays[b.layer].hasLayer(c)&&(h.overlays[b.layer].removeLayer(c),c.closePopup()),i.hasLayer(c)||i.addLayer(c)),(r(a.opacity)||r(parseFloat(a.opacity)))&&a.opacity!==b.opacity&&c.setOpacity(a.opacity),q(a.layer)&&b.layer!==a.layer){if(q(b.layer)&&g(h.overlays[b.layer])&&h.overlays[b.layer].hasLayer(c)&&h.overlays[b.layer].removeLayer(c),c.closePopup(),i.hasLayer(c)&&i.removeLayer(c),!g(h.overlays[a.layer]))return void d.error("You must use a name of an existing layer");var k=h.overlays[a.layer];if(!(k instanceof L.LayerGroup||k instanceof L.FeatureGroup))return void d.error('A marker can only be added to a layer of type "group" or "featureGroup"');k.addLayer(c),i.hasLayer(c)&&a.focus===!0&&c.openPopup()}if(a.draggable!==!0&&b.draggable===!0&&g(c.dragging)&&c.dragging.disable(),a.draggable===!0&&b.draggable!==!0&&(c.dragging?c.dragging.enable():L.Handler.MarkerDrag&&(c.dragging=new L.Handler.MarkerDrag(c),c.options.draggable=!0,c.dragging.enable())),s(a.icon)||s(b.icon)&&(c.setIcon(w()),c.closePopup(),c.unbindPopup(),q(a.message)&&c.bindPopup(a.message,a.popupOptions)),s(a.icon)&&s(b.icon)&&!angular.equals(a.icon,b.icon)){var l=!1;c.dragging&&(l=c.dragging.enabled()),c.setIcon(w(a.icon)),l&&c.dragging.enable(),c.closePopup(),c.unbindPopup(),q(a.message)&&(c.bindPopup(a.message,a.popupOptions),i.hasLayer(c)&&a.focus===!0&&c.openPopup())}!q(a.message)&&q(b.message)&&(c.closePopup(),c.unbindPopup()),p.LabelPlugin.isLoaded()&&(g(a.label)&&g(a.label.message)?"label"in b&&"message"in b.label&&!angular.equals(a.label.message,b.label.message)?c.updateLabelContent(a.label.message):!angular.isFunction(c.getLabel)||angular.isFunction(c.getLabel)&&!g(c.getLabel())?(c.bindLabel(a.label.message,a.label.options),E(c,a)):E(c,a):(!("label"in a)||"message"in a.label)&&angular.isFunction(c.unbindLabel)&&c.unbindLabel()),q(a.message)&&!q(b.message)&&c.bindPopup(a.message,a.popupOptions),q(a.message)&&q(b.message)&&a.message!==b.message&&c.setPopupContent(a.message);var m=!1;a.focus!==!0&&b.focus===!0&&(c.closePopup(),m=!0),(a.focus===!0&&(a.lat!==b.lat||a.lng!==b.lng||!g(b.focus)||b.focus===!1)||j&&a.focus===!0)&&(c.openPopup(),m=!0),b.zIndexOffset!==a.zIndexOffset&&c.setZIndexOffset(a.zIndexOffset);var n=c.getLatLng(),o=q(a.layer)&&p.MarkerClusterPlugin.is(h.overlays[a.layer]);o?m?(a.lat!==b.lat||a.lng!==b.lng)&&(h.overlays[a.layer].removeLayer(c),c.setLatLng([a.lat,a.lng]),h.overlays[a.layer].addLayer(c)):n.lat!==a.lat||n.lng!==a.lng?(h.overlays[a.layer].removeLayer(c),c.setLatLng([a.lat,a.lng]),h.overlays[a.layer].addLayer(c)):a.lat!==b.lat||a.lng!==b.lng?(h.overlays[a.layer].removeLayer(c),c.setLatLng([a.lat,a.lng]),h.overlays[a.layer].addLayer(c)):s(a.icon)&&s(b.icon)&&!angular.equals(a.icon,b.icon)&&(h.overlays[a.layer].removeLayer(c),h.overlays[a.layer].addLayer(c)):(n.lat!==a.lat||n.lng!==a.lng)&&c.setLatLng([a.lat,a.lng])}};return{resetMarkerGroup:x,resetMarkerGroups:y,deleteMarker:z,manageOpenPopup:D,manageOpenLabel:E,createMarker:function(a){if(!g(a)||!u.validateCoords(a))return void d.error("The marker definition is not valid.");var b=u.getCoords(a);if(!g(b))return void d.error("Unable to get coordinates from markerData.");var c={icon:w(a.icon),title:g(a.title)?a.title:"",draggable:g(a.draggable)?a.draggable:!1,clickable:g(a.clickable)?a.clickable:!0,riseOnHover:g(a.riseOnHover)?a.riseOnHover:!1,zIndexOffset:g(a.zIndexOffset)?a.zIndexOffset:0,iconAngle:g(a.iconAngle)?a.iconAngle:0};for(var e in a)a.hasOwnProperty(e)&&!c.hasOwnProperty(e)&&(c[e]=a[e]);var f=new L.marker(b,c);return q(a.message)||f.unbindPopup(),f},addMarkerToGroup:function(a,b,c,e){return q(b)?i.isLoaded()?(g(t[b])||(t[b]=new L.MarkerClusterGroup(c),e.addLayer(t[b])),void t[b].addLayer(a)):void d.error("The MarkerCluster plugin is not loaded."):void d.error("The marker group you have specified is invalid.")},listenMarkerEvents:function(a,b,c,d,e){a.on("popupopen",function(){o(c,function(){(g(a._popup)||g(a._popup._contentNode))&&(b.focus=!0,D(a,b,e))})}),a.on("popupclose",function(){o(c,function(){b.focus=!1})}),a.on("add",function(){o(c,function(){"label"in b&&E(a,b)})})},updateMarker:F,addMarkerWatcher:function(a,b,c,d,e,f){var i=p.getObjectArrayPath("markers."+b);f=h(f,!0);var j=c.$watch(i,function(f,h){return g(f)?void F(f,h,a,b,c,d,e):(z(a,e,d),void j())},f)},string:v}}]),angular.module("leaflet-directive").factory("leafletPathsHelpers",["$rootScope","leafletLogger","leafletHelpers",function(a,b,c){function d(a){return a.filter(function(a){return k(a)}).map(function(a){return e(a)})}function e(a){return i(a)?new L.LatLng(a[0],a[1]):new L.LatLng(a.lat,a.lng)}function f(a){return a.map(function(a){return d(a)})}function g(a,b){for(var c={},d=0;d0&&e(a[0].boundingbox)?i.resolve(a[0]):i.reject("[Nominatim] Invalid address")}),i.promise}}}]),angular.module("leaflet-directive").directive("lfBounds",["leafletLogger","$timeout","$http","leafletHelpers","nominatimService","leafletBoundsHelpers",function(a,b,c,d,e,f){return{restrict:"A",scope:!1,replace:!1,require:["leaflet"],link:function(c,g,h,i){var j=d.isDefined,k=f.createLeafletBounds,l=i[0].getLeafletScope(),m=i[0],n=function(a){return 0===a._southWest.lat&&0===a._southWest.lng&&0===a._northEast.lat&&0===a._northEast.lng};m.getMap().then(function(d){l.$on("boundsChanged",function(a){var c=a.currentScope,e=d.getBounds();if(!n(e)&&!c.settingBoundsFromScope){c.settingBoundsFromLeaflet=!0;var f={northEast:{lat:e._northEast.lat,lng:e._northEast.lng},southWest:{lat:e._southWest.lat,lng:e._southWest.lng},options:e.options};angular.equals(c.bounds,f)||(c.bounds=f),b(function(){c.settingBoundsFromLeaflet=!1})}});var f;l.$watch("bounds",function(g){if(!c.settingBoundsFromLeaflet){if(j(g.address)&&g.address!==f)return c.settingBoundsFromScope=!0,e.query(g.address,h.id).then(function(a){var b=a.boundingbox,c=[[b[0],b[2]],[b[1],b[3]]];d.fitBounds(c)},function(b){a.error(b,"bounds")}),f=g.address,void b(function(){c.settingBoundsFromScope=!1});var i=k(g);i&&!d.getBounds().equals(i)&&(c.settingBoundsFromScope=!0,d.fitBounds(i,g.options),b(function(){c.settingBoundsFromScope=!1}))}},!0)})}}}]),angular.module("leaflet-directive").directive("lfCenter",["leafletLogger","$q","$location","$timeout","leafletMapDefaults","leafletHelpers","leafletBoundsHelpers","leafletMapEvents",function(a,b,c,d,e,f,g,h){var i,j=f.isDefined,k=f.isNumber,l=f.isSameCenterOnMap,m=f.safeApply,n=f.isValidCenter,o=g.isValidBounds,p=f.isUndefinedOrEmpty,q=function(a,b){return j(a)&&o(a)&&p(b)};return{restrict:"A",scope:!1,replace:!1,require:"leaflet",controller:function(){i=b.defer(),this.getCenter=function(){return i.promise}},link:function(b,f,o,p){var r=p.getLeafletScope();j(r.center)||(a.error('The scope "center" variable is not defined',"center"),r.center={});var s=r.center;p.getMap().then(function(b){var f=e.getDefaults(o.id);if(-1!==o.lfCenter.search("-"))return a.error('The "center" variable can\'t use a "-" on its key name: "'+o.lfCenter,"center"),void b.setView([f.center.lat,f.center.lng],f.center.zoom);if(q(r.bounds,s))b.fitBounds(g.createLeafletBounds(r.bounds),r.bounds.options),m(r,function(a){angular.extend(a.center,{lat:b.getCenter().lat,lng:b.getCenter().lng,zoom:b.getZoom(),autoDiscover:!1})}),m(r,function(a){var c=b.getBounds();a.bounds={northEast:{lat:c._northEast.lat,lng:c._northEast.lng},southWest:{lat:c._southWest.lat,lng:c._southWest.lng}}});else{if(!j(s))return a.error('The "center" property is not defined in the main scope',"center"),void b.setView([f.center.lat,f.center.lng],f.center.zoom);j(s.lat)&&j(s.lng)||j(s.autoDiscover)||angular.copy(f.center,s)}var p,t;if(s.allowUrlHashCenter===!0){var u=function(){var a,b=c.search();if(j(b.c)){var d=b.c.split(":");3===d.length&&(a={lat:parseFloat(d[0]),lng:parseFloat(d[1]),zoom:parseInt(d[2],10),allowUrlHashCenter:s.allowUrlHashCenter})}return a};p=u(),r.$on("$locationChangeSuccess",function(a){var c=a.currentScope,d=u();j(d)&&!l(d,b)&&angular.extend(c.center,{lat:d.lat,lng:d.lng,zoom:d.zoom,allowUrlHashCenter:s.allowUrlHashCenter})})}r.$watch("center",function(c){return r.settingCenterFromLeaflet?void 0:(j(p)&&(angular.copy(p,c),p=void 0),n(c)||c.autoDiscover===!0?c.autoDiscover===!0?(k(c.zoom)||b.setView([f.center.lat,f.center.lng],f.center.zoom),void(k(c.zoom)&&c.zoom>f.center.zoom?b.locate({setView:!0,maxZoom:c.zoom}):j(f.maxZoom)?b.locate({setView:!0,maxZoom:f.maxZoom}):b.locate({setView:!0}))):void(t&&l(c,b)||(r.settingCenterFromScope=!0,b.setView([c.lat,c.lng],c.zoom),h.notifyCenterChangedToBounds(r,b),d(function(){r.settingCenterFromScope=!1}))):void a.warn(" invalid 'center'","center"))},!0),b.whenReady(function(){t=!0}),b.on("moveend",function(){i.resolve(),s.allowUrlHashCenter===!0&&h.notifyCenterUrlHashChanged(r,b,c.search()),l(s,b)||r.settingCenterFromScope||(r.settingCenterFromLeaflet=!0,m(r,function(a){r.settingCenterFromScope||angular.extend(a.center,{lat:b.getCenter().lat,lng:b.getCenter().lng,zoom:b.getZoom(),autoDiscover:!1}),h.notifyCenterChangedToBounds(r,b),d(function(){r.settingCenterFromLeaflet=!1})}))}),s.autoDiscover===!0&&b.on("locationerror",function(){a.warn("The Geolocation API is unauthorized on this page.","center"),n(s)?(b.setView([s.lat,s.lng],s.zoom),h.notifyCenterChangedToBounds(r,b)):(b.setView([f.center.lat,f.center.lng],f.center.zoom),h.notifyCenterChangedToBounds(r,b))})})}}}]),angular.module("leaflet-directive").directive("lfControls",["leafletLogger","leafletHelpers","leafletControlHelpers",function(a,b,c){return{restrict:"A",scope:!1,replace:!1,require:"?^leaflet",link:function(d,e,f,g){if(g){var h=c.createControl,i=c.isValidControlType,j=g.getLeafletScope(),k=b.isDefined,l=b.isArray,m={};g.getMap().then(function(b){j.$watchCollection("controls",function(c){for(var d in m)k(c[d])||(b.hasControl(m[d])&&b.removeControl(m[d]),delete m[d]);for(var e in c){var f,g=k(c[e].type)?c[e].type:e;if(!i(g))return void a.error(" Invalid control type: "+g,"controls");if("custom"!==g)f=h(g,c[e]),b.addControl(f),m[e]=f;else{var j=c[e];if(l(j))for(var n in j){var o=j[n];b.addControl(o),m[e]=k(m[e])?m[e].concat([o]):[o]}else b.addControl(j),m[e]=j}}})})}}}}]),angular.module("leaflet-directive").directive("decorations",["leafletLogger",function(a){return{link:function(){a.error('The "decorations" markup code is deprecated now. Please update your HTML with "lf-decorations" markup attributes.',"decorations")}}}]),angular.module("leaflet-directive").directive("lfDecorations",["leafletLogger","leafletHelpers",function(a,b){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(c,d,e,f){function g(b){return k(b)&&k(b.coordinates)&&(j.isLoaded()||a.error("The PolylineDecorator Plugin is not loaded.","decorations")),L.polylineDecorator(b.coordinates)}function h(a,b){return k(a)&&k(b)&&k(b.coordinates)&&k(b.patterns)?(a.setPaths(b.coordinates),a.setPatterns(b.patterns),a):void 0}var i=f.getLeafletScope(),j=b.PolylineDecoratorPlugin,k=b.isDefined,l={};f.getMap().then(function(a){i.$watch("decorations",function(b){for(var c in l)k(b[c])&&angular.equals(b[c],l)||(a.removeLayer(l[c]),delete l[c]);for(var d in b){var e=b[d],f=g(e);k(f)&&(l[d]=f,a.addLayer(f),h(f,e))}},!0)})}}}]),angular.module("leaflet-directive").directive("maxbounds",["leafletLogger",function(a){return{link:function(){a.error('The "maxbounds" markup code is deprecated now. Please update your HTML with "lf-maxbounds" markup attributes.',"maxbounds")}}}]),angular.module("leaflet-directive").directive("defaults",["leafletLogger",function(a){return{link:function(){a.error('The "defaults" markup code is deprecated now. Please update your HTML with "lf-defaults" markup attributes.',"defaults")}}}]),angular.module("leaflet-directive").directive("bounds",["leafletLogger",function(a){return{link:function(){a.error('The "bounds" markup code is deprecated now. Please update your HTML with "lf-bounds" markup attributes.',"bounds")}}}]),angular.module("leaflet-directive").directive("controls",["leafletLogger",function(a){return{link:function(){a.error('The "controls" markup code is deprecated now. Please update your HTML with "lf-controls" markup attributes.',"controls")}}}]),angular.module("leaflet-directive").directive("center",["leafletLogger",function(a){return{link:function(){a.error('The "center" markup code is deprecated now. Please update your HTML with "lf-center" markup attributes.',"center")}}}]),angular.module("leaflet-directive").directive("paths",["leafletLogger",function(a){return{link:function(){a.error('The "paths" markup code is deprecated now. Please update your HTML with "lf-paths" markup attributes.',"paths")}}}]),angular.module("leaflet-directive").directive("tiles",["leafletLogger",function(a){return{link:function(){a.error('The "tiles" markup code is deprecated now. Please update your HTML with "lf-tiles" markup attributes.',"tiles")}}}]),angular.module("leaflet-directive").directive("markers",["leafletLogger",function(a){return{link:function(){a.error('The "markers" markup code is deprecated now. Please update your HTML with "lf-markers" markup attributes.',"markers")}}}]),angular.module("leaflet-directive").directive("eventBroadcast",["leafletLogger",function(a){return{link:function(){a.error('The "event-broadcast" markup code is deprecated now. Please update your HTML with "lf-events" markup attributes.',"events")}}}]),angular.module("leaflet-directive").directive("geojson",["leafletLogger",function(a){return{link:function(){a.error('The "geojson" markup code is deprecated now. Please update your HTML with "lf-geojson" markup attributes.',"geojson")}}}]),angular.module("leaflet-directive").directive("layers",["leafletLogger",function(a){return{link:function(){a.error('The "layers" markup code is deprecated now. Please update your HTML with "lf-layers" markup attributes.',"layers")}}}]),angular.module("leaflet-directive").directive("markers",["leafletLogger",function(a){return{link:function(){a.error('The "markers" markup code is deprecated now. Please update your HTML with "lf-markers" markup attributes.',"markers")}}}]),angular.module("leaflet-directive").directive("lfEvents",["leafletLogger","$rootScope","leafletHelpers","leafletMapEvents","leafletIterators",function(a,b,c,d,e){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(b,f,g,h){var i=c.isObject,j=c.isDefined,k=h.getLeafletScope(),l=k.lfEvents,m=d.getAvailableMapEvents(),n=d.addEvents;h.getMap().then(function(b){var c=[],d="broadcast";j(l)&&j(l.map)?i(l.map)?("emit"!==l.map.logic&&"broadcast"!==l.map.logic?a.warn("Available event propagation logic are: 'emit' or 'broadcast'.","events"):d=l.map.logic,i(l.map.enable)&&l.map.enable.length>=0?e.each(l.map.enable,function(a){-1===c.indexOf(a)&&-1!==m.indexOf(a)&&c.push(a)}):a.warn("[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.","events")):a.warn("event-broadcast.map must be an object check your model.","events"):c=m,n(b,c,"eventName",k,d)})}}}]),angular.module("leaflet-directive").directive("lfGeojson",["leafletLogger","$rootScope","leafletData","leafletHelpers","leafletWatchHelpers","leafletDirectiveControlsHelpers","leafletIterators","leafletGeoJsonEvents",function(a,b,c,d,e,f,g,h){var i=e.maybeWatch,j=d.watchOptions,k=f.extend,l=d,m=g;return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(a,b,e,f){var g=d.isDefined,n=f.getLeafletScope(),o={},p=!1;f.getMap().then(function(a){var b=n.geojsonWatchOptions||j,f=function(a,b){var c;return c=angular.isFunction(a.onEachFeature)?a.onEachFeature:function(c,f){d.LabelPlugin.isLoaded()&&g(c.properties.description)&&f.bindLabel(c.properties.description),h.bindEvents(e.id,f,null,c,n,b,{resetStyleOnMouseout:a.resetStyleOnMouseout,mapId:e.id})}},q=l.isDefined(e.geojsonNested)&&l.isTruthy(e.geojsonNested),r=function(){if(o){var b=function(b){g(b)&&a.hasLayer(b)&&a.removeLayer(b)};return q?void m.each(o,function(a){b(a)}):void b(o)}},s=function(b,d){var h=angular.copy(b);if(g(h)&&g(h.data)){var i=f(h,d);g(h.options)||(h.options={style:h.style,filter:h.filter,onEachFeature:i,pointToLayer:h.pointToLayer});var j=L.geoJson(h.data,h.options);d&&l.isString(d)?o[d]=j:o=j,j.addTo(a),p||(p=!0,c.setGeoJSON(o,e.id))}},t=function(a){if(r(),q){if(!a||!Object.keys(a).length)return;return void m.each(a,function(a,b){s(a,b)})}s(a)};k(e.id,"geojson",t,r),i(n,"geojson",b,function(a){t(a)})})}}}]),angular.module("leaflet-directive").directive("layercontrol",["$filter","leafletLogger","leafletData","leafletHelpers",function(a,b,c,d){return{restrict:"E",scope:{icons:"=?",autoHideOpacity:"=?",showGroups:"=?",title:"@",baseTitle:"@",overlaysTitle:"@"},replace:!0,transclude:!1,require:"^leaflet",controller:["$scope","$element","$sce",function(a,b,e){var f=d.safeApply,g=d.isDefined;angular.extend(a,{baselayer:"",oldGroup:"",layerProperties:{},groupProperties:{},rangeIsSupported:d.rangeIsSupported(),changeBaseLayer:function(b,e){d.safeApply(a,function(d){d.baselayer=b,c.getMap().then(function(e){c.getLayers().then(function(c){if(!e.hasLayer(c.baselayers[b])){for(var f in d.layers.baselayers)d.layers.baselayers[f].icon=d.icons.unradio,e.hasLayer(c.baselayers[f])&&e.removeLayer(c.baselayers[f]);e.addLayer(c.baselayers[b]),d.layers.baselayers[b].icon=a.icons.radio}})})}),e.preventDefault()},moveLayer:function(b,c,d){var e=Object.keys(a.layers.baselayers).length;if(c>=1+e&&c<=a.overlaysArray.length+e){var g;for(var h in a.layers.overlays)if(a.layers.overlays[h].index===c){g=a.layers.overlays[h];break}g&&f(a,function(){g.index=b.index,b.index=c})}d.stopPropagation(),d.preventDefault()},initIndex:function(b,c){var d=Object.keys(a.layers.baselayers).length;b.index=g(b.index)?b.index:c+d+1},initGroup:function(b){a.groupProperties[b]=a.groupProperties[b]?a.groupProperties[b]:{}},toggleOpacity:function(b,c){if(c.visible){if(a.autoHideOpacity&&!a.layerProperties[c.name].opacityControl)for(var d in a.layerProperties)a.layerProperties[d].opacityControl=!1;a.layerProperties[c.name].opacityControl=!a.layerProperties[c.name].opacityControl}b.stopPropagation(),b.preventDefault()},toggleLegend:function(b){a.layerProperties[b.name].showLegend=!a.layerProperties[b.name].showLegend},showLegend:function(b){return b.legend&&a.layerProperties[b.name].showLegend},unsafeHTML:function(a){return e.trustAsHtml(a)},getOpacityIcon:function(b){return b.visible&&a.layerProperties[b.name].opacityControl?a.icons.close:a.icons.open},getGroupIcon:function(b){return b.visible?a.icons.check:a.icons.uncheck},changeOpacity:function(b){var d=a.layerProperties[b.name].opacity;c.getMap().then(function(e){c.getLayers().then(function(c){var f;for(var g in a.layers.overlays)if(a.layers.overlays[g]===b){f=c.overlays[g];break}e.hasLayer(f)&&(f.setOpacity&&f.setOpacity(d/100),f.getLayers&&f.eachLayer&&f.eachLayer(function(a){a.setOpacity&&a.setOpacity(d/100)}))})})},changeGroupVisibility:function(b){if(g(a.groupProperties[b])){var c=a.groupProperties[b].visible;for(var d in a.layers.overlays){var e=a.layers.overlays[d];e.group===b&&(e.visible=c)}}}});var h=b.get(0);L.Browser.touch?L.DomEvent.on(h,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(h),L.DomEvent.on(h,"mousewheel",L.DomEvent.stopPropagation))}],template:'

{{ title }}

{{ baseTitle }}
{{ overlaysTitle }}
Range is not supported in this browser
',link:function(a,b,e,f){var g=d.isDefined,h=f.getLeafletScope(),i=h.layers;a.$watch("icons",function(){var b={uncheck:"fa fa-square-o",check:"fa fa-check-square-o",radio:"fa fa-dot-circle-o",unradio:"fa fa-circle-o",up:"fa fa-angle-up",down:"fa fa-angle-down",open:"fa fa-angle-double-down",close:"fa fa-angle-double-up",toggleLegend:"fa fa-pencil-square-o"};g(a.icons)?(angular.extend(b,a.icons), +angular.extend(a.icons,b)):a.icons=b}),e.order=!g(e.order)||"normal"!==e.order&&"reverse"!==e.order?"normal":e.order,a.order="normal"===e.order,a.orderNumber="normal"===e.order?-1:1,a.layers=i,f.getMap().then(function(b){h.$watch("layers.baselayers",function(d){var e={};c.getLayers().then(function(c){var f;for(f in d){var g=d[f];g.icon=a.icons[b.hasLayer(c.baselayers[f])?"radio":"unradio"],e[f]=g}a.baselayersArray=e})}),h.$watch("layers.overlays",function(b){var d=[],e={};c.getLayers().then(function(c){var f;for(f in b){var h=b[f];h.icon=a.icons[h.visible?"check":"uncheck"],d.push(h),g(a.layerProperties[h.name])||(a.layerProperties[h.name]={opacity:g(h.layerOptions.opacity)?100*h.layerOptions.opacity:100,opacityControl:!1,showLegend:!0}),g(h.group)&&(g(a.groupProperties[h.group])||(a.groupProperties[h.group]={visible:!1}),e[h.group]=g(e[h.group])?e[h.group]:{count:0,visibles:0},e[h.group].count++,h.visible&&e[h.group].visibles++),g(h.index)&&c.overlays[f].setZIndex&&c.overlays[f].setZIndex(b[f].index)}for(f in e)a.groupProperties[f].visible=e[f].visibles===e[f].count;a.overlaysArray=d})},!0)})}}}]),angular.module("leaflet-directive").directive("lfLayers",["leafletLogger","$q","leafletData","leafletHelpers","leafletLayerHelpers","leafletControlHelpers",function(a,b,c,d,e,f){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",controller:["$scope",function(a){a._leafletLayers=b.defer(),this.getLayers=function(){return a._leafletLayers.promise}}],link:function(a,b,g,h){var i=d.isDefined,j={},k=h.getLeafletScope(),l=k.layers,m=e.createLayer,n=e.safeAddLayer,o=e.safeRemoveLayer,p=f.updateLayersControl,q=!1;h.getMap().then(function(b){a._leafletLayers.resolve(j),c.setLayers(j,g.id),j.baselayers={},j.overlays={};var d=g.id,e=!1;for(var f in l.baselayers){var h=m(l.baselayers[f]);i(h)?(j.baselayers[f]=h,l.baselayers[f].top===!0&&(n(b,j.baselayers[f]),e=!0)):delete l.baselayers[f]}!e&&Object.keys(j.baselayers).length>0&&n(b,j.baselayers[Object.keys(l.baselayers)[0]]);for(f in l.overlays){var r=m(l.overlays[f]);i(r)?(j.overlays[f]=r,l.overlays[f].visible===!0&&n(b,j.overlays[f])):delete l.overlays[f]}k.$watch("layers.baselayers",function(a,c){if(angular.equals(a,c))return q=p(b,d,q,a,l.overlays,j),!0;for(var e in j.baselayers)(!i(a[e])||a[e].doRefresh)&&(b.hasLayer(j.baselayers[e])&&b.removeLayer(j.baselayers[e]),delete j.baselayers[e],a[e]&&a[e].doRefresh&&(a[e].doRefresh=!1));for(var f in a)if(i(j.baselayers[f]))a[f].top!==!0||b.hasLayer(j.baselayers[f])?a[f].top===!1&&b.hasLayer(j.baselayers[f])&&b.removeLayer(j.baselayers[f]):n(b,j.baselayers[f]);else{var g=m(a[f]);i(g)&&(j.baselayers[f]=g,a[f].top===!0&&n(b,j.baselayers[f]))}var h=!1;for(var k in j.baselayers)if(b.hasLayer(j.baselayers[k])){h=!0;break}!h&&Object.keys(j.baselayers).length>0&&n(b,j.baselayers[Object.keys(j.baselayers)[0]]),q=p(b,d,q,a,l.overlays,j)},!0),k.$watch("layers.overlays",function(a,c){if(angular.equals(a,c))return q=p(b,d,q,l.baselayers,a,j),!0;for(var e in j.overlays)if(!i(a[e])||a[e].doRefresh){if(b.hasLayer(j.overlays[e])){var f=i(a[e])?a[e].layerOptions:null;o(b,j.overlays[e],f)}delete j.overlays[e],a[e]&&a[e].doRefresh&&(a[e].doRefresh=!1)}for(var g in a){if(i(j.overlays[g]))a[g].visible&&!b.hasLayer(j.overlays[g])?n(b,j.overlays[g]):a[g].visible===!1&&b.hasLayer(j.overlays[g])&&o(b,j.overlays[g],a[g].layerOptions);else{var h=m(a[g]);if(!i(h))continue;j.overlays[g]=h,a[g].visible===!0&&n(b,j.overlays[g])}a[g].visible&&b._loaded&&a[g].data&&"heatmap"===a[g].type&&(j.overlays[g].setData(a[g].data),j.overlays[g].update())}q=p(b,d,q,l.baselayers,a,j)},!0)})}}}]),angular.module("leaflet-directive").directive("lfLegend",["leafletLogger","$http","leafletHelpers","leafletLegendHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i,j,k,l,m=c.isArray,n=c.isDefined,o=c.isFunction,p=h.getLeafletScope(),q=p.legend;p.$watch("legend",function(a){n(a)&&(i=a.legendClass?a.legendClass:"legend",j=a.position||"bottomright",l=a.type||"arcgis")},!0),h.getMap().then(function(c){p.$watch("legend",function(b){return n(b)?n(b.url)||"arcgis"!==l||m(b.colors)&&m(b.labels)&&b.colors.length===b.labels.length?n(b.url)?void a.info("loading legend service.","legend"):(n(k)&&(k.removeFrom(c),k=null),k=L.control({position:j}),"arcgis"===l&&(k.onAdd=d.getOnAddArrayLegend(b,i)),void k.addTo(c)):void a.warn("legend.colors and legend.labels must be set.","legend"):void(n(k)&&(k.removeFrom(c),k=null))}),p.$watch("legend.url",function(e){n(e)&&b.get(e).success(function(a){n(k)?d.updateLegend(k.getContainer(),a,l,e):(k=L.control({position:j}),k.onAdd=d.getOnAddLegend(a,i,l,e),k.addTo(c)),n(q.loadedData)&&o(q.loadedData)&&q.loadedData()}).error(function(){a.warn("legend.url not loaded.","legend")})})})}}}]),angular.module("leaflet-directive").directive("lfMarkers",["leafletLogger","$rootScope","$q","leafletData","leafletHelpers","leafletMapDefaults","leafletMarkersHelpers","leafletMarkerEvents","leafletIterators","leafletWatchHelpers","leafletDirectiveControlsHelpers",function(a,b,c,d,e,f,g,h,i,j,k){var l=e.isDefined,m=e,n=e.isString,o=g.addMarkerWatcher,p=g.updateMarker,q=g.listenMarkerEvents,r=g.addMarkerToGroup,s=g.createMarker,t=g.deleteMarker,u=i,v=e.watchOptions,w=j.maybeWatch,x=k.extend,y=function(a,b,c){if(Object.keys(a).length){if(c&&n(c)){if(!a[c]||!Object.keys(a[c]).length)return;return a[c][b]}return a[b]}},z=function(a,b,c,d){return d&&n(d)?(l(b[d])||(b[d]={}),b[d][c]=a):b[c]=a,a},A=function(b,c,d,e,f,g){if(!n(b))return a.error("A layername must be a string","markers"),!1;if(!l(c))return a.error("You must add layers to the directive if the markers are going to use this functionality.","markers"),!1;if(!l(c.overlays)||!l(c.overlays[b]))return a.error('A marker can only be added to a layer of type "group"',"markers"),!1;var h=c.overlays[b];return h instanceof L.LayerGroup||h instanceof L.FeatureGroup?(h.addLayer(e),!f&&g.hasLayer(e)&&d.focus===!0&&e.openPopup(),!0):(a.error('Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"',"markers"),!1)},B=function(b,c,d,e,f,g,i,j,k,n){for(var t in c)if(!n[t])if(-1===t.search("-")){var u=m.copy(c[t]),v=m.getObjectDotPath(k?[k,t]:[t]),w=y(g,t,k);if(l(w)){var x=l(x)?d[t]:void 0;p(u,x,w,v,i,f,e)}else{var B=s(u),C=(u?u.layer:void 0)||k;if(!l(B)){a.error("Received invalid data on the marker "+t,"markers");continue}if(z(B,g,t,k),l(u.message)&&B.bindPopup(u.message,u.popupOptions),l(u.group)){var D=l(u.groupOption)?u.groupOption:null;r(B,u.group,D,e)}if(m.LabelPlugin.isLoaded()&&l(u.label)&&l(u.label.message)&&B.bindLabel(u.label.message,u.label.options),l(u)&&(l(u.layer)||l(k))){var E=A(C,f,u,B,j.individual.doWatch,e);if(!E)continue}else l(u.group)||(e.addLayer(B),j.individual.doWatch||u.focus!==!0||B.openPopup());j.individual.doWatch&&o(B,v,i,f,e,j.individual.isDeep),q(B,u,i,j.individual.doWatch,e),h.bindEvents(b,B,v,u,i,C)}}else a.error('The marker can\'t use a "-" on his key name: "'+t+'".',"markers")},C=function(a,b,c,d,e){var f,g,h=!1,i=!1,j=l(b);for(var k in c)h||(h=!0),j&&(g=a[k],f=b[k],i=angular.equals(g,f)&&d),l(a)&&Object.keys(a).length&&l(a[k])&&Object.keys(a[k]).length&&!i||e&&m.isFunction(e)&&e(g,f,k)},D=function(b,c,d,e,f){C(b,c,d,!1,function(b,c,g){a.debug("Deleting marker: "+g,"markers"),t(d[g],e,f),delete d[g]})},E=function(b,c,d){var e={};return C(b,c,d,!0,function(b,c,d){a.debug("Already rendered marker: "+d,"markers"),e[d]=b}),e};return{restrict:"A",scope:!1,replace:!1,require:["leaflet","?lfLayers"],link:function(a,b,e,f){var g=f[0],h=g.getLeafletScope();g.getMap().then(function(a){var b,g={};b=l(f[1])?f[1].getLayers:function(){var a=c.defer();return a.resolve(),a.promise};var i=h.markersWatchOptions||v;l(e.watchMarkers)&&(i.doWatch=i.individual.doWatch=!l(e.watchMarkers)||m.isTruthy(e.watchMarkers));var j=l(e.markersNested)&&m.isTruthy(e.markersNested);b().then(function(b){var c=function(c,d){return j?void u.each(c,function(c,e){var f=l(f)?d[e]:void 0;D(c,f,g[e],a,b)}):void D(c,d,g,a,b)},f=function(d,f){c(d,f);var k=null;return j?void u.each(d,function(c,j){var m=l(m)?f[j]:void 0;k=E(d[j],m,g[j]),B(e.id,c,f,a,b,g,h,i,j,k)}):(k=E(d,f,g),void B(e.id,d,f,a,b,g,h,i,void 0,k))};x(e.id,"markers",f,c),d.setMarkers(g,e.id),w(h,"markers",i,function(a,b){f(a,b)})})})}}}]),angular.module("leaflet-directive").directive("lfMaxbounds",["leafletLogger","leafletMapDefaults","leafletBoundsHelpers","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(a,b,e,f){var g=f.getLeafletScope(),h=c.isValidBounds,i=d.isNumber;f.getMap().then(function(a){g.$watch("maxbounds",function(b){if(!h(b))return void a.setMaxBounds();var d=c.createLeafletBounds(b);i(b.pad)&&(d=d.pad(b.pad)),a.setMaxBounds(d),e.center||e.lfCenter||a.fitBounds(d)})})}}}]),angular.module("leaflet-directive").directive("lfPaths",["leafletLogger","$q","leafletData","leafletMapDefaults","leafletHelpers","leafletPathsHelpers","leafletPathEvents",function(a,b,c,d,e,f,g){return{restrict:"A",scope:!1,replace:!1,require:["leaflet","?lfLayers"],link:function(h,i,j,k){var l=k[0],m=e.isDefined,n=e.isString,o=l.getLeafletScope(),p=o.paths,q=f.createPath,r=g.bindPathEvents,s=f.setPathOptions;l.getMap().then(function(f){var g,h=d.getDefaults(j.id);g=m(k[1])?k[1].getLayers:function(){var a=b.defer();return a.resolve(),a.promise},m(p)&&g().then(function(b){var d={};c.setPaths(d,j.id);var g=!m(j.watchPaths)||"true"===j.watchPaths,i=function(a,c){var d=o.$watch('paths["'+c+'"]',function(c,e){if(!m(c)){if(m(e.layer))for(var g in b.overlays){var h=b.overlays[g];h.removeLayer(a)}return f.removeLayer(a),void d()}s(a,c.type,c)},!0)};o.$watchCollection("paths",function(c){for(var k in d)m(c[k])||(f.removeLayer(d[k]),delete d[k]);for(var l in c)if(0!==l.search("\\$"))if(-1===l.search("-")){if(!m(d[l])){var p=c[l],t=q(l,c[l],h);if(m(t)&&m(p.message)&&t.bindPopup(p.message,p.popupOptions),e.LabelPlugin.isLoaded()&&m(p.label)&&m(p.label.message)&&t.bindLabel(p.label.message,p.label.options),m(p)&&m(p.layer)){if(!n(p.layer)){a.error("A layername must be a string","paths");continue}if(!m(b)){a.error("You must add layers to the directive if the markers are going to use this functionality","paths");continue}if(!m(b.overlays)||!m(b.overlays[p.layer])){a.error('A path can only be added to a layer of type "group"',"paths");continue}var u=b.overlays[p.layer];if(!(u instanceof L.LayerGroup||u instanceof L.FeatureGroup)){a.error('Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"',"paths");continue}d[l]=t,u.addLayer(t),g?i(t,l):s(t,p.type,p)}else m(t)&&(d[l]=t,f.addLayer(t),g?i(t,l):s(t,p.type,p));r(j.id,t,l,p,o)}}else a.error('The path name "'+l+'" is not valid. It must not include "-" and a number.',"paths")})})})}}}]),angular.module("leaflet-directive").directive("lfTiles",["leafletLogger","leafletData","leafletMapDefaults","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i=d.isDefined,j=h.getLeafletScope(),k=j.tiles;return i(k)&&i(k.url)?void h.getMap().then(function(a){var d,e=c.getDefaults(g.id);j.$watch("tiles",function(c,f){var h=e.tileLayerOptions,j=e.tileLayer;return!i(c.url)&&i(d)?void a.removeLayer(d):i(d)?!i(c.url)||!i(c.options)||c.type===f.type&&angular.equals(c.options,h)?void(i(c.url)&&d.setUrl(c.url)):(a.removeLayer(d),h=e.tileLayerOptions,angular.copy(c.options,h),j=c.url,d="wms"===c.type?L.tileLayer.wms(j,h):L.tileLayer(j,h),d.addTo(a),void b.setTiles(d,g.id)):(i(c.options)&&angular.copy(c.options,h),i(c.url)&&(j=c.url),d="wms"===c.type?L.tileLayer.wms(j,h):L.tileLayer(j,h),d.addTo(a),void b.setTiles(d,g.id))},!0)}):void a.warn("[AngularJS - Leaflet] The 'tiles' definition doesn't have the 'url' property.","tiles")}}}]),["markers","geojson"].forEach(function(a){angular.module("leaflet-directive").directive(a+"WatchOptions",["leafletLogger","$rootScope","$q","leafletData","leafletHelpers",function(b,c,d,e,f){var g=f.isDefined,h=f.isObject,i=f.watchOptions;return{restrict:"A",scope:!1,replace:!1,require:["leaflet"],link:function(c,d,e,f){var j=f[0],k=j.getLeafletScope();j.getMap().then(function(){g(c[a+"WatchOptions"])&&(h(c[a+"WatchOptions"])?angular.extend(i,c[a+"WatchOptions"]):b.error("is not an object","watch options"),k[a+"WatchOptions"]=i)})}}}])}),angular.module("leaflet-directive").factory("LeafletEventsHelpersFactory",["$rootScope","$q","leafletLogger","leafletHelpers",function(a,b,c,d){var e=d.safeApply,f=d.isDefined,g=d.isObject,h=d.isArray,i=function(a,b){this.rootBroadcastName=a,this.lObjectType=b};return i.prototype.getAvailableEvents=function(){return[]},i.prototype.genDispatchEvent=function(a,b,c,d,e,f,g,h,i){var j=this;return a=a||"",a&&(a="."+a),function(k){var l=j.rootBroadcastName+a+"."+b;j.fire(d,l,c,k,k.target||e,g,f,h,i)}},i.prototype.fire=function(b,c,d,g,h,i,j,k){e(b,function(){var e={leafletEvent:g,leafletObject:h,modelName:j,model:i};f(k)&&angular.extend(e,{layerName:k}),"emit"===d?b.$emit(c,e):a.$broadcast(c,e)})},i.prototype.bindEvents=function(a,b,d,e,i,j,k){var l=[],m="emit",n=this;if(f(i.eventBroadcast))if(g(i.eventBroadcast))if(f(i.eventBroadcast[n.lObjectType]))if(g(i.eventBroadcast[n.lObjectType])){f(i.eventBroadcast[this.lObjectType].logic)&&"emit"!==i.eventBroadcast[n.lObjectType].logic&&"broadcast"!==i.eventBroadcast[n.lObjectType].logic&&c.warn("Available event propagation logic are: 'emit' or 'broadcast'.");var o=!1,p=!1;f(i.eventBroadcast[n.lObjectType].enable)&&h(i.eventBroadcast[n.lObjectType].enable)&&(o=!0),f(i.eventBroadcast[n.lObjectType].disable)&&h(i.eventBroadcast[n.lObjectType].disable)&&(p=!0),o&&p?c.warn("can not enable and disable events at the same time"):o||p?o?i.eventBroadcast[this.lObjectType].enable.forEach(function(a){-1!==l.indexOf(a)?c.warn("This event "+a+" is already enabled"):-1===n.getAvailableEvents().indexOf(a)?c.warn("This event "+a+" does not exist"):l.push(a)}):(l=this.getAvailableEvents(),i.eventBroadcast[n.lObjectType].disable.forEach(function(a){var b=l.indexOf(a);-1===b?c.warn("This event "+a+" does not exist or has been already disabled"):l.splice(b,1)})):c.warn("must enable or disable events")}else c.warn("event-broadcast."+[n.lObjectType]+" must be an object check your model.");else l=this.getAvailableEvents();else c.error("event-broadcast must be an object check your model.");else l=this.getAvailableEvents();return l.forEach(function(c){b.on(c,n.genDispatchEvent(a,c,m,i,b,d,e,j,k))}),m},i}]).service("leafletEventsHelpers",["LeafletEventsHelpersFactory",function(a){return new a}]),angular.module("leaflet-directive").factory("leafletGeoJsonEvents",["$rootScope","$q","leafletLogger","leafletHelpers","LeafletEventsHelpersFactory","leafletData",function(a,b,c,d,e,f){var g=d.safeApply,h=e,i=function(){h.call(this,"leafletDirectiveGeoJson","geojson")};return i.prototype=new h,i.prototype.genDispatchEvent=function(b,c,d,e,i,j,k,l,m){var n=h.prototype.genDispatchEvent.call(this,b,c,d,e,i,j,k,l),o=this;return function(b){"mouseout"===c&&(m.resetStyleOnMouseout&&f.getGeoJSON(m.mapId).then(function(a){var c=l?a[l]:a;c.resetStyle(b.target)}),g(e,function(){a.$broadcast(o.rootBroadcastName+".mouseout",b)})),n(b)}},i.prototype.getAvailableEvents=function(){return["click","dblclick","mouseover","mouseout"]},new i}]),angular.module("leaflet-directive").factory("leafletLabelEvents",["$rootScope","$q","leafletLogger","leafletHelpers","LeafletEventsHelpersFactory",function(a,b,c,d,e){var f=d,g=e,h=function(){g.call(this,"leafletDirectiveLabel","markers")};return h.prototype=new g,h.prototype.genDispatchEvent=function(a,b,c,d,e,f,h,i){var j=f.replace("markers.","");return g.prototype.genDispatchEvent.call(this,a,b,c,d,e,j,h,i)},h.prototype.getAvailableEvents=function(){return["click","dblclick","mousedown","mouseover","mouseout","contextmenu"]},h.prototype.genEvents=function(a,b,c,d,e,g,h,i){var j=this,k=this.getAvailableEvents(),l=f.getObjectArrayPath("markers."+g);k.forEach(function(b){e.label.on(b,j.genDispatchEvent(a,b,c,d,e.label,l,h,i))})},h.prototype.bindEvents=function(){},new h}]),angular.module("leaflet-directive").factory("leafletMapEvents",["$rootScope","$q","leafletLogger","leafletHelpers","leafletEventsHelpers","leafletIterators",function(a,b,c,d,e,f){var g=d.isDefined,h=e.fire,i=function(){return["click","dblclick","mousedown","mouseup","mouseover","mouseout","mousemove","contextmenu","focus","blur","preclick","load","unload","viewreset","movestart","move","moveend","dragstart","drag","dragend","zoomstart","zoomanim","zoomend","zoomlevelschange","resize","autopanstart","layeradd","layerremove","baselayerchange","overlayadd","overlayremove","locationfound","locationerror","popupopen","popupclose","draw:created","draw:edited","draw:deleted","draw:drawstart","draw:drawstop","draw:editstart","draw:editstop","draw:deletestart","draw:deletestop"]},j=function(a,b,c,d){return d&&(d+="."),function(e){var f="leafletDirectiveMap."+d+b;h(a,f,c,e,e.target,a)}},k=function(a){a.$broadcast("boundsChanged")},l=function(a,b,c){var d=b.getCenter(),e=d.lat.toFixed(4)+":"+d.lng.toFixed(4)+":"+b.getZoom();g(c.c)&&c.c===e||a.$emit("centerUrlHash",e)},m=function(a,b,c,d,e){f.each(b,function(b){var f={};f[c]=b,a.on(b,j(d,b,e,a._container.id||""),f)})};return{getAvailableMapEvents:i,genDispatchMapEvent:j,notifyCenterChangedToBounds:k,notifyCenterUrlHashChanged:l,addEvents:m}}]),angular.module("leaflet-directive").factory("leafletMarkerEvents",["$rootScope","$q","leafletLogger","leafletHelpers","LeafletEventsHelpersFactory","leafletLabelEvents",function(a,b,c,d,e,f){var g=d.safeApply,h=d.isDefined,i=d,j=f,k=e,l=function(){k.call(this,"leafletDirectiveMarker","markers")};return l.prototype=new k,l.prototype.genDispatchEvent=function(b,c,d,e,f,h,i,j){var l=k.prototype.genDispatchEvent.call(this,b,c,d,e,f,h,i,j);return function(b){"click"===c?g(e,function(){a.$broadcast("leafletDirectiveMarkersClick",h)}):"dragend"===c&&(g(e,function(){i.lat=f.getLatLng().lat,i.lng=f.getLatLng().lng}),i.message&&i.focus===!0&&f.openPopup()),l(b)}},l.prototype.getAvailableEvents=function(){return["click","dblclick","mousedown","mouseover","mouseout","contextmenu","dragstart","drag","dragend","move","remove","popupopen","popupclose","touchend","touchstart","touchmove","touchcancel","touchleave"]},l.prototype.bindEvents=function(a,b,c,d,e,f){var g=k.prototype.bindEvents.call(this,a,b,c,d,e,f);i.LabelPlugin.isLoaded()&&h(b.label)&&j.genEvents(a,c,g,e,b,d,f)},new l}]),angular.module("leaflet-directive").factory("leafletPathEvents",["$rootScope","$q","leafletLogger","leafletHelpers","leafletLabelEvents","leafletEventsHelpers",function(a,b,c,d,e,f){var g=d.isDefined,h=d.isObject,i=d,j=e,k=f.fire,l=function(a,b,c,d,e,f,g,h){return a=a||"",a&&(a="."+a),function(i){var j="leafletDirectivePath"+a+"."+b;k(d,j,c,i,i.target||e,g,f,h)}},m=function(a,b,d,e,f){var k,m,o=[],p="broadcast";if(g(f.eventBroadcast))if(h(f.eventBroadcast))if(g(f.eventBroadcast.path))if(h(f.eventBroadcast.paths))c.warn("event-broadcast.path must be an object check your model.");else{void 0!==f.eventBroadcast.path.logic&&null!==f.eventBroadcast.path.logic&&("emit"!==f.eventBroadcast.path.logic&&"broadcast"!==f.eventBroadcast.path.logic?c.warn("Available event propagation logic are: 'emit' or 'broadcast'."):"emit"===f.eventBroadcast.path.logic&&(p="emit"));var q=!1,r=!1;if(void 0!==f.eventBroadcast.path.enable&&null!==f.eventBroadcast.path.enable&&"object"==typeof f.eventBroadcast.path.enable&&(q=!0),void 0!==f.eventBroadcast.path.disable&&null!==f.eventBroadcast.path.disable&&"object"==typeof f.eventBroadcast.path.disable&&(r=!0),q&&r)c.warn("can not enable and disable events at the same time");else if(q||r)if(q)for(k=0;k 0) { var resolve = function() { @@ -2174,6 +2196,38 @@ angular.module('leaflet-directive').factory('leafletLegendHelpers', function() { }; }); +angular.module('leaflet-directive').service('leafletLogger', ["$log", function($log) { + var prefix = '[angular-leaflet] '; + + return { + log: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.log(prefix + section + msg); + }, + + debug: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.debug(prefix + section + msg); + }, + + info: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.info(prefix + section + msg); + }, + + warn: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.warn(prefix + section + msg); + }, + + error: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.error(prefix + section + msg); + }, + + }; +}]); + angular.module('leaflet-directive').factory('leafletMapDefaults', ["$q", "leafletHelpers", function($q, leafletHelpers) { function _getDefaults() { return { @@ -2349,7 +2403,7 @@ angular.module('leaflet-directive').factory('leafletMapDefaults', ["$q", "leafle }; }]); -angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScope", "$timeout", "leafletHelpers", "$log", "$compile", "leafletGeoJsonHelpers", function($rootScope, $timeout, leafletHelpers, $log, $compile, leafletGeoJsonHelpers) { +angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScope", "$timeout", "leafletHelpers", "leafletLogger", "$compile", "leafletGeoJsonHelpers", function($rootScope, $timeout, leafletHelpers, leafletLogger, $compile, leafletGeoJsonHelpers) { var isDefined = leafletHelpers.isDefined; var defaultTo = leafletHelpers.defaultTo; var MarkerClusterPlugin = leafletHelpers.MarkerClusterPlugin; @@ -2365,7 +2419,6 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop var isObject = leafletHelpers.isObject; var groups = {}; var geoHlp = leafletGeoJsonHelpers; - var errorHeader = leafletHelpers.errorHeader; var _string = function(marker) { //this exists since JSON.stringify barfs on cyclic @@ -2377,15 +2430,10 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop return '[leafletMarker] : \n' + retStr; }; - var _log = function(marker, useConsole) { - var logger = useConsole ? console : $log; - logger.debug(_string(marker)); - }; - var createLeafletIcon = function(iconData) { if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'awesomeMarker') { if (!AwesomeMarkersPlugin.isLoaded()) { - $log.error(errorHeader + ' The AwesomeMarkers Plugin is not loaded.'); + leafletLogger.error('The AwesomeMarkers Plugin is not loaded.'); } return new L.AwesomeMarkers.icon(iconData); @@ -2393,7 +2441,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'vectorMarker') { if (!VectorMarkersPlugin.isLoaded()) { - $log.error(errorHeader + ' The VectorMarkers Plugin is not loaded.'); + leafletLogger.error('The VectorMarkers Plugin is not loaded.'); } return new L.VectorMarkers.icon(iconData); @@ -2401,7 +2449,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'makiMarker') { if (!MakiMarkersPlugin.isLoaded()) { - $log.error(errorHeader + 'The MakiMarkers Plugin is not loaded.'); + leafletLogger.error('The MakiMarkers Plugin is not loaded.'); } return new L.MakiMarkers.icon(iconData); @@ -2409,7 +2457,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'extraMarker') { if (!ExtraMarkersPlugin.isLoaded()) { - $log.error(errorHeader + 'The ExtraMarkers Plugin is not loaded.'); + leafletLogger.error('The ExtraMarkers Plugin is not loaded.'); } return new L.ExtraMarkers.icon(iconData); @@ -2421,7 +2469,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'dom') { if (!DomMarkersPlugin.isLoaded()) { - $log.error(errorHeader + 'The DomMarkers Plugin is not loaded.'); + leafletLogger.error('The DomMarkers Plugin is not loaded.'); } var markerScope = angular.isFunction(iconData.getMarkerScope) ? iconData.getMarkerScope() : $rootScope; @@ -2539,7 +2587,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop if (compileMessage) { if (!isDefined(marker._popup) || !isDefined(marker._popup._contentNode)) { - $log.error(errorHeader + 'Popup is invalid or does not have any content.'); + leafletLogger.error('Popup is invalid or does not have any content.'); return false; } @@ -2571,7 +2619,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop // Update the lat-lng property (always present in marker properties) if (!geoHlp.validateCoords(markerData)) { - $log.warn('There are problems with lat-lng data, please verify your marker model'); + leafletLogger.warn('There are problems with lat-lng data, please verify your marker model'); _deleteMarker(marker, map, layers); return; } @@ -2622,14 +2670,14 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop // The markerData.layer is defined so we add the marker to the layer if it is different from the old data if (!isDefined(layers.overlays[markerData.layer])) { - $log.error(errorHeader + 'You must use a name of an existing layer'); + leafletLogger.error('You must use a name of an existing layer'); return; } // Is a group layer? var layerGroup = layers.overlays[markerData.layer]; if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { - $log.error(errorHeader + 'A marker can only be added to a layer of type "group" or "featureGroup"'); + leafletLogger.error('A marker can only be added to a layer of type "group" or "featureGroup"'); return; } @@ -2742,7 +2790,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop } // The markerData.focus property must be true so we update if there wasn't a previous value or it wasn't true - if (markerData.focus === true && (!isDefined(oldMarkerData.focus) || oldMarkerData.focus === false) || (isInitializing && markerData.focus === true)) { + if (markerData.focus === true && (markerData.lat !== oldMarkerData.lat || markerData.lng !== oldMarkerData.lng || !isDefined(oldMarkerData.focus) || oldMarkerData.focus === false) || (isInitializing && markerData.focus === true)) { // Reopen the popup when focus is still true marker.openPopup(); updatedFocus = true; @@ -2804,14 +2852,14 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop createMarker: function(markerData) { if (!isDefined(markerData) || !geoHlp.validateCoords(markerData)) { - $log.error(errorHeader + 'The marker definition is not valid.'); + leafletLogger.error('The marker definition is not valid.'); return; } var coords = geoHlp.getCoords(markerData); if (!isDefined(coords)) { - $log.error(errorHeader + 'Unable to get coordinates from markerData.'); + leafletLogger.error('Unable to get coordinates from markerData.'); return; } @@ -2843,12 +2891,12 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop addMarkerToGroup: function(marker, groupName, groupOptions, map) { if (!isString(groupName)) { - $log.error(errorHeader + 'The marker group you have specified is invalid.'); + leafletLogger.error('The marker group you have specified is invalid.'); return; } if (!MarkerClusterPlugin.isLoaded()) { - $log.error(errorHeader + 'The MarkerCluster plugin is not loaded.'); + leafletLogger.error('The MarkerCluster plugin is not loaded.'); return; } @@ -2878,8 +2926,9 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop marker.on('add', function(/* event */) { safeApply(leafletScope, function() { - if ('label' in markerData) - _manageOpenLabel(marker, markerData); + if ('label' in markerData) { + _manageOpenLabel(marker, markerData); + } }); }); }, @@ -2902,11 +2951,10 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', ["$rootScop }, string: _string, - log: _log, }; }]); -angular.module('leaflet-directive').factory('leafletPathsHelpers', ["$rootScope", "$log", "leafletHelpers", function($rootScope, $log, leafletHelpers) { +angular.module('leaflet-directive').factory('leafletPathsHelpers', ["$rootScope", "leafletLogger", "leafletHelpers", function($rootScope, leafletLogger, leafletHelpers) { var isDefined = leafletHelpers.isDefined; var isArray = leafletHelpers.isArray; var isNumber = leafletHelpers.isNumber; @@ -3173,7 +3221,7 @@ angular.module('leaflet-directive').factory('leafletPathsHelpers', ["$rootScope" var pathData = _getPathData(path); if (!pathTypes[path.type].isValid(pathData)) { - $log.error('[AngularJS - Leaflet] Invalid data passed to the ' + path.type + ' path'); + leafletLogger.error('Invalid data passed to the ' + path.type + ' path'); return; } @@ -3189,8 +3237,9 @@ angular.module('leaflet-directive') //watchOptions.isDeep is/should be ignored in $watchCollection var unWatch = scope[watchFunctionName](thingToWatchStr, function(newValue, oldValue) { initCb(newValue, oldValue); - if (!watchOptions.doWatch) - unWatch(); + if (!watchOptions.doWatch) { + unWatch(); + } }, watchOptions.isDeep); return unWatch; @@ -3246,7 +3295,7 @@ angular.module('leaflet-directive').factory('nominatimService', ["$q", "$http", }; }]); -angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$http", "leafletHelpers", "nominatimService", "leafletBoundsHelpers", function($log, $timeout, $http, leafletHelpers, nominatimService, leafletBoundsHelpers) { +angular.module('leaflet-directive').directive('lfBounds', ["leafletLogger", "$timeout", "$http", "leafletHelpers", "nominatimService", "leafletBoundsHelpers", function(leafletLogger, $timeout, $http, leafletHelpers, nominatimService, leafletBoundsHelpers) { return { restrict: 'A', @@ -3259,7 +3308,6 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h var createLeafletBounds = leafletBoundsHelpers.createLeafletBounds; var leafletScope = controller[0].getLeafletScope(); var mapController = controller[0]; - var errorHeader = leafletHelpers.errorHeader + ' [Bounds] '; var emptyBounds = function(bounds) { return (bounds._southWest.lat === 0 && bounds._southWest.lng === 0 && @@ -3298,8 +3346,10 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h var lastNominatimQuery; leafletScope.$watch('bounds', function(bounds) { - if (scope.settingBoundsFromLeaflet) - return; + if (scope.settingBoundsFromLeaflet) { + return; + } + if (isDefined(bounds.address) && bounds.address !== lastNominatimQuery) { scope.settingBoundsFromScope = true; nominatimService.query(bounds.address, attrs.id).then(function(data) { @@ -3308,7 +3358,7 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h map.fitBounds(newBounds); }, function(errMsg) { - $log.error(errorHeader + ' ' + errMsg + '.'); + leafletLogger.error(errMsg, 'bounds'); }); lastNominatimQuery = bounds.address; @@ -3333,239 +3383,224 @@ angular.module('leaflet-directive').directive('bounds', ["$log", "$timeout", "$h }; }]); -var centerDirectiveTypes = ['center', 'lfCenter']; -var centerDirectives = {}; - -centerDirectiveTypes.forEach(function(directiveName) { - centerDirectives[directiveName] = ['$log', '$q', '$location', '$timeout', 'leafletMapDefaults', 'leafletHelpers', - 'leafletBoundsHelpers', 'leafletMapEvents', - function($log, $q, $location, $timeout, leafletMapDefaults, leafletHelpers, - leafletBoundsHelpers, leafletMapEvents) { +angular.module('leaflet-directive').directive('lfCenter', ["leafletLogger", "$q", "$location", "$timeout", "leafletMapDefaults", "leafletHelpers", "leafletBoundsHelpers", "leafletMapEvents", function(leafletLogger, $q, $location, $timeout, leafletMapDefaults, leafletHelpers, leafletBoundsHelpers, leafletMapEvents) { + var isDefined = leafletHelpers.isDefined; + var isNumber = leafletHelpers.isNumber; + var isSameCenterOnMap = leafletHelpers.isSameCenterOnMap; + var safeApply = leafletHelpers.safeApply; + var isValidCenter = leafletHelpers.isValidCenter; + var isValidBounds = leafletBoundsHelpers.isValidBounds; + var isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty; - var isDefined = leafletHelpers.isDefined; - var isNumber = leafletHelpers.isNumber; - var isSameCenterOnMap = leafletHelpers.isSameCenterOnMap; - var safeApply = leafletHelpers.safeApply; - var isValidCenter = leafletHelpers.isValidCenter; - var isValidBounds = leafletBoundsHelpers.isValidBounds; - var isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty; - var errorHeader = leafletHelpers.errorHeader; + var shouldInitializeMapWithBounds = function(bounds, center) { + return isDefined(bounds) && isValidBounds(bounds) && isUndefinedOrEmpty(center); + }; - var shouldInitializeMapWithBounds = function(bounds, center) { - return isDefined(bounds) && isValidBounds(bounds) && isUndefinedOrEmpty(center); + var _leafletCenter; + return { + restrict: 'A', + scope: false, + replace: false, + require: 'leaflet', + controller: function() { + _leafletCenter = $q.defer(); + this.getCenter = function() { + return _leafletCenter.promise; }; + }, - var _leafletCenter; - return { - restrict: 'A', - scope: false, - replace: false, - require: 'leaflet', - controller: function() { - _leafletCenter = $q.defer(); - this.getCenter = function() { - return _leafletCenter.promise; - }; - }, + link: function(scope, element, attrs, controller) { + var leafletScope = controller.getLeafletScope(); - link: function(scope, element, attrs, controller) { - var leafletScope = controller.getLeafletScope(); - var centerModel = leafletScope[directiveName]; + if (!isDefined(leafletScope.center)) { + leafletLogger.error('The scope "center" variable is not defined', 'center'); + leafletScope.center = {}; + } - controller.getMap().then(function(map) { - var defaults = leafletMapDefaults.getDefaults(attrs.id); + var centerModel = leafletScope.center; + controller.getMap().then(function(map) { + var defaults = leafletMapDefaults.getDefaults(attrs.id); - if (attrs[directiveName].search('-') !== -1) { - $log.error(errorHeader + ' The "center" variable can\'t use a "-" on its key name: "' + attrs[directiveName] + '".'); - map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - return; - } else if (shouldInitializeMapWithBounds(leafletScope.bounds, centerModel)) { - map.fitBounds(leafletBoundsHelpers.createLeafletBounds(leafletScope.bounds), leafletScope.bounds.options); - centerModel = map.getCenter(); - safeApply(leafletScope, function(scope) { - angular.extend(scope[directiveName], { - lat: map.getCenter().lat, - lng: map.getCenter().lng, - zoom: map.getZoom(), - autoDiscover: false, - }); - }); + if (attrs.lfCenter.search('-') !== -1) { + leafletLogger.error('The "center" variable can\'t use a "-" on its key name: "' + attrs.lfCenter, 'center'); + map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + return; + } else if (shouldInitializeMapWithBounds(leafletScope.bounds, centerModel)) { + map.fitBounds(leafletBoundsHelpers.createLeafletBounds(leafletScope.bounds), leafletScope.bounds.options); + safeApply(leafletScope, function(scope) { + angular.extend(scope.center, { + lat: map.getCenter().lat, + lng: map.getCenter().lng, + zoom: map.getZoom(), + autoDiscover: false, + }); + }); - safeApply(leafletScope, function(scope) { - var mapBounds = map.getBounds(); - scope.bounds = { - northEast: { - lat: mapBounds._northEast.lat, - lng: mapBounds._northEast.lng, - }, - southWest: { - lat: mapBounds._southWest.lat, - lng: mapBounds._southWest.lng, - }, + safeApply(leafletScope, function(scope) { + var mapBounds = map.getBounds(); + scope.bounds = { + northEast: { + lat: mapBounds._northEast.lat, + lng: mapBounds._northEast.lng, + }, + southWest: { + lat: mapBounds._southWest.lat, + lng: mapBounds._southWest.lng, + }, + }; + }); + } else if (!isDefined(centerModel)) { + leafletLogger.error('The "center" property is not defined in the main scope', 'center'); + map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + return; + } else if (!(isDefined(centerModel.lat) && isDefined(centerModel.lng)) && !isDefined(centerModel.autoDiscover)) { + angular.copy(defaults.center, centerModel); + } + + var urlCenterHash; + var mapReady; + if (centerModel.allowUrlHashCenter === true) { + var extractCenterFromUrl = function() { + var search = $location.search(); + var centerParam; + if (isDefined(search.c)) { + var cParam = search.c.split(':'); + if (cParam.length === 3) { + centerParam = { + lat: parseFloat(cParam[0]), + lng: parseFloat(cParam[1]), + zoom: parseInt(cParam[2], 10), + allowUrlHashCenter: centerModel.allowUrlHashCenter, }; - }); - } else if (!isDefined(centerModel)) { - $log.error(errorHeader + ' The "center" property is not defined in the main scope'); - map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - return; - } else if (!(isDefined(centerModel.lat) && isDefined(centerModel.lng)) && !isDefined(centerModel.autoDiscover)) { - angular.copy(defaults.center, centerModel); + } } - var urlCenterHash; - var mapReady; - if (attrs.urlHashCenter === 'yes') { - var extractCenterFromUrl = function() { - var search = $location.search(); - var centerParam; - if (isDefined(search.c)) { - var cParam = search.c.split(':'); - if (cParam.length === 3) { - centerParam = { - lat: parseFloat(cParam[0]), - lng: parseFloat(cParam[1]), - zoom: parseInt(cParam[2], 10), - }; - } - } - - return centerParam; - }; + return centerParam; + }; - urlCenterHash = extractCenterFromUrl(); + urlCenterHash = extractCenterFromUrl(); - leafletScope.$on('$locationChangeSuccess', function(event) { - var scope = event.currentScope; + leafletScope.$on('$locationChangeSuccess', function(event) { + var scope = event.currentScope; - //$log.debug("updated location..."); - var urlCenter = extractCenterFromUrl(); - if (isDefined(urlCenter) && !isSameCenterOnMap(urlCenter, map)) { - //$log.debug("updating center model...", urlCenter); - angular.extend(scope[directiveName], { - lat: urlCenter.lat, - lng: urlCenter.lng, - zoom: urlCenter.zoom, - }); - } + var urlCenter = extractCenterFromUrl(); + if (isDefined(urlCenter) && !isSameCenterOnMap(urlCenter, map)) { + angular.extend(scope.center, { + lat: urlCenter.lat, + lng: urlCenter.lng, + zoom: urlCenter.zoom, + allowUrlHashCenter: centerModel.allowUrlHashCenter, }); } + }); + } - leafletScope.$watch(directiveName, function(center) { - if (leafletScope.settingCenterFromLeaflet) - return; + leafletScope.$watch('center', function(center) { + if (leafletScope.settingCenterFromLeaflet) { + return; + } - //$log.debug("updated center model..."); - // The center from the URL has priority - if (isDefined(urlCenterHash)) { - angular.copy(urlCenterHash, center); - urlCenterHash = undefined; - } + // The center from the URL has priority + if (isDefined(urlCenterHash)) { + angular.copy(urlCenterHash, center); + urlCenterHash = undefined; + } - if (!isValidCenter(center) && center.autoDiscover !== true) { - $log.warn(errorHeader + ' invalid \'center\''); + if (!isValidCenter(center) && center.autoDiscover !== true) { + leafletLogger.warn(' invalid \'center\'', 'center'); - //map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - return; - } + //map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + return; + } - if (center.autoDiscover === true) { - if (!isNumber(center.zoom)) { - map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - } + if (center.autoDiscover === true) { + if (!isNumber(center.zoom)) { + map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + } - if (isNumber(center.zoom) && center.zoom > defaults.center.zoom) { - map.locate({ - setView: true, - maxZoom: center.zoom, - }); - } else if (isDefined(defaults.maxZoom)) { - map.locate({ - setView: true, - maxZoom: defaults.maxZoom, - }); - } else { - map.locate({ - setView: true, - }); - } + if (isNumber(center.zoom) && center.zoom > defaults.center.zoom) { + map.locate({ + setView: true, + maxZoom: center.zoom, + }); + } else if (isDefined(defaults.maxZoom)) { + map.locate({ + setView: true, + maxZoom: defaults.maxZoom, + }); + } else { + map.locate({ + setView: true, + }); + } - return; - } + return; + } - if (mapReady && isSameCenterOnMap(center, map)) { - //$log.debug("no need to update map again."); - return; - } + if (mapReady && isSameCenterOnMap(center, map)) { + return; + } - //$log.debug("updating map center...", center); - leafletScope.settingCenterFromScope = true; - map.setView([center.lat, center.lng], center.zoom); - leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); - $timeout(function() { + leafletScope.settingCenterFromScope = true; + map.setView([center.lat, center.lng], center.zoom); + leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); + $timeout(function() { leafletScope.settingCenterFromScope = false; - - //$log.debug("allow center scope updates"); }); - }, true); + }, true); - map.whenReady(function() { - mapReady = true; - }); + map.whenReady(function() { + mapReady = true; + }); - map.on('moveend', function(/* event */) { - // Resolve the center after the first map position - _leafletCenter.resolve(); - leafletMapEvents.notifyCenterUrlHashChanged(leafletScope, map, attrs, $location.search()); + map.on('moveend', function(/* event */) { + // Resolve the center after the first map position + _leafletCenter.resolve(); - //$log.debug("updated center on map..."); - if (isSameCenterOnMap(centerModel, map) || leafletScope.settingCenterFromScope) { - //$log.debug("same center in model, no need to update again."); - return; - } + if (centerModel.allowUrlHashCenter === true) { + leafletMapEvents.notifyCenterUrlHashChanged(leafletScope, map, $location.search()); + } - leafletScope.settingCenterFromLeaflet = true; - safeApply(leafletScope, function(scope) { - if (!leafletScope.settingCenterFromScope) { - //$log.debug("updating center model...", map.getCenter(), map.getZoom()); - angular.extend(scope[directiveName], { - lat: map.getCenter().lat, - lng: map.getCenter().lng, - zoom: map.getZoom(), - autoDiscover: false, - }); - } + if (isSameCenterOnMap(centerModel, map) || leafletScope.settingCenterFromScope) { + return; + } - leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); - $timeout(function() { - leafletScope.settingCenterFromLeaflet = false; - }); + leafletScope.settingCenterFromLeaflet = true; + safeApply(leafletScope, function(scope) { + if (!leafletScope.settingCenterFromScope) { + angular.extend(scope.center, { + lat: map.getCenter().lat, + lng: map.getCenter().lng, + zoom: map.getZoom(), + autoDiscover: false, }); + } + + leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); + $timeout(function() { + leafletScope.settingCenterFromLeaflet = false; }); + }); + }); - if (centerModel.autoDiscover === true) { - map.on('locationerror', function() { - $log.warn(errorHeader + ' The Geolocation API is unauthorized on this page.'); - if (isValidCenter(centerModel)) { - map.setView([centerModel.lat, centerModel.lng], centerModel.zoom); - leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); - } else { - map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); - } - }); + if (centerModel.autoDiscover === true) { + map.on('locationerror', function() { + leafletLogger.warn('The Geolocation API is unauthorized on this page.', 'center'); + if (isValidCenter(centerModel)) { + map.setView([centerModel.lat, centerModel.lng], centerModel.zoom); + leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); + } else { + map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); } }); - }, - }; + } + }); }, - ]; -}); - -centerDirectiveTypes.forEach(function(dirType) { - angular.module('leaflet-directive').directive(dirType, centerDirectives[dirType]); -}); + }; +}]); -angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpers", "leafletControlHelpers", function($log, leafletHelpers, leafletControlHelpers) { +angular.module('leaflet-directive').directive('lfControls', ["leafletLogger", "leafletHelpers", "leafletControlHelpers", function(leafletLogger, leafletHelpers, leafletControlHelpers) { return { restrict: 'A', @@ -3584,7 +3619,6 @@ angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpe var isDefined = leafletHelpers.isDefined; var isArray = leafletHelpers.isArray; var leafletControls = {}; - var errorHeader = leafletHelpers.errorHeader + ' [Controls] '; controller.getMap().then(function(map) { @@ -3607,7 +3641,7 @@ angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpe var controlType = isDefined(newControls[newName].type) ? newControls[newName].type : newName; if (!isValidControlType(controlType)) { - $log.error(errorHeader + ' Invalid control type: ' + controlType + '.'); + leafletLogger.error(' Invalid control type: ' + controlType, 'controls'); return; } @@ -3637,7 +3671,16 @@ angular.module('leaflet-directive').directive('controls', ["$log", "leafletHelpe }; }]); -angular.module('leaflet-directive').directive('decorations', ["$log", "leafletHelpers", function($log, leafletHelpers) { +angular.module('leaflet-directive').directive('decorations', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "decorations" markup code is deprecated now. Please ' + + 'update your HTML with "lf-decorations" markup attributes.', 'decorations'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('lfDecorations', ["leafletLogger", "leafletHelpers", function(leafletLogger, leafletHelpers) { return { restrict: 'A', @@ -3655,7 +3698,7 @@ angular.module('leaflet-directive').directive('decorations', ["$log", "leafletHe function createDecoration(options) { if (isDefined(options) && isDefined(options.coordinates)) { if (!PolylineDecoratorPlugin.isLoaded()) { - $log.error('[AngularJS - Leaflet] The PolylineDecorator Plugin is not loaded.'); + leafletLogger.error('The PolylineDecorator Plugin is not loaded.', 'decorations'); } } @@ -3698,7 +3741,115 @@ angular.module('leaflet-directive').directive('decorations', ["$log", "leafletHe }; }]); -angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootScope", "leafletHelpers", "leafletMapEvents", "leafletIterators", function($log, $rootScope, leafletHelpers, leafletMapEvents, leafletIterators) { +angular.module('leaflet-directive').directive('maxbounds', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "maxbounds" markup code is deprecated now. Please ' + + 'update your HTML with "lf-maxbounds" markup attributes.', 'maxbounds'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('defaults', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "defaults" markup code is deprecated now. Please ' + + 'update your HTML with "lf-defaults" markup attributes.', 'defaults'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('bounds', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "bounds" markup code is deprecated now. Please ' + + 'update your HTML with "lf-bounds" markup attributes.', 'bounds'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('controls', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "controls" markup code is deprecated now. Please ' + + 'update your HTML with "lf-controls" markup attributes.', 'controls'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('center', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "center" markup code is deprecated now. Please ' + + 'update your HTML with "lf-center" markup attributes.', 'center'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('paths', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "paths" markup code is deprecated now. Please ' + + 'update your HTML with "lf-paths" markup attributes.', 'paths'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('tiles', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "tiles" markup code is deprecated now. Please ' + + 'update your HTML with "lf-tiles" markup attributes.', 'tiles'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('markers', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "markers" markup code is deprecated now. Please ' + + 'update your HTML with "lf-markers" markup attributes.', 'markers'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('eventBroadcast', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "event-broadcast" markup code is deprecated now. Please ' + + 'update your HTML with "lf-events" markup attributes.', 'events'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('geojson', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "geojson" markup code is deprecated now. Please ' + + 'update your HTML with "lf-geojson" markup attributes.', 'geojson'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('layers', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "layers" markup code is deprecated now. Please ' + + 'update your HTML with "lf-layers" markup attributes.', 'layers'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('markers', ["leafletLogger", function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "markers" markup code is deprecated now. Please ' + + 'update your HTML with "lf-markers" markup attributes.', 'markers'); + }, + }; +}]); + +angular.module('leaflet-directive').directive('lfEvents', ["leafletLogger", "$rootScope", "leafletHelpers", "leafletMapEvents", "leafletIterators", function(leafletLogger, $rootScope, leafletHelpers, leafletMapEvents, leafletIterators) { return { restrict: 'A', @@ -3710,7 +3861,7 @@ angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootS var isObject = leafletHelpers.isObject; var isDefined = leafletHelpers.isDefined; var leafletScope = controller.getLeafletScope(); - var eventBroadcast = leafletScope.eventBroadcast; + var eventBroadcast = leafletScope.lfEvents; var availableMapEvents = leafletMapEvents.getAvailableMapEvents(); var addEvents = leafletMapEvents.addEvents; @@ -3720,24 +3871,24 @@ angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootS var logic = 'broadcast'; // We have a possible valid object - if (!isDefined(eventBroadcast.map)) { + if (!isDefined(eventBroadcast) || !isDefined(eventBroadcast.map)) { // We do not have events enable/disable do we do nothing (all enabled by default) mapEvents = availableMapEvents; } else if (!isObject(eventBroadcast.map)) { // Not a valid object - $log.warn('[AngularJS - Leaflet] event-broadcast.map must be an object check your model.'); + leafletLogger.warn('event-broadcast.map must be an object check your model.', 'events'); } else { // We have a possible valid map object // Event propadation logic if (eventBroadcast.map.logic !== 'emit' && eventBroadcast.map.logic !== 'broadcast') { // This is an error - $log.warn('[AngularJS - Leaflet] Available event propagation logic are: \'emit\' or \'broadcast\'.'); + leafletLogger.warn('Available event propagation logic are: \'emit\' or \'broadcast\'.', 'events'); } else { logic = eventBroadcast.map.logic; } if (!(isObject(eventBroadcast.map.enable) && eventBroadcast.map.enable.length >= 0)) { - $log.warn('[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.'); + leafletLogger.warn('[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.', 'events'); } else { // Enable events leafletIterators.each(eventBroadcast.map.enable, function(eventName) { @@ -3759,7 +3910,7 @@ angular.module('leaflet-directive').directive('eventBroadcast', ["$log", "$rootS }]); angular.module('leaflet-directive') -.directive('geojson', ["$log", "$rootScope", "leafletData", "leafletHelpers", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", "leafletIterators", "leafletGeoJsonEvents", function($log, $rootScope, leafletData, leafletHelpers, +.directive('lfGeojson', ["leafletLogger", "$rootScope", "leafletData", "leafletHelpers", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", "leafletIterators", "leafletGeoJsonEvents", function(leafletLogger, $rootScope, leafletData, leafletHelpers, leafletWatchHelpers, leafletDirectiveControlsHelpers, leafletIterators, leafletGeoJsonEvents) { var _maybeWatch = leafletWatchHelpers.maybeWatch; var _watchOptions = leafletHelpers.watchOptions; @@ -3807,8 +3958,10 @@ angular.module('leaflet-directive') hlp.isTruthy(attrs.geojsonNested)); var _clean = function() { - if (!leafletGeoJSON) - return; + if (!leafletGeoJSON) { + return; + } + var _remove = function(lObject) { if (isDefined(lObject) && map.hasLayer(lObject)) { map.removeLayer(lObject); @@ -3865,8 +4018,10 @@ angular.module('leaflet-directive') var _create = function(model) { _clean(); if (isNested) { - if (!model || !Object.keys(model).length) - return; + if (!model || !Object.keys(model).length) { + return; + } + $it.each(model, function(m, name) { //name could be layerName and or groupName //for now it is not tied to a layer @@ -3889,7 +4044,7 @@ angular.module('leaflet-directive') }; }]); -angular.module('leaflet-directive').directive('layercontrol', ["$filter", "$log", "leafletData", "leafletHelpers", function($filter, $log, leafletData, leafletHelpers) { +angular.module('leaflet-directive').directive('layercontrol', ["$filter", "leafletLogger", "leafletData", "leafletHelpers", function($filter, leafletLogger, leafletData, leafletHelpers) { return { restrict: 'E', @@ -3905,7 +4060,6 @@ angular.module('leaflet-directive').directive('layercontrol', ["$filter", "$log" transclude: false, require: '^leaflet', controller: ["$scope", "$element", "$sce", function($scope, $element, $sce) { - $log.debug('[Angular Directive - Layers] layers', $scope, $element); var safeApply = leafletHelpers.safeApply; var isDefined = leafletHelpers.isDefined; angular.extend($scope, { @@ -4203,7 +4357,7 @@ angular.module('leaflet-directive').directive('layercontrol', ["$filter", "$log" }; }]); -angular.module('leaflet-directive').directive('layers', ["$log", "$q", "leafletData", "leafletHelpers", "leafletLayerHelpers", "leafletControlHelpers", function($log, $q, leafletData, leafletHelpers, leafletLayerHelpers, leafletControlHelpers) { +angular.module('leaflet-directive').directive('lfLayers', ["leafletLogger", "$q", "leafletData", "leafletHelpers", "leafletLayerHelpers", "leafletControlHelpers", function(leafletLogger, $q, leafletData, leafletHelpers, leafletLayerHelpers, leafletControlHelpers) { return { restrict: 'A', @@ -4412,7 +4566,7 @@ angular.module('leaflet-directive').directive('layers', ["$log", "$q", "leafletD }; }]); -angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafletHelpers", "leafletLegendHelpers", function($log, $http, leafletHelpers, leafletLegendHelpers) { +angular.module('leaflet-directive').directive('lfLegend', ["leafletLogger", "$http", "leafletHelpers", "leafletLegendHelpers", function(leafletLogger, $http, leafletHelpers, leafletLegendHelpers) { return { restrict: 'A', @@ -4452,7 +4606,6 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl leafletScope.$watch('legend', function(newLegend) { if (!isDefined(newLegend)) { - if (isDefined(leafletLegend)) { leafletLegend.removeFrom(map); leafletLegend = null; @@ -4462,16 +4615,12 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl } if (!isDefined(newLegend.url) && (type === 'arcgis') && (!isArray(newLegend.colors) || !isArray(newLegend.labels) || newLegend.colors.length !== newLegend.labels.length)) { - - $log.warn('[AngularJS - Leaflet] legend.colors and legend.labels must be set.'); - + leafletLogger.warn('legend.colors and legend.labels must be set.', 'legend'); return; } if (isDefined(newLegend.url)) { - - $log.info('[AngularJS - Leaflet] loading legend service.'); - + leafletLogger.info('loading legend service.', 'legend'); return; } @@ -4483,12 +4632,12 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl leafletLegend = L.control({ position: position, }); + if (type === 'arcgis') { leafletLegend.onAdd = leafletLegendHelpers.getOnAddArrayLegend(newLegend, legendClass); } leafletLegend.addTo(map); - }); leafletScope.$watch('legend.url', function(newURL) { @@ -4497,187 +4646,184 @@ angular.module('leaflet-directive').directive('legend', ["$log", "$http", "leafl return; } - $http.get(newURL) - .success(function(legendData) { - - if (isDefined(leafletLegend)) { - - leafletLegendHelpers.updateLegend(leafletLegend.getContainer(), legendData, type, newURL); - - } else { - - leafletLegend = L.control({ - position: position, - }); - leafletLegend.onAdd = leafletLegendHelpers.getOnAddLegend(legendData, legendClass, type, newURL); - leafletLegend.addTo(map); - } + $http.get(newURL).success(function(legendData) { + if (isDefined(leafletLegend)) { + leafletLegendHelpers.updateLegend(leafletLegend.getContainer(), legendData, type, newURL); + } else { + leafletLegend = L.control({ position: position, }); + leafletLegend.onAdd = leafletLegendHelpers.getOnAddLegend(legendData, legendClass, type, newURL); + leafletLegend.addTo(map); + } - if (isDefined(legend.loadedData) && isFunction(legend.loadedData)) { - legend.loadedData(); - } - }) - .error(function() { - $log.warn('[AngularJS - Leaflet] legend.url not loaded.'); - }); + if (isDefined(legend.loadedData) && isFunction(legend.loadedData)) { + legend.loadedData(); + } + }).error(function() { + leafletLogger.warn('legend.url not loaded.', 'legend'); + }); }); - }); }, }; }]); -angular.module('leaflet-directive').directive('markers', - ["$log", "$rootScope", "$q", "leafletData", "leafletHelpers", "leafletMapDefaults", "leafletMarkersHelpers", "leafletMarkerEvents", "leafletIterators", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", function($log, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults, - leafletMarkersHelpers, leafletMarkerEvents, leafletIterators, leafletWatchHelpers, - leafletDirectiveControlsHelpers) { - //less terse vars to helpers - var isDefined = leafletHelpers.isDefined; - var errorHeader = leafletHelpers.errorHeader; - var Helpers = leafletHelpers; - var isString = leafletHelpers.isString; - var addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher; - var updateMarker = leafletMarkersHelpers.updateMarker; - var listenMarkerEvents = leafletMarkersHelpers.listenMarkerEvents; - var addMarkerToGroup = leafletMarkersHelpers.addMarkerToGroup; - var createMarker = leafletMarkersHelpers.createMarker; - var deleteMarker = leafletMarkersHelpers.deleteMarker; - var $it = leafletIterators; - var _markersWatchOptions = leafletHelpers.watchOptions; - var maybeWatch = leafletWatchHelpers.maybeWatch; - var extendDirectiveControls = leafletDirectiveControlsHelpers.extend; - - var _getLMarker = function(leafletMarkers, name, maybeLayerName) { - if (!Object.keys(leafletMarkers).length) return; - if (maybeLayerName && isString(maybeLayerName)) { - if (!leafletMarkers[maybeLayerName] || !Object.keys(leafletMarkers[maybeLayerName]).length) - return; - return leafletMarkers[maybeLayerName][name]; - } +angular.module('leaflet-directive').directive('lfMarkers', ["leafletLogger", "$rootScope", "$q", "leafletData", "leafletHelpers", "leafletMapDefaults", "leafletMarkersHelpers", "leafletMarkerEvents", "leafletIterators", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", function(leafletLogger, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults, leafletMarkersHelpers, leafletMarkerEvents, leafletIterators, leafletWatchHelpers, leafletDirectiveControlsHelpers) { + var isDefined = leafletHelpers.isDefined; + var Helpers = leafletHelpers; + var isString = leafletHelpers.isString; + var addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher; + var updateMarker = leafletMarkersHelpers.updateMarker; + var listenMarkerEvents = leafletMarkersHelpers.listenMarkerEvents; + var addMarkerToGroup = leafletMarkersHelpers.addMarkerToGroup; + var createMarker = leafletMarkersHelpers.createMarker; + var deleteMarker = leafletMarkersHelpers.deleteMarker; + var $it = leafletIterators; + var _markersWatchOptions = leafletHelpers.watchOptions; + var maybeWatch = leafletWatchHelpers.maybeWatch; + var extendDirectiveControls = leafletDirectiveControlsHelpers.extend; - return leafletMarkers[name]; - }; + var _getLMarker = function(leafletMarkers, name, maybeLayerName) { + if (!Object.keys(leafletMarkers).length) { + return; + } + + if (maybeLayerName && isString(maybeLayerName)) { + if (!leafletMarkers[maybeLayerName] || !Object.keys(leafletMarkers[maybeLayerName]).length) { + return; + } - var _setLMarker = function(lObject, leafletMarkers, name, maybeLayerName) { + return leafletMarkers[maybeLayerName][name]; + } + + return leafletMarkers[name]; + }; + + var _setLMarker = function(lObject, leafletMarkers, name, maybeLayerName) { if (maybeLayerName && isString(maybeLayerName)) { - if (!isDefined(leafletMarkers[maybeLayerName])) - leafletMarkers[maybeLayerName] = {}; + if (!isDefined(leafletMarkers[maybeLayerName])) { + leafletMarkers[maybeLayerName] = {}; + } + leafletMarkers[maybeLayerName][name] = lObject; - } else - leafletMarkers[name] = lObject; + } else { + leafletMarkers[name] = lObject; + } + return lObject; }; - var _maybeAddMarkerToLayer = function(layerName, layers, model, marker, doIndividualWatch, map) { - - if (!isString(layerName)) { - $log.error(errorHeader + ' A layername must be a string'); - return false; - } + var _maybeAddMarkerToLayer = function(layerName, layers, model, marker, doIndividualWatch, map) { - if (!isDefined(layers)) { - $log.error(errorHeader + ' You must add layers to the directive if the markers are going to use this functionality.'); - return false; - } + if (!isString(layerName)) { + leafletLogger.error('A layername must be a string', 'markers'); + return false; + } - if (!isDefined(layers.overlays) || !isDefined(layers.overlays[layerName])) { - $log.error(errorHeader + ' A marker can only be added to a layer of type "group"'); - return false; - } + if (!isDefined(layers)) { + leafletLogger.error('You must add layers to the directive if the markers are going to use this functionality.', 'markers'); + return false; + } - var layerGroup = layers.overlays[layerName]; - if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { - $log.error(errorHeader + ' Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"'); - return false; - } + if (!isDefined(layers.overlays) || !isDefined(layers.overlays[layerName])) { + leafletLogger.error('A marker can only be added to a layer of type "group"', 'markers'); + return false; + } - // The marker goes to a correct layer group, so first of all we add it - layerGroup.addLayer(marker); + var layerGroup = layers.overlays[layerName]; + if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { + leafletLogger.error('Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"', 'markers'); + return false; + } - // The marker is automatically added to the map depending on the visibility - // of the layer, so we only have to open the popup if the marker is in the map - if (!doIndividualWatch && map.hasLayer(marker) && model.focus === true) { - marker.openPopup(); - } + // The marker goes to a correct layer group, so first of all we add it + layerGroup.addLayer(marker); - return true; - }; + // The marker is automatically added to the map depending on the visibility + // of the layer, so we only have to open the popup if the marker is in the map + if (!doIndividualWatch && map.hasLayer(marker) && model.focus === true) { + marker.openPopup(); + } - //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already) - var _addMarkers = function(mapId, markersToRender, oldModels, map, layers, leafletMarkers, leafletScope, - watchOptions, maybeLayerName, skips) { - for (var newName in markersToRender) { - if (skips[newName]) - continue; + return true; + }; - if (newName.search('-') !== -1) { - $log.error('The marker can\'t use a "-" on his key name: "' + newName + '".'); - continue; - } + //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already) + var _addMarkers = function(mapId, markersToRender, oldModels, map, layers, leafletMarkers, leafletScope, + watchOptions, maybeLayerName, skips) { + for (var newName in markersToRender) { + if (skips[newName]) { + continue; + } - var model = Helpers.copy(markersToRender[newName]); - var pathToMarker = Helpers.getObjectDotPath(maybeLayerName ? [maybeLayerName, newName] : [newName]); - var maybeLMarker = _getLMarker(leafletMarkers, newName, maybeLayerName); - if (!isDefined(maybeLMarker)) { - //(nmccready) very important to not have model changes when lObject is changed - //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal - //if it is left as the reference then all changes from oldModel vs newModel are ignored - //see _destroy (where modelDiff becomes meaningless if we do not copy here) - var marker = createMarker(model); - var layerName = (model ? model.layer : undefined) || maybeLayerName; //original way takes pref - if (!isDefined(marker)) { - $log.error(errorHeader + ' Received invalid data on the marker ' + newName + '.'); - continue; - } + if (newName.search('-') !== -1) { + leafletLogger.error('The marker can\'t use a "-" on his key name: "' + newName + '".', 'markers'); + continue; + } - _setLMarker(marker, leafletMarkers, newName, maybeLayerName); + var model = Helpers.copy(markersToRender[newName]); + var pathToMarker = Helpers.getObjectDotPath(maybeLayerName ? [maybeLayerName, newName] : [newName]); + var maybeLMarker = _getLMarker(leafletMarkers, newName, maybeLayerName); + if (!isDefined(maybeLMarker)) { + //(nmccready) very important to not have model changes when lObject is changed + //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal + //if it is left as the reference then all changes from oldModel vs newModel are ignored + //see _destroy (where modelDiff becomes meaningless if we do not copy here) + var marker = createMarker(model); + var layerName = (model ? model.layer : undefined) || maybeLayerName; //original way takes pref + if (!isDefined(marker)) { + leafletLogger.error('Received invalid data on the marker ' + newName, 'markers'); + continue; + } - // Bind message - if (isDefined(model.message)) { - marker.bindPopup(model.message, model.popupOptions); - } + _setLMarker(marker, leafletMarkers, newName, maybeLayerName); - // Add the marker to a cluster group if needed - if (isDefined(model.group)) { - var groupOptions = isDefined(model.groupOption) ? model.groupOption : null; - addMarkerToGroup(marker, model.group, groupOptions, map); - } + // Bind message + if (isDefined(model.message)) { + marker.bindPopup(model.message, model.popupOptions); + } - // Show label if defined - if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) { - marker.bindLabel(model.label.message, model.label.options); - } + // Add the marker to a cluster group if needed + if (isDefined(model.group)) { + var groupOptions = isDefined(model.groupOption) ? model.groupOption : null; + addMarkerToGroup(marker, model.group, groupOptions, map); + } - // Check if the marker should be added to a layer - if (isDefined(model) && (isDefined(model.layer) || isDefined(maybeLayerName))) { - - var pass = _maybeAddMarkerToLayer(layerName, layers, model, marker, - watchOptions.individual.doWatch, map); - if (!pass) - continue; //something went wrong move on in the loop - } else if (!isDefined(model.group)) { - // We do not have a layer attr, so the marker goes to the map layer - map.addLayer(marker); - if (!watchOptions.individual.doWatch && model.focus === true) { - marker.openPopup(); - } - } + // Show label if defined + if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) { + marker.bindLabel(model.label.message, model.label.options); + } - if (watchOptions.individual.doWatch) { - addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map, - watchOptions.individual.isDeep); - } + // Check if the marker should be added to a layer + if (isDefined(model) && (isDefined(model.layer) || isDefined(maybeLayerName))) { - listenMarkerEvents(marker, model, leafletScope, watchOptions.individual.doWatch, map); - leafletMarkerEvents.bindEvents(mapId, marker, pathToMarker, model, leafletScope, layerName); - } else { - var oldModel = isDefined(oldModel) ? oldModels[newName] : undefined; - updateMarker(model, oldModel, maybeLMarker, pathToMarker, leafletScope, layers, map); + var pass = _maybeAddMarkerToLayer(layerName, layers, model, marker, + watchOptions.individual.doWatch, map); + if (!pass) { + continue; //something went wrong move on in the loop + } + } else if (!isDefined(model.group)) { + // We do not have a layer attr, so the marker goes to the map layer + map.addLayer(marker); + if (!watchOptions.individual.doWatch && model.focus === true) { + marker.openPopup(); } } - }; - var _seeWhatWeAlreadyHave = function(markerModels, oldMarkerModels, lMarkers, isEqual, cb) { + if (watchOptions.individual.doWatch) { + addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map, + watchOptions.individual.isDeep); + } + + listenMarkerEvents(marker, model, leafletScope, watchOptions.individual.doWatch, map); + leafletMarkerEvents.bindEvents(mapId, marker, pathToMarker, model, leafletScope, layerName); + } else { + var oldModel = isDefined(oldModel) ? oldModels[newName] : undefined; + updateMarker(model, oldModel, maybeLMarker, pathToMarker, leafletScope, layers, map); + } + } + }; + + var _seeWhatWeAlreadyHave = function(markerModels, oldMarkerModels, lMarkers, isEqual, cb) { var hasLogged = false; var equals = false; var oldMarker; @@ -4686,7 +4832,6 @@ angular.module('leaflet-directive').directive('markers', var doCheckOldModel = isDefined(oldMarkerModels); for (var name in lMarkers) { if (!hasLogged) { - $log.debug(errorHeader + '[markers] destroy: '); hasLogged = true; } @@ -4703,37 +4848,38 @@ angular.module('leaflet-directive').directive('markers', !isDefined(markerModels[name]) || !Object.keys(markerModels[name]).length || equals) { - if (cb && Helpers.isFunction(cb)) - cb(newMarker, oldMarker, name); + if (cb && Helpers.isFunction(cb)) { + cb(newMarker, oldMarker, name); + } } } }; - var _destroy = function(markerModels, oldMarkerModels, lMarkers, map, layers) { + var _destroy = function(markerModels, oldMarkerModels, lMarkers, map, layers) { _seeWhatWeAlreadyHave(markerModels, oldMarkerModels, lMarkers, false, function(newMarker, oldMarker, lMarkerName) { - $log.debug(errorHeader + '[marker] is deleting marker: ' + lMarkerName); + leafletLogger.debug('Deleting marker: ' + lMarkerName, 'markers'); deleteMarker(lMarkers[lMarkerName], map, layers); delete lMarkers[lMarkerName]; }); }; - var _getNewModelsToSkipp = function(newModels, oldModels, lMarkers) { + var _getNewModelsToSkipp = function(newModels, oldModels, lMarkers) { var skips = {}; _seeWhatWeAlreadyHave(newModels, oldModels, lMarkers, true, function(newMarker, oldMarker, lMarkerName) { - $log.debug(errorHeader + '[marker] is already rendered, marker: ' + lMarkerName); + leafletLogger.debug('Already rendered marker: ' + lMarkerName, 'markers'); skips[lMarkerName] = newMarker; }); return skips; }; - return { + return { restrict: 'A', scope: false, replace: false, - require: ['leaflet', '?layers'], + require: ['leaflet', '?lfLayers'], link: function(scope, element, attrs, controller) { var mapController = controller[0]; @@ -4757,9 +4903,10 @@ angular.module('leaflet-directive').directive('markers', var watchOptions = leafletScope.markersWatchOptions || _markersWatchOptions; // backwards compat - if (isDefined(attrs.watchMarkers)) - watchOptions.doWatch = watchOptions.individual.doWatch = - (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers)); + if (isDefined(attrs.watchMarkers)) { + watchOptions.doWatch = watchOptions.individual.doWatch = + (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers)); + } var isNested = (isDefined(attrs.markersNested) && Helpers.isTruthy(attrs.markersNested)); @@ -4806,9 +4953,9 @@ angular.module('leaflet-directive').directive('markers', }); }, }; - }]); +}]); -angular.module('leaflet-directive').directive('maxbounds', ["$log", "leafletMapDefaults", "leafletBoundsHelpers", "leafletHelpers", function($log, leafletMapDefaults, leafletBoundsHelpers, leafletHelpers) { +angular.module('leaflet-directive').directive('lfMaxbounds', ["leafletLogger", "leafletMapDefaults", "leafletBoundsHelpers", "leafletHelpers", function(leafletLogger, leafletMapDefaults, leafletBoundsHelpers, leafletHelpers) { return { restrict: 'A', @@ -4844,13 +4991,13 @@ angular.module('leaflet-directive').directive('maxbounds', ["$log", "leafletMapD }; }]); -angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletData", "leafletMapDefaults", "leafletHelpers", "leafletPathsHelpers", "leafletPathEvents", function($log, $q, leafletData, leafletMapDefaults, leafletHelpers, leafletPathsHelpers, leafletPathEvents) { +angular.module('leaflet-directive').directive('lfPaths', ["leafletLogger", "$q", "leafletData", "leafletMapDefaults", "leafletHelpers", "leafletPathsHelpers", "leafletPathEvents", function(leafletLogger, $q, leafletData, leafletMapDefaults, leafletHelpers, leafletPathsHelpers, leafletPathEvents) { return { restrict: 'A', scope: false, replace: false, - require: ['leaflet', '?layers'], + require: ['leaflet', '?lfLayers'], link: function(scope, element, attrs, controller) { var mapController = controller[0]; @@ -4926,7 +5073,7 @@ angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletDa } if (newName.search('-') !== -1) { - $log.error('[AngularJS - Leaflet] The path name "' + newName + '" is not valid. It must not include "-" and a number.'); + leafletLogger.error('The path name "' + newName + '" is not valid. It must not include "-" and a number.', 'paths'); continue; } @@ -4948,23 +5095,23 @@ angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletDa if (isDefined(pathData) && isDefined(pathData.layer)) { if (!isString(pathData.layer)) { - $log.error('[AngularJS - Leaflet] A layername must be a string'); + leafletLogger.error('A layername must be a string', 'paths'); continue; } if (!isDefined(layers)) { - $log.error('[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.'); + leafletLogger.error('You must add layers to the directive if the markers are going to use this functionality', 'paths'); continue; } if (!isDefined(layers.overlays) || !isDefined(layers.overlays[pathData.layer])) { - $log.error('[AngularJS - Leaflet] A path can only be added to a layer of type "group"'); + leafletLogger.error('A path can only be added to a layer of type "group"', 'paths'); continue; } var layerGroup = layers.overlays[pathData.layer]; if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { - $log.error('[AngularJS - Leaflet] Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"'); + leafletLogger.error('Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"', 'paths'); continue; } @@ -5001,7 +5148,7 @@ angular.module('leaflet-directive').directive('paths', ["$log", "$q", "leafletDa }; }]); -angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", "leafletMapDefaults", "leafletHelpers", function($log, leafletData, leafletMapDefaults, leafletHelpers) { +angular.module('leaflet-directive').directive('lfTiles', ["leafletLogger", "leafletData", "leafletMapDefaults", "leafletHelpers", function(leafletLogger, leafletData, leafletMapDefaults, leafletHelpers) { return { restrict: 'A', @@ -5015,14 +5162,16 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", " var tiles = leafletScope.tiles; if (!isDefined(tiles) || !isDefined(tiles.url)) { - $log.warn('[AngularJS - Leaflet] The \'tiles\' definition doesn\'t have the \'url\' property.'); + leafletLogger.warn('[AngularJS - Leaflet] The \'tiles\' definition doesn\'t have the \'url\' property.', 'tiles'); return; } controller.getMap().then(function(map) { var defaults = leafletMapDefaults.getDefaults(attrs.id); var tileLayerObj; + leafletScope.$watch('tiles', function(tiles, oldtiles) { + var tileLayerOptions = defaults.tileLayerOptions; var tileLayerUrl = defaults.tileLayer; @@ -5053,7 +5202,7 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", " return; } - // If the options of the tilelayer is changed, we need to redraw the layer + // If the options of the tilelayer are changed, we need to redraw the layer if (isDefined(tiles.url) && isDefined(tiles.options) && (tiles.type !== oldtiles.type || !angular.equals(tiles.options, tileLayerOptions))) { map.removeLayer(tileLayerObj); @@ -5089,13 +5238,12 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", " */ ['markers', 'geojson'].forEach(function(name) { angular.module('leaflet-directive').directive(name + 'WatchOptions', [ - '$log', '$rootScope', '$q', 'leafletData', 'leafletHelpers', - function($log, $rootScope, $q, leafletData, leafletHelpers) { + 'leafletLogger', '$rootScope', '$q', 'leafletData', 'leafletHelpers', + function(leafletLogger, $rootScope, $q, leafletData, leafletHelpers) { - var isDefined = leafletHelpers.isDefined, - errorHeader = leafletHelpers.errorHeader, - isObject = leafletHelpers.isObject, - _watchOptions = leafletHelpers.watchOptions; + var isDefined = leafletHelpers.isDefined; + var isObject = leafletHelpers.isObject; + var _watchOptions = leafletHelpers.watchOptions; return { restrict: 'A', @@ -5112,26 +5260,24 @@ angular.module('leaflet-directive').directive('tiles', ["$log", "leafletData", " if (isObject(scope[name + 'WatchOptions'])) angular.extend(_watchOptions, scope[name + 'WatchOptions']); else - $log.error(errorHeader + '[' + name + 'WatchOptions] is not an object'); + leafletLogger.error('is not an object', 'watch options'); leafletScope[name + 'WatchOptions'] = _watchOptions; } }); }, }; - },]); + }, ]); }); angular.module('leaflet-directive') -.factory('LeafletEventsHelpersFactory', ["$rootScope", "$q", "$log", "leafletHelpers", function($rootScope, $q, $log, leafletHelpers) { +.factory('LeafletEventsHelpersFactory', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", function($rootScope, $q, leafletLogger, leafletHelpers) { var safeApply = leafletHelpers.safeApply; var isDefined = leafletHelpers.isDefined; var isObject = leafletHelpers.isObject; var isArray = leafletHelpers.isArray; - var errorHeader = leafletHelpers.errorHeader; 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; @@ -5161,12 +5307,12 @@ angular.module('leaflet-directive') var _this = this; maybeMapId = maybeMapId || ''; - if (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); }; }; @@ -5180,8 +5326,9 @@ angular.module('leaflet-directive') modelName: modelName, model: model, }; - if (isDefined(layerName)) - angular.extend(toSend, {layerName: layerName}); + if (isDefined(layerName)) { + angular.extend(toSend, {layerName: layerName}); + } if (logic === 'emit') { scope.$emit(broadcastName, toSend); @@ -5201,7 +5348,7 @@ angular.module('leaflet-directive') events = this.getAvailableEvents(); } else if (!isObject(leafletScope.eventBroadcast)) { // Not a valid object - $log.error(errorHeader + 'event-broadcast must be an object check your model.'); + leafletLogger.error('event-broadcast must be an object check your model.'); } else { // We have a possible valid object if (!isDefined(leafletScope.eventBroadcast[_this.lObjectType])) { @@ -5209,33 +5356,37 @@ angular.module('leaflet-directive') 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.'); + 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') - $log.warn(errorHeader + 'Available event propagation logic are: \'emit\' or \'broadcast\'.'); + 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; + isArray(leafletScope.eventBroadcast[_this.lObjectType].enable)) { + eventsEnable = true; + } + if (isDefined(leafletScope.eventBroadcast[_this.lObjectType].disable) && - isArray(leafletScope.eventBroadcast[_this.lObjectType].disable)) - eventsDisable = true; + 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'); + leafletLogger.warn('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'); + leafletLogger.warn('must enable or disable events'); } else { // At this point the object is OK, lets enable or disable events if (eventsEnable) { @@ -5244,12 +5395,12 @@ angular.module('leaflet-directive') // 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'); + 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 - $log.warn(errorHeader + 'This event ' + eventName + ' does not exist'); + leafletLogger.warn('This event ' + eventName + ' does not exist'); } else { // All ok enable the event events.push(eventName); @@ -5263,7 +5414,7 @@ angular.module('leaflet-directive') 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'); + leafletLogger.warn('This event ' + eventName + ' does not exist or has been already disabled'); } else { events.splice(index, 1); @@ -5288,7 +5439,7 @@ angular.module('leaflet-directive') }]); angular.module('leaflet-directive') -.factory('leafletGeoJsonEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletData", function($rootScope, $q, $log, leafletHelpers, +.factory('leafletGeoJsonEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletData", function($rootScope, $q, leafletLogger, leafletHelpers, LeafletEventsHelpersFactory, leafletData) { var safeApply = leafletHelpers.safeApply; var EventsHelper = LeafletEventsHelpersFactory; @@ -5336,7 +5487,7 @@ angular.module('leaflet-directive') }]); angular.module('leaflet-directive') -.factory('leafletLabelEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", function($rootScope, $q, $log, leafletHelpers, LeafletEventsHelpersFactory) { +.factory('leafletLabelEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "LeafletEventsHelpersFactory", function($rootScope, $q, leafletLogger, leafletHelpers, LeafletEventsHelpersFactory) { var Helpers = leafletHelpers; var EventsHelper = LeafletEventsHelpersFactory; @@ -5379,7 +5530,7 @@ angular.module('leaflet-directive') }]); angular.module('leaflet-directive') -.factory('leafletMapEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletEventsHelpers", "leafletIterators", function($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers, leafletIterators) { +.factory('leafletMapEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "leafletEventsHelpers", "leafletIterators", function($rootScope, $q, leafletLogger, leafletHelpers, leafletEventsHelpers, leafletIterators) { var isDefined = leafletHelpers.isDefined; var fire = leafletEventsHelpers.fire; @@ -5433,12 +5584,13 @@ angular.module('leaflet-directive') }; var _genDispatchMapEvent = function(scope, eventName, logic, maybeMapId) { - if (maybeMapId) + if (maybeMapId) { maybeMapId = maybeMapId + '.'; + } + return function(e) { // Put together broadcast name var broadcastName = 'leafletDirectiveMap.' + maybeMapId + eventName; - $log.debug(broadcastName); // Safely broadcast the event fire(scope, broadcastName, logic, e, e.target, scope); @@ -5449,15 +5601,10 @@ angular.module('leaflet-directive') scope.$broadcast('boundsChanged'); }; - var _notifyCenterUrlHashChanged = function(scope, map, attrs, search) { - if (!isDefined(attrs.urlHashCenter)) { - return; - } - + var _notifyCenterUrlHashChanged = function(scope, map, search) { var center = map.getCenter(); var centerUrlHash = (center.lat).toFixed(4) + ':' + (center.lng).toFixed(4) + ':' + map.getZoom(); if (!isDefined(search.c) || search.c !== centerUrlHash) { - //$log.debug("notified new center..."); scope.$emit('centerUrlHash', centerUrlHash); } }; @@ -5480,7 +5627,7 @@ angular.module('leaflet-directive') }]); angular.module('leaflet-directive') -.factory('leafletMarkerEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletLabelEvents", function($rootScope, $q, $log, leafletHelpers, LeafletEventsHelpersFactory, leafletLabelEvents) { +.factory('leafletMarkerEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "LeafletEventsHelpersFactory", "leafletLabelEvents", function($rootScope, $q, leafletLogger, leafletHelpers, LeafletEventsHelpersFactory, leafletLabelEvents) { var safeApply = leafletHelpers.safeApply; var isDefined = leafletHelpers.isDefined; var Helpers = leafletHelpers; @@ -5551,11 +5698,10 @@ angular.module('leaflet-directive') }]); angular.module('leaflet-directive') -.factory('leafletPathEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletLabelEvents", "leafletEventsHelpers", function($rootScope, $q, $log, leafletHelpers, leafletLabelEvents, leafletEventsHelpers) { +.factory('leafletPathEvents', ["$rootScope", "$q", "leafletLogger", "leafletHelpers", "leafletLabelEvents", "leafletEventsHelpers", function($rootScope, $q, leafletLogger, leafletHelpers, leafletLabelEvents, leafletEventsHelpers) { var isDefined = leafletHelpers.isDefined; var isObject = leafletHelpers.isObject; var Helpers = leafletHelpers; - var errorHeader = leafletHelpers.errorHeader; var lblHelp = leafletLabelEvents; var fire = leafletEventsHelpers.fire; @@ -5566,12 +5712,12 @@ angular.module('leaflet-directive') var _genDispatchPathEvent = function(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName) { maybeMapId = maybeMapId || ''; - if (maybeMapId) + if (maybeMapId) { maybeMapId = '.' + maybeMapId; + } return function(e) { var broadcastName = 'leafletDirectivePath' + maybeMapId + '.' + eventName; - $log.debug(broadcastName); fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName); }; }; @@ -5587,7 +5733,7 @@ angular.module('leaflet-directive') pathEvents = _getAvailablePathEvents(); } else if (!isObject(leafletScope.eventBroadcast)) { // Not a valid object - $log.error(errorHeader + 'event-broadcast must be an object check your model.'); + leafletLogger.error('event-broadcast must be an object check your model.'); } else { // We have a possible valid object if (!isDefined(leafletScope.eventBroadcast.path)) { @@ -5595,7 +5741,7 @@ angular.module('leaflet-directive') pathEvents = _getAvailablePathEvents(); } else if (isObject(leafletScope.eventBroadcast.paths)) { // Not a valid object - $log.warn(errorHeader + 'event-broadcast.path must be an object check your model.'); + leafletLogger.warn('event-broadcast.path must be an object check your model.'); } else { // We have a possible valid map object // Event propadation logic @@ -5603,7 +5749,7 @@ angular.module('leaflet-directive') // We take care of possible propagation logic if (leafletScope.eventBroadcast.path.logic !== 'emit' && leafletScope.eventBroadcast.path.logic !== 'broadcast') { // This is an error - $log.warn(errorHeader + 'Available event propagation logic are: \'emit\' or \'broadcast\'.'); + leafletLogger.warn('Available event propagation logic are: \'emit\' or \'broadcast\'.'); } else if (leafletScope.eventBroadcast.path.logic === 'emit') { logic = 'emit'; } @@ -5626,10 +5772,10 @@ angular.module('leaflet-directive') if (pathEventsEnable && pathEventsDisable) { // Both are active, this is an error - $log.warn(errorHeader + 'can not enable and disable events at the same time'); + leafletLogger.warn('can not enable and disable events at the same time'); } else if (!pathEventsEnable && !pathEventsDisable) { // Both are inactive, this is an error - $log.warn(errorHeader + 'must enable or disable events'); + leafletLogger.warn('must enable or disable events'); } else { // At this point the path object is OK, lets enable or disable events if (pathEventsEnable) { @@ -5640,12 +5786,12 @@ angular.module('leaflet-directive') // Do we have already the event enabled? if (pathEvents.indexOf(eventName) !== -1) { // Repeated event, this is an error - $log.warn(errorHeader + 'This event ' + eventName + ' is already enabled'); + leafletLogger.warn('This event ' + eventName + ' is already enabled'); } else { // Does the event exists? if (_getAvailablePathEvents().indexOf(eventName) === -1) { // The event does not exists, this is an error - $log.warn(errorHeader + 'This event ' + eventName + ' does not exist'); + leafletLogger.warn('This event ' + eventName + ' does not exist'); } else { // All ok enable the event pathEvents.push(eventName); @@ -5660,7 +5806,7 @@ angular.module('leaflet-directive') var index = pathEvents.indexOf(eventName); if (index === -1) { // The event does not exist - $log.warn(errorHeader + 'This event ' + eventName + ' does not exist or has been already disabled'); + leafletLogger.warn('This event ' + eventName + ' does not exist or has been already disabled'); } else { pathEvents.splice(index, 1); diff --git a/doc/defaults-attribute.md b/doc/defaults.md similarity index 88% rename from doc/defaults-attribute.md rename to doc/defaults.md index 3a4209fa..6330f758 100644 --- a/doc/defaults-attribute.md +++ b/doc/defaults.md @@ -1,10 +1,10 @@ -'defaults' Attribute Documentation +'defaults' Documentation ================================== -This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this: +This attribute is used with the the **leaflet** main directive, like this: ``` - +<leaflet defaults="defaults"></leaflet> ``` It will define the default parameters from which we want to initialize our map. It's not used as a bi-directional attribute, so it will only apply the initial map parameters and nothing more. Let's see the possibilities. @@ -43,7 +43,7 @@ angular.extend($scope, { And after that, in our HTML code we will define our leaflet directive like this: ``` - +<leaflet defaults="defaults"></leaflet> ``` -And that's all. A full example of using this attribute can be found [here](http://tombatossals.github.io/angular-leaflet-directive/examples/custom-parameters-example.html). +And that's all. An example of how to use this attribute can be found [here](http://tombatossals.github.io/angular-leaflet-directive/examples/0104-basic-custom-parameters-example.html). diff --git a/doc/leaflet-directive.md b/doc/leaflet-directive.md deleted file mode 100644 index 64ca4017..00000000 --- a/doc/leaflet-directive.md +++ /dev/null @@ -1,95 +0,0 @@ -Leaflet directive Documentation -=============================== - -This directive acts as an intermediary between the AngularJS framework and the Leaflet map management library. It's composed of a main directive **<leaflet>** and attributes (coded as sub-directives) of the main directive. For example, we could add to our HTML code: - -``` - -``` - -Here we have the main **leaflet** directive, with the attribute **center** and two more attributes (without bi-directional binding) **width** and **height**. - -Before detailing how to use the directive and its attributes, let's talk about initializing our web page to be able to work with the directive. We must load the required JS libraries and CSS in our HTML: - -``` - - - - - - - - -``` - -After loading the required libraries, we only need to define our AngularJS application (depending on 'openlayers-library') and an application controller to be able to load our map. Showing the map on screen will require that we set the width and height CSS properties of the div including the Leaflet map. We have a lot of alternatives for this, let's see the main ones. - -* We can add *height* and *width* attributes to our *leaflet* directive inline. Example: -``` - -``` - -* We can set the *width* and *height* of the common CSS class '*angular-leaflet-map*' applied to all maps. Beware this will be applied to all maps rendered on your application. Example: -``` - -``` - -* We can set and *id* to our map, and set the CSS properties to this specifid id. Example: -``` - -... - -``` - - -Great, let's see now the complete HTML and inline javascript code needed to load our first map: - -``` - - - - - - - - - - - - - - -``` - -You can see this example in action on the [simple-example.html demo file](http://tombatossals.github.io/angular-leaflet-directive/examples/simple-example.html). - -Take a look at the [AnguarJS controller documentation](http://docs.angularjs.org/guide/controller) if you want to learn more about Angular controller definition, or to the [AngularJS ngApp](http://docs.angularjs.org/api/ng.directive:ngApp) to know how to bootstrap an Angular application. - - -Attributes Documentation -======================== - -We have much more possibilities than showing a simple map, but this will need that we take a closer look at the attributes, listed below: - -* [_defaults_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/defaults-attribute.md) -* [_center_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/center-attribute.md) -* [_bounds_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/bounds-attribute.md) -* [_maxbounds_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/maxbounds-attribute.md) -* [_tiles_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/tiles-attribute.md) -* [_layers_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/layers-attribute.md) -* [_paths_ attribute](https://github.com/tombatossals/angular-leaflet-directive/blob/master/doc/paths-attribute.md) diff --git a/doc/leaflet.md b/doc/leaflet.md new file mode 100644 index 00000000..91aa5758 --- /dev/null +++ b/doc/leaflet.md @@ -0,0 +1,87 @@ +Leaflet directive Documentation +=============================== + +This directive acts as an intermediary between the AngularJS framework and the Leaflet map management library. It's composed of a main directive "**leaflet**" and attributes which gives us the required functionality. For example, we could add to our HTML code: + +``` +<leaflet lf-center="center" width="640px" height="480px"> +``` + +Here we have the main "**leaflet**" directive, with the sub-direcitve "**lf-center**" and two more attributes (without bi-directional binding) **width** and **height**. + +Before detailing how to use the directive and its attributes, let's talk about initializing our web page to be able to work with the directive. We must load the required JS libraries and CSS in our HTML: + +``` +<html> + <head> + <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.min.js"> + <script src="http://cdn.leafletjs.com/leaflet-0.7.7/leaflet.js"> + <script src="http://tombatossals.github.io/angular-leaflet-directive/dist/angular-leaflet-directive.min.js"> + <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.7/leaflet.css" /> + </head> +</html> +``` + +After loading the required libraries, we only need to define our AngularJS application (depending on 'angular-leaflet') and an application controller to be able to load our map. Showing the map on screen will require that we set the width and height CSS properties of the div including the Leaflet map. We have a lot of alternatives for this, let's see the main ones. + +* We can add *height* and *width* attributes to our *leaflet* directive inline. Example: +``` +<leaflet width="640px" height="480px"></leaflet> +``` + +* We can set the *width* and *height* of the common CSS class '*angular-leaflet-map*' applied to all maps. Beware this will be applied to all maps rendered in your application. Example: +``` +<style> + .angular-leaflet-map { + width: 640px; + height: 480px; + } +</style> +``` + +* We can set and *id* to our map, and set the CSS properties to this specifid id. Example: +``` +<style> + #main { + width: 640px; + height: 480px; + } +</style> +... +<leaflet id="main"> +``` + + +Great, let's see now the complete HTML and inline javascript code needed to load our first map: + +``` +<!DOCTYPE html> +<html ng-app="demoapp"> + <head> + <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.min.js"> + <script src="http://cdn.leafletjs.com/leaflet-0.7.7/leaflet.js"> + <script src="http://tombatossals.github.io/angular-leaflet-directive/dist/angular-leaflet-directive.min.js"> + <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.7/leaflet.css" /> + <script> + var app = angular.module("demoapp", ['leaflet-directive']); + app.controller("DemoController", [ "$scope", function($scope) { + // Nothing here! + }]); + </script> + </head> + <body ng-controller="DemoController"> + <leaflet width="640px" height="480px"> + </body> +</html> + +``` + +You can see this example in action on the [basic-first-example demo file](http://tombatossals.github.io/angular-leaflet-directive/examples/0100-basic-first-example.html). + +Take a look at the [AnguarJS controller documentation](http://docs.angularjs.org/guide/controller) if you want to learn more about Angular controller definition, or to the [AngularJS ngApp](http://docs.angularjs.org/api/ng.directive:ngApp) to know how to bootstrap an Angular application. + + +Attributes and subdirectives documentation +========================================== + +We have much more possibilities than showing a simple map, but we will need to take a closer look at the attributes and subdirectives documentation&examples you can find in the upper links. diff --git a/doc/bounds-attribute.md b/doc/lf-bounds.md similarity index 75% rename from doc/bounds-attribute.md rename to doc/lf-bounds.md index 6e87d2d9..8a16c901 100644 --- a/doc/bounds-attribute.md +++ b/doc/lf-bounds.md @@ -1,10 +1,10 @@ -'bounds' Attribute Documentation -================================== +'lf-bounds' Documentation +========================= This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this: ``` - +<leaflet lf-bounds="bounds" lf-center="center"></leaflet> ``` It will map an object _bounds_ of our controller scope with the corresponding object on our leaflet directive isolated scope. It's a bidirectional relationship, so a change in this object on the controller scope object will affect the map bounds, or an interaction on the map which changes the map position will update our _bounds_ values. Let's define the bounds model with an example: @@ -23,7 +23,7 @@ $scope.bounds = { } ``` -Defining the bounds is a little complex, so we have a helper which will allow us to be more concise on the definition making use of and array with two arrays with to values inside (lat, lng). To use it, we must make use of the _leafletBoundsHelpers_ service on our controller. For example: +Full bounds definition is a little complex, so we have a helper which will allow us to be more concise on the definition making use of and array with two arrays with to values inside (lat, lng). To use it, we must make use of the _leafletBoundsHelpers_ service on our controller. For example: ``` app.controller("DemoController", [ "$scope", "leafletBoundsHelpers", function($scope, leafletBoundsHelpers) { diff --git a/doc/center-attribute.md b/doc/lf-center.md similarity index 59% rename from doc/center-attribute.md rename to doc/lf-center.md index 7cef0ed2..d4d40b33 100644 --- a/doc/center-attribute.md +++ b/doc/lf-center.md @@ -1,13 +1,13 @@ -'center' Attribute Documentation -================================== +'lf-center' Documentation +================================ This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this: ``` - +<leaflet lf-center="center"></leaflet> ``` -It will map an object _center_ of our controller scope with the corresponding object on our directive isolated scope. It's a bidirectional relationship, so a change in this object on the controller scope will affect the map center position, or an interaction on the map which changes the map center will update our _center_ values. Let's define the center model with an example: +It will map an object _center_ of our controller scope with the corresponding object on our directive isolated scope. It's a bidirectional relationship, so a change in this object on the controller scope will affect the map center position, or an interaction on the map which changes the map center will update our _center_ values. Let's define the basic center model with an example: ``` $scope.center = { @@ -34,10 +34,12 @@ angular.extend($scope, { And after that, in our HTML code we will define our leaflet directive like this: ``` - +<leaflet lf-center="center"></leaflet> ``` -And that's all. A full example of using this attribute can be found [here](http://tombatossals.github.io/angular-leaflet-directive/examples/center-example.html). +And that's all. A full example of using this attribute can be found [here](http://tombatossals.github.io/angular-leaflet-directive/examples/0101-basic-center-example.html). + +Let's see more properties we can use with the center sub-directive. Autodiscover ------------ @@ -56,21 +58,27 @@ angular.extend($scope, { }); ``` -We can see an example of how to use it [here](http://tombatossals.github.io/angular-leaflet-directive/examples/center-autodiscover-example.html). +We can see an example of how to use it [here](http://tombatossals.github.io/angular-leaflet-directive/examples/0102-basic-center-autodiscover-example.html). Center position coded on a hash URL param ------------------------------------------ -We can use a special feature of the center attribute which allow us to synchronize the center position of the map with the URL, adding to it a special GET parameter where the center is coded. Then we can persist the map position on the browser URL. +We can use a special feature of the center attribute which allow us to synchronize the center position of the map with a URL hash. This feature is inspired in the project [leaflet-hash](https://github.com/mlevans/leaflet-hash). + ``` - +angular.extend($scope, { + center: { + lat: 51.505, + lng: -0.09, + zoom: 4, + allowUrlHashCenter: true + } ``` -Adding that attribute will synchronize the center with a GET parameter on the URL of this form `?c=lat:lng:zoom`. Furthermore, whenever the map center is changed a new event `urlCenterHash` will be emitted to the parent scope so you can update your `$location.search` with the new info (if you want). - -You can take a look of this feature on this [demo](http://tombatossals.github.io/angular-leaflet-directive/examples/url-hash-center-example.html). +Adding the attribute _allowUrlHashCenter_ will synchronize the map center with a GET parameter on the URL of this form `?c=lat:lng:zoom`. Furthermore, whenever the map center is changed a new event `urlCenterHash` will be emitted to the parent scope so you can update your `$location.search` with the new info (if you want). -Development information ------------------------ -Each change to our scope defined _center_ object will update the map, or vice versa. This is accomplished via an angularJS watcher, defined [here](https://github.com/tombatossals/angular-leaflet-directive/blob/v0.7.0/src/directives/center.js#L34) in our code. When we change our map center or zoom, our _center_ object will be updated, these events are defined [here](https://github.com/tombatossals/angular-leaflet-directive/blob/v0.7.0/src/directives/center.js#L47) in our code. +You can take a look of this feature on this [demo](http://tombatossals.github.io/angular-leaflet-directive/examples/0103-basic-center-url-hash-example.html). +More useful examples +-------------------- + * [center the map based in the IP of the client](http://tombatossals.github.io/angular-leaflet-directive/examples/0109-basic-center-geoip-example.html). diff --git a/doc/lf-layers.md b/doc/lf-layers.md new file mode 100644 index 00000000..801cd60f --- /dev/null +++ b/doc/lf-layers.md @@ -0,0 +1,52 @@ +'layers' Attribute Documentation +================================== + +This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this: + +``` + +``` + +It will map an object _layers_ of our controller scope with the corresponding object on our directive isolated scope. It's not a bidirectional relationship, so only the changes made in this object on the controller scope will affect the layers definition in +our leaflet map. Let's define the layers model with an example: + +``` +$scope.layers = { + baselayers: { + osm: { + name: 'OpenStreetMap', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + }, + cloudmade: { + name: 'Cloudmade Tourist', + type: 'xyz', + url: 'http://{s}.tile.cloudmade.com/{key}/{styleId}/256/{z}/{x}/{y}.png', + layerParams: { + key: '007b9471b4c74da4a6ec7ff43552b16f', + styleId: 7 + } + } + } +} +``` + +We can see that the _layers_ definition is conformed by lot attributes that we are going to describe below. When we associate that object with our _leaflet-directive_ the unidirectional relation will start, and the first layer will be shown on the map and a new layer-switcher-control will appear on our map. + +The layer-switcher-control will only appear if there are more than one layer (baselayer or overlay) that could be changed interactively by the user, if there's only one layer, no control will be visible. + +BaseLayers are the main tiles shown in the map, they could be interactively changed by the user on the switch control if more than one is visible, but only one can be active at the time (input radio buttons on the control). Overlays are tiles that can be shown on the map overlapped to the main baselayer (normally they use transparency) and more than one can be active at the time (input checkbox buttons). More about these types of layers [here](http://leafletjs.com/reference.html#control-layers). + +* [Baselayer simple demo](http://tombatossals.github.io/angular-leaflet-directive/examples/layers-simple-example.html). +* [Overlays simple demo](http://tombatossals.github.io/angular-leaflet-directive/examples/overlays-simple-example.html). + +Types of layers +--------------- +We are not limited to one type of layers, we can define other types: + +* XYZ Layer. +* WMS Layer. +* WFS Layer. +* GoogleMaps Layer. +* MarkerCluster Layer. +* GeoJSON Layer. diff --git a/doc/markers-attribute.md b/doc/lf-markers.md similarity index 100% rename from doc/markers-attribute.md rename to doc/lf-markers.md diff --git a/doc/maxbounds-attribute.md b/doc/lf-maxbounds.md similarity index 70% rename from doc/maxbounds-attribute.md rename to doc/lf-maxbounds.md index 802455ed..e8b3b576 100644 --- a/doc/maxbounds-attribute.md +++ b/doc/lf-maxbounds.md @@ -1,13 +1,13 @@ -'maxbounds' Attribute Documentation -=================================== +'lf-maxbounds' Documentation +============================ This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this: ``` - +<leaflet lf-maxbounds="maxbounds"></leaflet> ``` -It will map an object _maxbounds_ of our controller scope with the corresponding object on our leaflet directive isolated scope. It's not a bidirectional relationship, only the changes made to our _maxbounds_ object on the controller scope will affect the map, but no vice versa. +The functionality will be to limit the panning of the rendered map to the bounds set inside the _maxbounds_ object. It's not a bidirectional relationship, only the changes made to our _maxbounds_ object on the controller scope will affect the map, but no vice versa. ``` $scope.maxbounds = { @@ -37,4 +37,4 @@ app.controller("DemoController", [ "$scope", "leafletBoundsHelpers", function($s }); ``` -And that's all, we can see how the map is affected when we change the _maxbounds_ scope values, like [this example](http://tombatossals.github.io/angular-leaflet-directive/examples/maxbounds-example.html). +And that's all, we can see how the map is affected when we change the _maxbounds_ scope values, like [this example](http://tombatossals.github.io/angular-leaflet-directive/examples/0106-basic-maxbounds-example.html). diff --git a/doc/paths-attribute.md b/doc/lf-paths.md similarity index 100% rename from doc/paths-attribute.md rename to doc/lf-paths.md diff --git a/doc/lf-tiles.md b/doc/lf-tiles.md new file mode 100644 index 00000000..2918db28 --- /dev/null +++ b/doc/lf-tiles.md @@ -0,0 +1,28 @@ +'lf-tiles' Documentation +======================== + +This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this: + +``` +<leaflet lf-tiles="tiles"></leaflet> +``` + +We will use this object to set the basic tiles of our map. If you need more complex functionality you need to take a look at the _lf-layers_ sub-directive. It's not a bi-directional object. Changes to the scope object will affect the map tiles rendered on screen. + +Take a look first at the [leaflet tilelayer API call](http://leafletjs.com/reference.html#tilelayer) if you don't know nothing about it, but let's see its basic properties. + +``` +$scope.tiles = { + url: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png", + options: { + attribution: '© OpenStreetMap contributors' + } +} +``` + +The options passed to this object can be set with a lot of attributes, and are the same passed to the leaflet tile object, documented [here](http://leafletjs.com/reference.html#tilelayer-options). + +And that's all, we can see how the map is affected when we change the _tiles_ scope object values in these examples: + +* [Tiles basic example](http://tombatossals.github.io/angular-leaflet-directive/examples/0107-basic-tiles-example.html). +* [Change tiles with zoom example](http://tombatossals.github.io/angular-leaflet-directive/examples/0108-basic-tiles-zoom-changer-example.html). diff --git a/doc/tiles-attribute.md b/doc/tiles-attribute.md deleted file mode 100644 index 7bc34d70..00000000 --- a/doc/tiles-attribute.md +++ /dev/null @@ -1,28 +0,0 @@ -'tiles' Attribute Documentation -=================================== - -This sub-directive needs the **leaflet** main directive, so it is normally used as an attribute of the *leaflet* tag, like this: - -``` - -``` - -It will map an object _tiles_ of our controller scope with the corresponding object on our leaflet directive isolated scope. It's not a bidirectional relationship, only the changes made to our _tiles_ object on the controller scope will affect the map, but no vice versa. - -This object is basically composed of two attributes: **url** and **options**. Let's see them in an example definition: -``` -$scope.tiles = { - url: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png", - options: { - attribution: '© OpenStreetMap contributors' - } -} -``` - -The options passed to this object could have a lot of attributes, and are the same passed to the leaflet tile object, documented [here](http://leafletjs.com/reference.html#tilelayer-options). - - -And that's all, we can see how the map is affected when we change the _tiles_ scope object values, like these examples: - -* [tiles-example.html](http://tombatossals.github.io/angular-leaflet-directive/examples/tiles-example.html). -* [tiles-zoom-changer-example.html](http://tombatossals.github.io/angular-leaflet-directive/examples/tiles-zoom-changer-example.html). diff --git a/examples/0101-basic-lf-center-example.html b/examples/0101-basic-lf-center-example.html deleted file mode 100644 index e8fcfb76..00000000 --- a/examples/0101-basic-lf-center-example.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - -

Center map example

-
    -
  • Latitude
  • -
  • Longitude
  • -
  • Zoom
  • -
- - diff --git a/examples/0103-basic-center-url-hash-example.html b/examples/0103-basic-center-url-hash-example.html index 28f6ee6f..3b1097af 100644 --- a/examples/0103-basic-center-url-hash-example.html +++ b/examples/0103-basic-center-url-hash-example.html @@ -13,7 +13,8 @@ london: { lat: 51.505, lng: -0.09, - zoom: 4 + zoom: 4, + allowUrlHashCenter: true } }); $scope.$on("centerUrlHash", function(event, centerHash) { @@ -35,7 +36,7 @@ - +

Center map with URL synchronization example

This demo syncs the map center position with the URL, and vice versa, using the center-url-params property.

    diff --git a/examples/0104-basic-custom-parameters-example.html b/examples/0104-basic-custom-parameters-example.html index fccceba6..fa8693d3 100644 --- a/examples/0104-basic-custom-parameters-example.html +++ b/examples/0104-basic-custom-parameters-example.html @@ -30,7 +30,7 @@ - +

    Using custom default parameters

    diff --git a/examples/0105-basic-bounds-example.html b/examples/0105-basic-bounds-example.html index c59450cb..cf4df393 100644 --- a/examples/0105-basic-bounds-example.html +++ b/examples/0105-basic-bounds-example.html @@ -25,7 +25,7 @@ - +

    Map bounds example

    South west

    diff --git a/examples/0106-basic-maxbounds-example.html b/examples/0106-basic-maxbounds-example.html index fb46e3b0..1e28b2b1 100644 --- a/examples/0106-basic-maxbounds-example.html +++ b/examples/0106-basic-maxbounds-example.html @@ -50,7 +50,7 @@ - +

    Setting MaxBounds in a map

    With maxbounds the map visualization is limited to a defined zone. Try to pan on these regions to see how it works.

    diff --git a/examples/0107-basic-tiles-example.html b/examples/0107-basic-tiles-example.html index 6298062b..faebe0db 100644 --- a/examples/0107-basic-tiles-example.html +++ b/examples/0107-basic-tiles-example.html @@ -58,7 +58,7 @@ - +

    Changing tiles example

    Change tiles clicking in the buttons below:

    diff --git a/examples/0108-basic-tiles-zoom-changer-example.html b/examples/0108-basic-tiles-zoom-changer-example.html index c2275a0a..376b83da 100644 --- a/examples/0108-basic-tiles-zoom-changer-example.html +++ b/examples/0108-basic-tiles-zoom-changer-example.html @@ -32,7 +32,7 @@ - +

    Dynamic tile changer based on zoom level

    Zoom to level 13 to see how the tiles change:

      diff --git a/examples/0110-basic-map-without-animations-example.html b/examples/0110-basic-map-without-animations-example.html index b3c90b05..faf6f109 100644 --- a/examples/0110-basic-map-without-animations-example.html +++ b/examples/0110-basic-map-without-animations-example.html @@ -31,7 +31,7 @@ - +

      Map with disabled animations example

      diff --git a/examples/0111-basic-legend-example.html b/examples/0111-basic-legend-example.html index f315475f..52d41d68 100644 --- a/examples/0111-basic-legend-example.html +++ b/examples/0111-basic-legend-example.html @@ -47,7 +47,7 @@ - +

      Legend example

      diff --git a/examples/0112-basic-maxbounds-pad-example.html b/examples/0112-basic-maxbounds-pad-example.html index 5ab5c5a7..9f701ef0 100644 --- a/examples/0112-basic-maxbounds-pad-example.html +++ b/examples/0112-basic-maxbounds-pad-example.html @@ -55,7 +55,7 @@ - +

      Extend Maxbounds with Pad

      You can extend maxbounds with a pad property. Pad is a percentage by which the latLngBounds will be extended.

      
      diff --git a/examples/0113-basic-geojson-simple-example.html b/examples/0113-basic-geojson-simple-example.html
      index 636b699e..da1965bd 100644
      --- a/examples/0113-basic-geojson-simple-example.html
      +++ b/examples/0113-basic-geojson-simple-example.html
      @@ -40,7 +40,7 @@
             
         
         
      -     
      +     
            

      Simple GeoJSON example

      diff --git a/examples/0114-basic-geojson-center-example.html b/examples/0114-basic-geojson-center-example.html index da49e786..2cb9e186 100644 --- a/examples/0114-basic-geojson-center-example.html +++ b/examples/0114-basic-geojson-center-example.html @@ -56,7 +56,7 @@ - +

      Center to GeoJSON example

      diff --git a/examples/0116-basic-access-leaflet-object-example.html b/examples/0116-basic-access-leaflet-object-example.html index 426fab8c..eb208563 100644 --- a/examples/0116-basic-access-leaflet-object-example.html +++ b/examples/0116-basic-access-leaflet-object-example.html @@ -8,7 +8,7 @@ - - + +

      Toggle between two maps on screen

      View javascript console while toggling map

      diff --git a/examples/0122-basic-geojson-update-example.html b/examples/0122-basic-geojson-update-example.html index 90477f01..d4190f37 100644 --- a/examples/0122-basic-geojson-update-example.html +++ b/examples/0122-basic-geojson-update-example.html @@ -105,7 +105,7 @@ - +

      GeoJSON update example

      diff --git a/examples/0124-basic-geojson-non-nested-example.html b/examples/0124-basic-geojson-non-nested-example.html index 955e429d..b7106e22 100644 --- a/examples/0124-basic-geojson-non-nested-example.html +++ b/examples/0124-basic-geojson-non-nested-example.html @@ -75,7 +75,7 @@ - +

      GeoJSON non nested example

      diff --git a/examples/0125-basic-geojson-nested-example.html b/examples/0125-basic-geojson-nested-example.html index 39ce50aa..6cf90f4a 100644 --- a/examples/0125-basic-geojson-nested-example.html +++ b/examples/0125-basic-geojson-nested-example.html @@ -95,7 +95,7 @@ - +

      GeoJSON nested example

      diff --git a/examples/0126-basic-bounds-nominatim-example.html b/examples/0126-basic-bounds-nominatim-example.html index a27f895d..2bc6b262 100644 --- a/examples/0126-basic-bounds-nominatim-example.html +++ b/examples/0126-basic-bounds-nominatim-example.html @@ -24,7 +24,7 @@ - +

      Bounds Nominatim map example

      diff --git a/examples/0127-basic-tiles-wms-example.html b/examples/0127-basic-tiles-wms-example.html index b2ae0301..35fabdf1 100644 --- a/examples/0127-basic-tiles-wms-example.html +++ b/examples/0127-basic-tiles-wms-example.html @@ -60,8 +60,8 @@ - -

      Loading WMS tilesDict example

      + +

      Loading WMS tiles example

      Change tiles clicking in the buttons below:

      diff --git a/examples/0201-layers-simple-example.html b/examples/0201-layers-simple-example.html index 2aa38e3f..f8189ae7 100644 --- a/examples/0201-layers-simple-example.html +++ b/examples/0201-layers-simple-example.html @@ -44,7 +44,7 @@ - +

      Layers simple example

      You can easily add various layers to your map, including a layer selector on the top right, defining layers object.

      diff --git a/examples/0202-layers-overlays-simple-example.html b/examples/0202-layers-overlays-simple-example.html index 69eee7dc..9a752c14 100644 --- a/examples/0202-layers-overlays-simple-example.html +++ b/examples/0202-layers-overlays-simple-example.html @@ -42,7 +42,7 @@ - +

      Baselayer with overlays

      You can add overlays to a baselayer, which will show a layer selector on the top right corner, defining layers like in this example.

      diff --git a/examples/0203-layers-imageoverlay-example.html b/examples/0203-layers-imageoverlay-example.html index ed9b2dd4..91f23a7e 100644 --- a/examples/0203-layers-imageoverlay-example.html +++ b/examples/0203-layers-imageoverlay-example.html @@ -8,8 +8,8 @@ - +

      Layer with image overlay and maxBounds

      diff --git a/examples/0204-layers-dynamic-addition-example.html b/examples/0204-layers-dynamic-addition-example.html index 399ee6e7..84dc957f 100644 --- a/examples/0204-layers-dynamic-addition-example.html +++ b/examples/0204-layers-dynamic-addition-example.html @@ -81,7 +81,7 @@ - +

      Dynamic addition/removal of layers

      diff --git a/examples/0205-layers-googlemaps-example.html b/examples/0205-layers-googlemaps-example.html index 54daf9cf..e4512751 100644 --- a/examples/0205-layers-googlemaps-example.html +++ b/examples/0205-layers-googlemaps-example.html @@ -48,7 +48,7 @@ - +

      Google maps example

      Use the Layer Switch Control on the top rigth of the map to select another Google Maps Layer.

      diff --git a/examples/0206-layers-googlemaps-fullsize-example.html b/examples/0206-layers-googlemaps-fullsize-example.html index 235ced65..0f3846da 100644 --- a/examples/0206-layers-googlemaps-fullsize-example.html +++ b/examples/0206-layers-googlemaps-fullsize-example.html @@ -64,7 +64,7 @@
      - +

      Google Maps fullsize example

      Open this example as stand-alone page with the bottom link to see how it fullscreens your monitor

      diff --git a/examples/0207-layers-hide-baselayer-on-selector-example.html b/examples/0207-layers-hide-baselayer-on-selector-example.html index 2bbabafc..c0ffc198 100644 --- a/examples/0207-layers-hide-baselayer-on-selector-example.html +++ b/examples/0207-layers-hide-baselayer-on-selector-example.html @@ -45,7 +45,7 @@ - +

      Baselayer hidden on switch selector to show only overlay

      Open the layer switch selector to see it.

      
      diff --git a/examples/0208-layers-esri-dynamic-layer-example.html b/examples/0208-layers-esri-dynamic-layer-example.html
      index ec2cab0c..9520a822 100644
      --- a/examples/0208-layers-esri-dynamic-layer-example.html
      +++ b/examples/0208-layers-esri-dynamic-layer-example.html
      @@ -54,7 +54,7 @@
           
       
       
      -    
      +    
           

      Esri ArcGIS Dynamic Map Layer

      Use the Layer Switch Control on the top rigth of the map to select another Esri Layer.

      diff --git a/examples/0209-layers-esri-legend-service-example.html b/examples/0209-layers-esri-legend-service-example.html index 95bb8e1e..5cfc6eb1 100644 --- a/examples/0209-layers-esri-legend-service-example.html +++ b/examples/0209-layers-esri-legend-service-example.html @@ -142,8 +142,8 @@ - +

      Esri ArcGIS Legend Service

      Use the button to switch another Esri Legend.


      diff --git a/examples/0210-layers-webgl-heatmap-example.html b/examples/0210-layers-webgl-heatmap-example.html index aae21288..e25cc8d0 100644 --- a/examples/0210-layers-webgl-heatmap-example.html +++ b/examples/0210-layers-webgl-heatmap-example.html @@ -43,7 +43,7 @@ - +

      HeatMap WebGL overlay example

      You can use the WebGL HeatMap overlay plugin, like this. Please read the heatmap plugin documentation to use it.

      
      diff --git a/examples/0211-layers-layergroup-simple-example.html b/examples/0211-layers-layergroup-simple-example.html
      index 282a49ff..50b3c18c 100644
      --- a/examples/0211-layers-layergroup-simple-example.html
      +++ b/examples/0211-layers-layergroup-simple-example.html
      @@ -70,7 +70,7 @@
           
       
       
      -    
      +    
           

      Layer Groups with nested layer definitions

      You can add layer groups to a map. In this case, a UTF Grid and Tile Layer are grouped. Notice that the layers show as one in the layer selector control.

      You hovered over:

      diff --git a/examples/0212-layers-hide-overlays-on-selector-example.html b/examples/0212-layers-hide-overlays-on-selector-example.html index c7f135d1..44303a06 100644 --- a/examples/0212-layers-hide-overlays-on-selector-example.html +++ b/examples/0212-layers-hide-overlays-on-selector-example.html @@ -51,7 +51,7 @@ - +

      Overlay not shown in selector

      @@ -59,6 +59,5 @@

      Overlay not shown in selector

      layerOptions: {
           showOnSelector: false
       }
      -
      
       
       
      diff --git a/examples/0213-layers-bingmaps-example.html b/examples/0213-layers-bingmaps-example.html
      index a5c27398..47e4c232 100644
      --- a/examples/0213-layers-bingmaps-example.html
      +++ b/examples/0213-layers-bingmaps-example.html
      @@ -57,7 +57,7 @@
           
       
       
      -    
      +    
           

      Bing maps

      Use the Layer Switch Control on the top rigth of the map to select another Bing Maps Layer.

      diff --git a/examples/0214-layers-utfgrid-example.html b/examples/0214-layers-utfgrid-example.html index f2378bfc..2c3832a9 100644 --- a/examples/0214-layers-utfgrid-example.html +++ b/examples/0214-layers-utfgrid-example.html @@ -53,7 +53,7 @@ - +

      Baselayer with UTFGrid interactivity in Overlay

      Mouse over the map regions to interact with UTFGrid.

      {{interactivity}}

      diff --git a/examples/0216-layers-overlays-markercluster-example.html b/examples/0216-layers-overlays-markercluster-example.html index df71c4be..4f8efdbb 100644 --- a/examples/0216-layers-overlays-markercluster-example.html +++ b/examples/0216-layers-overlays-markercluster-example.html @@ -106,7 +106,7 @@ - +

      This is a map with overlays and a markercluster

      In this example we use a MarkerCluster overlay to group the markers instead of a LayerGroup. diff --git a/examples/0218-layers-overlays-markers-nested-example.html b/examples/0218-layers-overlays-markers-nested-example.html index c93b6094..ec13915e 100644 --- a/examples/0218-layers-overlays-markers-nested-example.html +++ b/examples/0218-layers-overlays-markers-nested-example.html @@ -156,8 +156,8 @@ diff --git a/examples/0219-layers-overlays-paths-example.html b/examples/0219-layers-overlays-paths-example.html index e8b69a21..723dfeaf 100644 --- a/examples/0219-layers-overlays-paths-example.html +++ b/examples/0219-layers-overlays-paths-example.html @@ -169,7 +169,7 @@ - +

      Different overlays for paths

      In this example we create two layer groups lines, and shapes. We insert markers in both layers (note that on is initially diff --git a/examples/0220-layers-wms-with-different-projection-example.html b/examples/0220-layers-wms-with-different-projection-example.html index a005a8d8..fdf64030 100644 --- a/examples/0220-layers-wms-with-different-projection-example.html +++ b/examples/0220-layers-wms-with-different-projection-example.html @@ -54,6 +54,6 @@

      Load a map in non standard projection

      - + diff --git a/examples/0221-layers-heatmap-example.html b/examples/0221-layers-heatmap-example.html index 419c6a02..5b60bf19 100644 --- a/examples/0221-layers-heatmap-example.html +++ b/examples/0221-layers-heatmap-example.html @@ -59,7 +59,7 @@ - +

      HeatMap example

      This example uses the Leaflet.heat library.

      The example is inspired in this Google Maps Heat example.

      diff --git a/examples/0222-layers-overlays-hide-on-zoomout-example.html b/examples/0222-layers-overlays-hide-on-zoomout-example.html index ca042363..922aaadd 100644 --- a/examples/0222-layers-overlays-hide-on-zoomout-example.html +++ b/examples/0222-layers-overlays-hide-on-zoomout-example.html @@ -46,7 +46,7 @@ - +

      Baselayer with overlay which is hidden on Zoom less than 4

      zoom: {{center.zoom}} diff --git a/examples/0223-layers-refresh-overlay-every-minute-example.html b/examples/0223-layers-refresh-overlay-every-minute-example.html index dd135c38..bfcbd174 100644 --- a/examples/0223-layers-refresh-overlay-every-minute-example.html +++ b/examples/0223-layers-refresh-overlay-every-minute-example.html @@ -55,7 +55,7 @@ - +

      Refreshable overlays example

      You can refresh the overlay/baselayer state adding a boolean property to the layer:

      diff --git a/examples/0224-layers-esri-base-layer-example.html b/examples/0224-layers-esri-base-layer-example.html
      index 9ce9447e..7bd98146 100644
      --- a/examples/0224-layers-esri-base-layer-example.html
      +++ b/examples/0224-layers-esri-base-layer-example.html
      @@ -86,7 +86,7 @@
           
       
       
      -    
      +    
           

      Esri ArcGIS Basemap Layer

      Use the Layer Switch Control on the top rigth of the map to select another Esri Basemap Layer.

      diff --git a/examples/0225-layers-esri-feature-layer-example.html b/examples/0225-layers-esri-feature-layer-example.html index 3ebf7ad9..739b9818 100644 --- a/examples/0225-layers-esri-feature-layer-example.html +++ b/examples/0225-layers-esri-feature-layer-example.html @@ -239,7 +239,7 @@ float: right; } - + diff --git a/examples/0226-layers-esri-tiled-map-layer-example.html b/examples/0226-layers-esri-tiled-map-layer-example.html index 4a38a872..8baaa546 100644 --- a/examples/0226-layers-esri-tiled-map-layer-example.html +++ b/examples/0226-layers-esri-tiled-map-layer-example.html @@ -39,7 +39,7 @@ - +

      Esri ArcGIS Tiled Map Layer

      Use the Layer Switch Control on the top rigth of the map to show another Esri Tiled Map Layers.

      diff --git a/examples/0227-layers-esri-image-layer-example.html b/examples/0227-layers-esri-image-layer-example.html index c58c7f4e..1db44e44 100644 --- a/examples/0227-layers-esri-image-layer-example.html +++ b/examples/0227-layers-esri-image-layer-example.html @@ -44,7 +44,7 @@ - +

      Esri ArcGIS Image Layer

      Display NAIP imagery from an ArcGIS image service and use the band IDs parameter to show the near infrared band in a diff --git a/examples/0228-layers-esri-clustered-layer-example.html b/examples/0228-layers-esri-clustered-layer-example.html index f27aa6c0..31563dfe 100644 --- a/examples/0228-layers-esri-clustered-layer-example.html +++ b/examples/0228-layers-esri-clustered-layer-example.html @@ -44,7 +44,7 @@ - +

      Esri ArcGIS Clustered Layer

      Visualize dense services as clusters of points with the diff --git a/examples/0229-layers-esri-heatmap-layer-example.html b/examples/0229-layers-esri-heatmap-layer-example.html index af792910..ee68b3cc 100644 --- a/examples/0229-layers-esri-heatmap-layer-example.html +++ b/examples/0229-layers-esri-heatmap-layer-example.html @@ -52,7 +52,7 @@ - +

      Esri ArcGIS Heatmap Layer

      Displaying point data as a heatmap using the L.heat plugin with custom styling of heatmap gradients with the L.heat options. diff --git a/examples/0230-layers-yandex-example.html b/examples/0230-layers-yandex-example.html index 5abe1a3d..6b732969 100644 --- a/examples/0230-layers-yandex-example.html +++ b/examples/0230-layers-yandex-example.html @@ -50,7 +50,7 @@ - +

      Yandex layer example

      Use the Layer Switch Control on the top rigth of the map to select another Yandex Layer.

      diff --git a/examples/0231-layers-overlay-geojson-example.html b/examples/0231-layers-overlay-geojson-example.html index cf71a968..71a1ed62 100644 --- a/examples/0231-layers-overlay-geojson-example.html +++ b/examples/0231-layers-overlay-geojson-example.html @@ -74,7 +74,7 @@ - +

      GeoJSON Shape Layer and GeoJSON Awesome Marker Layer

      Use the layer control to add a geoJSON shape layer. This is different from a GeoJSON layer, which is a Tile Layer

      The example also includes a geoJSON Awesome Markers layer, which you can use to customise marker icons easily.

      diff --git a/examples/0300-paths-simple-example.html b/examples/0300-paths-simple-example.html index eb4ff017..24d28bb6 100644 --- a/examples/0300-paths-simple-example.html +++ b/examples/0300-paths-simple-example.html @@ -44,7 +44,7 @@ - +

      Paths simple example

      Click on red route (Popup) or hover over green route (Label) to get more information

      diff --git a/examples/0301-paths-types-example.html b/examples/0301-paths-types-example.html index 85173bbe..f5d2983f 100644 --- a/examples/0301-paths-types-example.html +++ b/examples/0301-paths-types-example.html @@ -99,7 +99,7 @@ - +

      Types of paths

      diff --git a/examples/0302-paths-ajax-load-example.html b/examples/0302-paths-ajax-load-example.html index 5270de9a..263cec55 100644 --- a/examples/0302-paths-ajax-load-example.html +++ b/examples/0302-paths-ajax-load-example.html @@ -38,7 +38,7 @@ - +

      Load remote paths example

      Click on red route (Popup) or hover over green route (Label) to get more information

      diff --git a/examples/0303-paths-3000-items-example.html b/examples/0303-paths-3000-items-example.html index 1b186a72..a3af58e1 100644 --- a/examples/0303-paths-3000-items-example.html +++ b/examples/0303-paths-3000-items-example.html @@ -140,7 +140,7 @@ - +

      3000 items in a map performance

      diff --git a/examples/0304-paths-advanced-example.html b/examples/0304-paths-advanced-example.html index f7d65c70..ac6e89a3 100644 --- a/examples/0304-paths-advanced-example.html +++ b/examples/0304-paths-advanced-example.html @@ -154,7 +154,7 @@ - +

      Advanced Paths Example

      diff --git a/examples/0305-paths-change-in-group-layer-example.html b/examples/0305-paths-change-in-group-layer-example.html index 1267a2f9..c4d0d1f4 100644 --- a/examples/0305-paths-change-in-group-layer-example.html +++ b/examples/0305-paths-change-in-group-layer-example.html @@ -59,7 +59,7 @@ - +

      Path change in group layer

      diff --git a/examples/0306-paths-decorations-simple-example.html b/examples/0306-paths-decorations-simple-example.html index 0e12d702..b4b74fab 100644 --- a/examples/0306-paths-decorations-simple-example.html +++ b/examples/0306-paths-decorations-simple-example.html @@ -77,7 +77,7 @@ - +

      Path decoration example

      diff --git a/examples/0307-paths-events-example-with-id.html b/examples/0307-paths-events-example-with-id.html index ade6ab7e..8c3c0495 100644 --- a/examples/0307-paths-events-example-with-id.html +++ b/examples/0307-paths-events-example-with-id.html @@ -10,7 +10,7 @@ - +

      Paths specific events propagation exampl

      Click on path points to trigger an event

      Mouse over:

      diff --git a/examples/0307-paths-events-example.html b/examples/0307-paths-events-example.html index abb5925e..49efceae 100644 --- a/examples/0307-paths-events-example.html +++ b/examples/0307-paths-events-example.html @@ -10,7 +10,7 @@ - +

      Paths specific events propagation exampl

      Click on path points to trigger an event

      Mouse over:

      diff --git a/examples/0400-controls-custom-layer-control-example.html b/examples/0400-controls-custom-layer-control-example.html index e241a377..5eabe3a6 100644 --- a/examples/0400-controls-custom-layer-control-example.html +++ b/examples/0400-controls-custom-layer-control-example.html @@ -194,7 +194,7 @@ float: right; } - + diff --git a/examples/0401-controls-draw-example.html b/examples/0401-controls-draw-example.html index d9118eff..e64b590f 100644 --- a/examples/0401-controls-draw-example.html +++ b/examples/0401-controls-draw-example.html @@ -68,7 +68,7 @@ - +

      Draw control example

      Draw a shape and a geoJSON data structure will be shown on the console.log.

      diff --git a/examples/0403-controls-fullscreen-example.html b/examples/0403-controls-fullscreen-example.html index 392fb1e6..3fec32e5 100644 --- a/examples/0403-controls-fullscreen-example.html +++ b/examples/0403-controls-fullscreen-example.html @@ -37,7 +37,7 @@ - +

      Fullscreen control example

      Fullscreen control with the Leaflet fullscreen plugin.

      diff --git a/examples/0404-controls-minimap-example.html b/examples/0404-controls-minimap-example.html index 85724172..6d210749 100644 --- a/examples/0404-controls-minimap-example.html +++ b/examples/0404-controls-minimap-example.html @@ -51,7 +51,7 @@ - +

      Minimap control example

      Minimap control with the Leaflet minimap plugin.

      diff --git a/examples/0405-controls-search-example.html b/examples/0405-controls-search-example.html index 1c99863f..81c6fa44 100644 --- a/examples/0405-controls-search-example.html +++ b/examples/0405-controls-search-example.html @@ -103,7 +103,7 @@ - +

      Search control example

      Search for any of the marker names (mouseover to see the name). This is a simple example of use of Leaflet search plugin.

      diff --git a/examples/0406-controls-custom-example.html b/examples/0406-controls-custom-example.html index fc46ce1e..e5aa27b0 100644 --- a/examples/0406-controls-custom-example.html +++ b/examples/0406-controls-custom-example.html @@ -35,7 +35,7 @@ - +

      Fullscreen control example

      Fullscreen control with the Leaflet fullscreen plugin.

      diff --git a/examples/0500-markers-simple-example.html b/examples/0500-markers-simple-example.html index aa469eaf..97b123e1 100644 --- a/examples/0500-markers-simple-example.html +++ b/examples/0500-markers-simple-example.html @@ -47,9 +47,8 @@ - - +

      Markers simple example

      Initial marker position (lat/lng): /

      Actual marker position (lat/lng): /

      diff --git a/examples/0501-markers-events-add-example.html b/examples/0501-markers-events-add-example.html index 730d504b..5de8ad21 100644 --- a/examples/0501-markers-events-add-example.html +++ b/examples/0501-markers-events-add-example.html @@ -33,7 +33,7 @@ - +

      Markers with events example

      Click on the map to add a marker

      diff --git a/examples/0502-markers-add-remove-example.html b/examples/0502-markers-add-remove-example.html index 81f214ec..5003aef9 100644 --- a/examples/0502-markers-add-remove-example.html +++ b/examples/0502-markers-add-remove-example.html @@ -46,7 +46,7 @@ - +

      Add/remove markers easily example

      diff --git a/examples/0503-markers-icons-example.html b/examples/0503-markers-icons-example.html index 97e28278..c76ddad7 100644 --- a/examples/0503-markers-icons-example.html +++ b/examples/0503-markers-icons-example.html @@ -93,7 +93,7 @@ - +

      Changing the marker icons

      You can change the marker icons, using the default Leaflet marker icons functions, or using helper libraries like AwesomeMarkers, VectorMarkers, MakiMarkers or ExtraMarker.

      diff --git a/examples/0504-markers-popup-example.html b/examples/0504-markers-popup-example.html index 9e2b30a5..f7684128 100644 --- a/examples/0504-markers-popup-example.html +++ b/examples/0504-markers-popup-example.html @@ -43,7 +43,7 @@ - +

      Marker Popup properties

      Marker position

      Latitude: diff --git a/examples/0505-markers-label-example.html b/examples/0505-markers-label-example.html index 265754c4..183760f1 100644 --- a/examples/0505-markers-label-example.html +++ b/examples/0505-markers-label-example.html @@ -41,7 +41,7 @@ - +

      Marker with label example

      diff --git a/examples/0506-markers-groups-example.html b/examples/0506-markers-groups-example.html index 3cd1f739..3b01f5f0 100644 --- a/examples/0506-markers-groups-example.html +++ b/examples/0506-markers-groups-example.html @@ -110,7 +110,7 @@ - +

      Marker groups

      This is a map with two hidden marker groups, click here to hide or show the groups:

      diff --git a/examples/0507-markers-rotation-example.html b/examples/0507-markers-rotation-example.html index 23399e81..90c6ffd0 100644 --- a/examples/0507-markers-rotation-example.html +++ b/examples/0507-markers-rotation-example.html @@ -53,7 +53,7 @@ - +

      Changing Icon Rotation

      diff --git a/examples/0508-markers-change-opacity-example.html b/examples/0508-markers-change-opacity-example.html index 1a375e28..df3c19ea 100644 --- a/examples/0508-markers-change-opacity-example.html +++ b/examples/0508-markers-change-opacity-example.html @@ -29,7 +29,7 @@ - +

      Change icon opacity

      Move the slider to change the icon opacity.

      diff --git a/examples/0509-markers-clustering-example.html b/examples/0509-markers-clustering-example.html index 5e919345..3e9bb9bd 100644 --- a/examples/0509-markers-clustering-example.html +++ b/examples/0509-markers-clustering-example.html @@ -105,7 +105,7 @@ - +

      Marker clustering example

      You can create a marker-clustering group on the map, defining layers and your markers definition as this example.

      diff --git a/examples/0510-markers-clustering-without-overlays-example.html b/examples/0510-markers-clustering-without-overlays-example.html index d5d21e62..529ea4f3 100644 --- a/examples/0510-markers-clustering-without-overlays-example.html +++ b/examples/0510-markers-clustering-without-overlays-example.html @@ -78,7 +78,7 @@ - +

      Marker clustering example without layers

      diff --git a/examples/0511-markers-modal-markercluster-example.html b/examples/0511-markers-modal-markercluster-example.html index 53bd6da6..b4b7bb80 100644 --- a/examples/0511-markers-modal-markercluster-example.html +++ b/examples/0511-markers-modal-markercluster-example.html @@ -101,7 +101,7 @@

      Markercluster in a SemanticUI modal

      Modal map example
      - +
      Cancel
      diff --git a/examples/0512-markers-clustering-10000-markers-example.html b/examples/0512-markers-clustering-10000-markers-example.html index da9aec47..ece0942e 100644 --- a/examples/0512-markers-clustering-10000-markers-example.html +++ b/examples/0512-markers-clustering-10000-markers-example.html @@ -64,7 +64,7 @@ - +

      Marker clustering example (10000 markers)

      diff --git a/examples/0513-markers-events-example-with-id.html b/examples/0513-markers-events-example-with-id.html index d5a036d1..76923329 100644 --- a/examples/0513-markers-events-example-with-id.html +++ b/examples/0513-markers-events-example-with-id.html @@ -8,7 +8,7 @@ - +

      Marker Events example

      • event caught in listener.
      • diff --git a/examples/0513-markers-events-example.html b/examples/0513-markers-events-example.html index 6522b7e1..ca3ffc06 100644 --- a/examples/0513-markers-events-example.html +++ b/examples/0513-markers-events-example.html @@ -44,7 +44,7 @@ - +

        Marker Events example

        • event caught in listener.
        • diff --git a/examples/0514-markers-delayed-events.html b/examples/0514-markers-delayed-events.html index 514adfc4..a0f7d560 100644 --- a/examples/0514-markers-delayed-events.html +++ b/examples/0514-markers-delayed-events.html @@ -61,7 +61,7 @@ - +

          Markers delayed events example

          diff --git a/examples/0515-markers-angular-template-example.html b/examples/0515-markers-angular-template-example.html index cdf2660a..8d1e3df5 100644 --- a/examples/0515-markers-angular-template-example.html +++ b/examples/0515-markers-angular-template-example.html @@ -67,7 +67,7 @@ - +

          Markers angular template example

          diff --git a/examples/0516-markers-two-maps-events-example.html b/examples/0516-markers-two-maps-events-example.html index a848d771..abc04ece 100644 --- a/examples/0516-markers-two-maps-events-example.html +++ b/examples/0516-markers-two-maps-events-example.html @@ -114,8 +114,8 @@ - - + +

          Two maps with markers and events

          Click on any of the markers to show a popup with a message.

          diff --git a/examples/0517-markers-compiled-without-icon-example.html b/examples/0517-markers-compiled-without-icon-example.html new file mode 100644 index 00000000..9cca0464 --- /dev/null +++ b/examples/0517-markers-compiled-without-icon-example.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + +

          Changing Icon Rotation

          +
      + + diff --git a/examples/0600-mixed-image-legend-example.html b/examples/0600-mixed-image-legend-example.html index c001d61c..05494ad6 100644 --- a/examples/0600-mixed-image-legend-example.html +++ b/examples/0600-mixed-image-legend-example.html @@ -92,8 +92,8 @@

      Image Legend Service

      Use the button to switch another Layer with different legend.

      - +
      diff --git a/examples/0601-mixed-geojson-events-example-w-id.html b/examples/0601-mixed-geojson-events-example-w-id.html index afa0b056..4de95799 100644 --- a/examples/0601-mixed-geojson-events-example-w-id.html +++ b/examples/0601-mixed-geojson-events-example-w-id.html @@ -179,7 +179,7 @@ - +
      {{ selectedCountry.properties.name || 'No country'}} diff --git a/examples/0601-mixed-geojson-events-example.html b/examples/0601-mixed-geojson-events-example.html index 9908aa2f..0958a306 100644 --- a/examples/0601-mixed-geojson-events-example.html +++ b/examples/0601-mixed-geojson-events-example.html @@ -179,7 +179,7 @@ - +
      {{ selectedCountry.properties.name || 'No country'}} diff --git a/examples/0602-mixed-mapbox-tiles-geojson-example.html b/examples/0602-mixed-mapbox-tiles-geojson-example.html index 7c6e6a61..d1e7b750 100644 --- a/examples/0602-mixed-mapbox-tiles-geojson-example.html +++ b/examples/0602-mixed-mapbox-tiles-geojson-example.html @@ -37,7 +37,7 @@ - +

      Mapbox tiles and Mapbox GeoJSON loading

      
       
      diff --git a/examples/0603-mixed-layers-overlays-geojson-example.html b/examples/0603-mixed-layers-overlays-geojson-example.html
      index d691b298..591e1594 100644
      --- a/examples/0603-mixed-layers-overlays-geojson-example.html
      +++ b/examples/0603-mixed-layers-overlays-geojson-example.html
      @@ -75,7 +75,7 @@
           
       
       
      -    
      +    
           

      GeoJSON TileLayers

      Data source: Openstreetmap (buildings data)

      diff --git a/examples/0604-mixed-markers-nested-events-example.html b/examples/0604-mixed-markers-nested-events-example.html index d79e95ed..af9e698c 100644 --- a/examples/0604-mixed-markers-nested-events-example.html +++ b/examples/0604-mixed-markers-nested-events-example.html @@ -75,11 +75,11 @@ diff --git a/examples/0605-mixed-overlays-markers-nested-no-watch-example.html b/examples/0605-mixed-overlays-markers-nested-no-watch-example.html index 53b7b783..ae884c2e 100644 --- a/examples/0605-mixed-overlays-markers-nested-no-watch-example.html +++ b/examples/0605-mixed-overlays-markers-nested-no-watch-example.html @@ -156,8 +156,8 @@ diff --git a/examples/0606-mixed-esri-legend-service-example.html b/examples/0606-mixed-esri-legend-service-example.html index 5e1a23ca..8f6d85c1 100644 --- a/examples/0606-mixed-esri-legend-service-example.html +++ b/examples/0606-mixed-esri-legend-service-example.html @@ -142,8 +142,8 @@ - +

      Esri ArcGIS Legend Service

      Use the button to switch another Esri Legend.


      diff --git a/examples/0607-mixed-esri-multilayer-legend-service-example.html b/examples/0607-mixed-esri-multilayer-legend-service-example.html index 1919d19c..648dbc16 100644 --- a/examples/0607-mixed-esri-multilayer-legend-service-example.html +++ b/examples/0607-mixed-esri-multilayer-legend-service-example.html @@ -142,8 +142,8 @@ - +

      Esri ArcGIS Multilayer Legend Service

      Use the button to switch another Esri Legend.


      diff --git a/examples/js/controllers.js b/examples/js/controllers.js index e4fe5736..7f494ba2 100644 --- a/examples/js/controllers.js +++ b/examples/js/controllers.js @@ -1,6 +1,6 @@ (function(angular){ var app = angular.module('webapp'); - app.controller("BasicAccessLeafletObjectController", [ "$scope", "$log", "leafletData", function($scope, $log, leafletData) { + app.controller("BasicAccessLeafletObjectController", [ "$scope", "leafletLogger", "leafletData", function($scope, leafletLogger, leafletData) { angular.extend($scope, { london: { lat: 51.505, @@ -103,7 +103,7 @@ var app = angular.module('webapp'); } }); }]); - app.controller("BasicDoubleMapAccessMapObjectController", [ "$scope", "$log", "leafletData", function($scope, $log, leafletData) { + app.controller("BasicDoubleMapAccessMapObjectController", [ "$scope", "leafletLogger", "leafletData", function($scope, leafletLogger, leafletData) { angular.extend($scope, { london: { lat: 51.505, @@ -123,11 +123,11 @@ var app = angular.module('webapp'); }); $scope.logLeafletData = function(name) { leafletData.getMap(name).then(function(map) { - $log.info(map); + leafletLogger.info(map); }); }; }]); - app.controller("BasicDoubleMapEventsController", [ "$scope", "$log", "leafletData", "leafletEvents", function($scope, $log, leafletData, leafletEvents) { + app.controller("BasicDoubleMapEventsController", [ "$scope", "leafletLogger", "leafletData", "leafletEvents", function($scope, leafletLogger, leafletData, leafletEvents) { angular.extend($scope, { london: { lat: 51.505, @@ -189,7 +189,7 @@ var app = angular.module('webapp'); }); } }]); - app.controller("BasicDoubleMapSharingAttributesController", [ "$scope", "$log", "$http", "leafletData", function($scope, $log, $http, leafletData) { + app.controller("BasicDoubleMapSharingAttributesController", [ "$scope", "leafletLogger", "$http", "leafletData", function($scope, leafletLogger, $http, leafletData) { angular.extend($scope, { center: { lat: 43.7350, @@ -231,7 +231,7 @@ var app = angular.module('webapp'); $scope.toronto2 = data; }); }]); - app.controller("BasicDoubleMapToggleController", [ "$scope", "$log", "leafletData", function($scope, $log, leafletData) { + app.controller("BasicDoubleMapToggleController", [ "$scope", "leafletLogger", "leafletData", function($scope, leafletLogger, leafletData) { angular.extend($scope, { center: { lat: 51.505, @@ -424,15 +424,6 @@ var app = angular.module('webapp'); } }); }); - app.controller('BasicLFCenterController', [ '$scope', function($scope) { - angular.extend($scope, { - london: { - lat: 51.505, - lng: -0.09, - zoom: 4 - } - }); - }]); app.controller('BasicLegendController', [ '$scope', function($scope) { angular.extend($scope, { london: { @@ -2064,8 +2055,8 @@ var app = angular.module('webapp'); } }); }]); - app.controller("LayersImageOverlayController", [ "$scope", "$log", "leafletData", "leafletBoundsHelpers", function($scope, $log, leafletData, leafletBoundsHelpers) { - var maxBounds = leafletBoundsHelpers.createBoundsFromArray([[-540, -960], [540, 960]]); + app.controller("LayersImageOverlayController", [ "$scope", "leafletLogger", "leafletData", "leafletBoundsHelpers", function($scope, leafletLogger, leafletData, leafletBoundsHelpers) { + var maxbounds = leafletBoundsHelpers.createBoundsFromArray([[-540, -960], [540, 960]]); angular.extend($scope, { defaults: { scrollWheelZoom: false, @@ -2077,7 +2068,7 @@ var app = angular.module('webapp'); lng: 0, zoom: 0 }, - maxBounds: maxBounds, + maxbounds: maxbounds, layers: { baselayers: { sanfrancisco: { @@ -3279,6 +3270,52 @@ var app = angular.module('webapp'); }, }); } ]); + app.controller('MarkersCompiledWithoutIconController', [ '$scope', function($scope) { + $scope.setSourceMarker = function () { + alert($scope.markers.popup.lat + " " + $scope.markers.popup.lng) + } + $scope.setDestinationMarker = function () { + alert($scope.markers.popup.lat + " " + $scope.markers.popup.lng) + }; + var getNewPopupMarker = function(lat, lng) { + return { + lat: lat, + lng: lng, + focus: true, + opacity: 1, + icon: { + iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wsIFR0j2j5hUQAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC', // Transparent pixel + iconSize: [0, 0], // size of the icon + popupAnchor: [0, 0] // point from which the popup should open relative to the iconAnchor + }, + message: " \ + ", + getMessageScope: function () { + return $scope; + }, + }; + }; + $scope.$on("leafletDirectiveMap.click", function (event, args) { + var leafEvent = args.leafletEvent; + var lat = leafEvent.latlng.lat; + var lng = leafEvent.latlng.lng; + $scope.markers.popup.lat = lat; + $scope.markers.popup.lng = lng; + $scope.markers.popup.focus = true; + }); + angular.extend($scope, { + chicago: { + lat: 41.85, + lng: -87.65, + zoom: 8 + }, + markers: { + popup: getNewPopupMarker(41.85, -87.65) + } + }); + }]); app.controller("MarkersDelayedEventsController", ["$scope", "leafletEvents", function($scope, leafletEvents){ angular.extend($scope, { london: { @@ -3343,7 +3380,7 @@ var app = angular.module('webapp'); }); }); } ]); - app.controller("MarkersEventsController", [ "$scope", "leafletMarkerEvents", "$log", function($scope, leafletMarkerEvents, $log) { + app.controller("MarkersEventsController", [ "$scope", "leafletMarkerEvents", "leafletLogger", function($scope, leafletMarkerEvents, leafletLogger) { $scope.center = { lat: 51.505, lng: -0.09, @@ -4301,7 +4338,7 @@ var app = angular.module('webapp'); }); } }]); - app.controller("PathEventsController", function($scope, $log) { + app.controller("PathEventsController", function($scope, leafletLogger) { var paths = {}; $scope.clicked = 0; var marylandIslands = { @@ -4358,7 +4395,7 @@ var app = angular.module('webapp'); $scope.mouseover = path.modelName; }); }); - app.controller("PathEventsWithIDController", function($scope, $log) { + app.controller("PathEventsWithIDController", function($scope, leafletLogger) { var paths = {}; $scope.clicked = 0; var marylandIslands = { diff --git a/examples/js/controllers/BasicAccessLeafletObjectController.js b/examples/js/controllers/BasicAccessLeafletObjectController.js index 89b6ef94..9a64d534 100644 --- a/examples/js/controllers/BasicAccessLeafletObjectController.js +++ b/examples/js/controllers/BasicAccessLeafletObjectController.js @@ -1,4 +1,4 @@ - app.controller("BasicAccessLeafletObjectController", [ "$scope", "$log", "leafletData", function($scope, $log, leafletData) { + app.controller("BasicAccessLeafletObjectController", [ "$scope", "leafletLogger", "leafletData", function($scope, leafletLogger, leafletData) { angular.extend($scope, { london: { lat: 51.505, diff --git a/examples/js/controllers/BasicDoubleMapAccessMapObjectController.js b/examples/js/controllers/BasicDoubleMapAccessMapObjectController.js index 0a2059e2..cdd17493 100644 --- a/examples/js/controllers/BasicDoubleMapAccessMapObjectController.js +++ b/examples/js/controllers/BasicDoubleMapAccessMapObjectController.js @@ -1,4 +1,4 @@ - app.controller("BasicDoubleMapAccessMapObjectController", [ "$scope", "$log", "leafletData", function($scope, $log, leafletData) { + app.controller("BasicDoubleMapAccessMapObjectController", [ "$scope", "leafletLogger", "leafletData", function($scope, leafletLogger, leafletData) { angular.extend($scope, { london: { lat: 51.505, @@ -18,7 +18,7 @@ }); $scope.logLeafletData = function(name) { leafletData.getMap(name).then(function(map) { - $log.info(map); + leafletLogger.info(map); }); }; }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicDoubleMapEventsController.js b/examples/js/controllers/BasicDoubleMapEventsController.js index 825759cc..800fcc22 100644 --- a/examples/js/controllers/BasicDoubleMapEventsController.js +++ b/examples/js/controllers/BasicDoubleMapEventsController.js @@ -1,4 +1,4 @@ - app.controller("BasicDoubleMapEventsController", [ "$scope", "$log", "leafletData", "leafletEvents", function($scope, $log, leafletData, leafletEvents) { + app.controller("BasicDoubleMapEventsController", [ "$scope", "leafletLogger", "leafletData", "leafletEvents", function($scope, leafletLogger, leafletData, leafletEvents) { angular.extend($scope, { london: { lat: 51.505, diff --git a/examples/js/controllers/BasicDoubleMapSharingAttributesController.js b/examples/js/controllers/BasicDoubleMapSharingAttributesController.js index 53bb46cd..e76be520 100644 --- a/examples/js/controllers/BasicDoubleMapSharingAttributesController.js +++ b/examples/js/controllers/BasicDoubleMapSharingAttributesController.js @@ -1,4 +1,4 @@ - app.controller("BasicDoubleMapSharingAttributesController", [ "$scope", "$log", "$http", "leafletData", function($scope, $log, $http, leafletData) { + app.controller("BasicDoubleMapSharingAttributesController", [ "$scope", "leafletLogger", "$http", "leafletData", function($scope, leafletLogger, $http, leafletData) { angular.extend($scope, { center: { lat: 43.7350, diff --git a/examples/js/controllers/BasicDoubleMapToggleController.js b/examples/js/controllers/BasicDoubleMapToggleController.js index bdc75862..f5a0b2cf 100644 --- a/examples/js/controllers/BasicDoubleMapToggleController.js +++ b/examples/js/controllers/BasicDoubleMapToggleController.js @@ -1,4 +1,4 @@ - app.controller("BasicDoubleMapToggleController", [ "$scope", "$log", "leafletData", function($scope, $log, leafletData) { + app.controller("BasicDoubleMapToggleController", [ "$scope", "leafletLogger", "leafletData", function($scope, leafletLogger, leafletData) { angular.extend($scope, { center: { lat: 51.505, diff --git a/examples/js/controllers/BasicLFCenterController.js b/examples/js/controllers/BasicLFCenterController.js deleted file mode 100644 index a4414253..00000000 --- a/examples/js/controllers/BasicLFCenterController.js +++ /dev/null @@ -1,9 +0,0 @@ - app.controller('BasicLFCenterController', [ '$scope', function($scope) { - angular.extend($scope, { - london: { - lat: 51.505, - lng: -0.09, - zoom: 4 - } - }); - }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersImageOverlayController.js b/examples/js/controllers/LayersImageOverlayController.js index 0b1bc162..4f201abb 100644 --- a/examples/js/controllers/LayersImageOverlayController.js +++ b/examples/js/controllers/LayersImageOverlayController.js @@ -1,5 +1,5 @@ - app.controller("LayersImageOverlayController", [ "$scope", "$log", "leafletData", "leafletBoundsHelpers", function($scope, $log, leafletData, leafletBoundsHelpers) { - var maxBounds = leafletBoundsHelpers.createBoundsFromArray([[-540, -960], [540, 960]]); + app.controller("LayersImageOverlayController", [ "$scope", "leafletLogger", "leafletData", "leafletBoundsHelpers", function($scope, leafletLogger, leafletData, leafletBoundsHelpers) { + var maxbounds = leafletBoundsHelpers.createBoundsFromArray([[-540, -960], [540, 960]]); angular.extend($scope, { defaults: { scrollWheelZoom: false, @@ -11,7 +11,7 @@ lng: 0, zoom: 0 }, - maxBounds: maxBounds, + maxbounds: maxbounds, layers: { baselayers: { sanfrancisco: { diff --git a/examples/js/controllers/MarkersCompiledWithoutIconController.js b/examples/js/controllers/MarkersCompiledWithoutIconController.js new file mode 100644 index 00000000..3d311bc9 --- /dev/null +++ b/examples/js/controllers/MarkersCompiledWithoutIconController.js @@ -0,0 +1,46 @@ + app.controller('MarkersCompiledWithoutIconController', [ '$scope', function($scope) { + $scope.setSourceMarker = function () { + alert($scope.markers.popup.lat + " " + $scope.markers.popup.lng) + } + $scope.setDestinationMarker = function () { + alert($scope.markers.popup.lat + " " + $scope.markers.popup.lng) + }; + var getNewPopupMarker = function(lat, lng) { + return { + lat: lat, + lng: lng, + focus: true, + opacity: 1, + icon: { + iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wsIFR0j2j5hUQAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC', // Transparent pixel + iconSize: [0, 0], // size of the icon + popupAnchor: [0, 0] // point from which the popup should open relative to the iconAnchor + }, + message: " \ + ", + getMessageScope: function () { + return $scope; + }, + }; + }; + $scope.$on("leafletDirectiveMap.click", function (event, args) { + var leafEvent = args.leafletEvent; + var lat = leafEvent.latlng.lat; + var lng = leafEvent.latlng.lng; + $scope.markers.popup.lat = lat; + $scope.markers.popup.lng = lng; + $scope.markers.popup.focus = true; + }); + angular.extend($scope, { + chicago: { + lat: 41.85, + lng: -87.65, + zoom: 8 + }, + markers: { + popup: getNewPopupMarker(41.85, -87.65) + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersEventsController.js b/examples/js/controllers/MarkersEventsController.js index a51f6620..8a2f1045 100644 --- a/examples/js/controllers/MarkersEventsController.js +++ b/examples/js/controllers/MarkersEventsController.js @@ -1,4 +1,4 @@ - app.controller("MarkersEventsController", [ "$scope", "leafletMarkerEvents", "$log", function($scope, leafletMarkerEvents, $log) { + app.controller("MarkersEventsController", [ "$scope", "leafletMarkerEvents", "leafletLogger", function($scope, leafletMarkerEvents, leafletLogger) { $scope.center = { lat: 51.505, lng: -0.09, diff --git a/examples/js/controllers/PathEventsController.js b/examples/js/controllers/PathEventsController.js index 3529afad..86fd94ea 100644 --- a/examples/js/controllers/PathEventsController.js +++ b/examples/js/controllers/PathEventsController.js @@ -1,4 +1,4 @@ - app.controller("PathEventsController", function($scope, $log) { + app.controller("PathEventsController", function($scope, leafletLogger) { var paths = {}; $scope.clicked = 0; var marylandIslands = { diff --git a/examples/js/controllers/PathEventsWithIDController.js b/examples/js/controllers/PathEventsWithIDController.js index f2be21dd..31934de6 100644 --- a/examples/js/controllers/PathEventsWithIDController.js +++ b/examples/js/controllers/PathEventsWithIDController.js @@ -1,4 +1,4 @@ - app.controller("PathEventsWithIDController", function($scope, $log) { + app.controller("PathEventsWithIDController", function($scope, leafletLogger) { var paths = {}; $scope.clicked = 0; var marylandIslands = { diff --git a/examples/json/examples.json b/examples/json/examples.json index 932c32e3..549e8374 100644 --- a/examples/json/examples.json +++ b/examples/json/examples.json @@ -1,7 +1,7 @@ { "basic": [ { - "date": "2015-11-04T20:42:52.113Z", + "date": "2015-11-04T21:23:50.270Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/first-example", @@ -9,7 +9,7 @@ "title": "First steps, basic example" }, { - "date": "2015-11-04T20:42:55.670Z", + "date": "2015-11-07T07:53:27.457Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/center-example", @@ -17,15 +17,7 @@ "title": "Center map example" }, { - "date": "2015-11-04T20:42:59.576Z", - "section": "basic", - "onlyStandAlone": false, - "id": "/basic/lf-center-example", - "extUrl": "0101-basic-lf-center-example.html", - "title": "Center map example" - }, - { - "date": "2015-11-04T20:43:03.340Z", + "date": "2015-11-06T19:56:51.699Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/center-autodiscover-example", @@ -33,7 +25,7 @@ "title": "Center autodiscover example" }, { - "date": "2015-11-04T20:43:07.060Z", + "date": "2015-11-06T19:56:51.699Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/center-url-hash-example", @@ -41,7 +33,7 @@ "title": "Center map with URL synchronization example" }, { - "date": "2015-11-04T20:43:10.816Z", + "date": "2015-11-08T11:47:56.436Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/custom-parameters-example", @@ -49,7 +41,7 @@ "title": "Using custom default parameters" }, { - "date": "2015-11-04T20:43:14.396Z", + "date": "2015-11-08T11:47:56.436Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/bounds-example", @@ -57,7 +49,7 @@ "title": "Map bounds example" }, { - "date": "2015-11-04T20:43:17.583Z", + "date": "2015-11-08T11:47:56.436Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/maxbounds-example", @@ -65,7 +57,7 @@ "title": "Setting MaxBounds in a map" }, { - "date": "2015-11-04T20:43:21.003Z", + "date": "2015-11-08T11:47:56.436Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/tiles-example", @@ -73,7 +65,7 @@ "title": "Changing tiles example" }, { - "date": "2015-11-04T20:43:25.650Z", + "date": "2015-11-08T11:47:56.436Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/tiles-zoom-changer-example", @@ -81,7 +73,7 @@ "title": "Dynamic tile changer based on zoom level" }, { - "date": "2015-11-04T20:43:28.720Z", + "date": "2015-11-06T19:56:51.699Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/center-geoip-example", @@ -89,7 +81,7 @@ "title": "Center by IP (GeoIP) example" }, { - "date": "2015-11-04T20:43:32.083Z", + "date": "2015-11-08T11:47:56.436Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/map-without-animations-example", @@ -97,7 +89,7 @@ "title": "Map with disabled animations example" }, { - "date": "2015-11-04T20:43:35.836Z", + "date": "2015-11-08T11:47:56.440Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/legend-example", @@ -105,7 +97,7 @@ "title": "Legend example" }, { - "date": "2015-11-04T20:43:39.126Z", + "date": "2015-11-08T11:47:56.440Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/maxbounds-pad-example", @@ -113,7 +105,7 @@ "title": "Extend Maxbounds with Pad" }, { - "date": "2015-11-04T20:43:42.546Z", + "date": "2015-11-08T11:47:56.440Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/geojson-simple-example", @@ -121,7 +113,7 @@ "title": "Simple GeoJSON example" }, { - "date": "2015-11-04T20:43:46.313Z", + "date": "2015-11-08T11:47:56.440Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/geojson-center-example", @@ -129,7 +121,7 @@ "title": "Center to GeoJSON example" }, { - "date": "2015-11-04T20:43:50.956Z", + "date": "2015-11-06T19:56:51.703Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/events-example", @@ -137,7 +129,7 @@ "title": "Events example" }, { - "date": "2015-11-04T20:43:54.416Z", + "date": "2015-11-08T11:47:56.440Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/access-leaflet-object-example", @@ -145,7 +137,7 @@ "title": "Direct access to the Leaflet Map Object" }, { - "date": "2015-11-04T20:43:57.606Z", + "date": "2015-11-04T21:23:50.273Z", "section": "basic", "onlyStandAlone": true, "id": "/basic/routing-show-hide-map-example", @@ -153,7 +145,7 @@ "title": "Angular routing show/hide map example" }, { - "date": "2015-11-04T20:44:05.156Z", + "date": "2015-11-08T11:47:56.440Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/double-map-events-example", @@ -161,7 +153,7 @@ "title": "Different map events broadcasting" }, { - "date": "2015-11-04T20:44:01.656Z", + "date": "2015-11-08T11:47:56.440Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/double-map-access-map-object-example", @@ -169,7 +161,7 @@ "title": "Accesing the map object with two (or more) maps on screen" }, { - "date": "2015-11-04T20:44:08.740Z", + "date": "2015-11-08T11:47:56.440Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/double-map-sharing-attributes-example", @@ -177,7 +169,7 @@ "title": "Two maps sharing center example" }, { - "date": "2015-11-04T20:44:12.456Z", + "date": "2015-11-08T11:47:56.440Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/double-map-toggle-example", @@ -185,7 +177,7 @@ "title": "Toggle between two maps on screen" }, { - "date": "2015-11-04T20:44:15.820Z", + "date": "2015-11-08T11:47:56.440Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/geojson-update-example", @@ -193,7 +185,7 @@ "title": "GeoJSON update example" }, { - "date": "2015-11-04T20:44:19.080Z", + "date": "2015-11-06T19:56:51.703Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/hide-show-map-example", @@ -201,7 +193,7 @@ "title": "Hide/Show map example" }, { - "date": "2015-11-04T20:44:24.493Z", + "date": "2015-11-08T11:47:56.440Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/geojson-non-nested-example", @@ -209,7 +201,7 @@ "title": "GeoJSON non nested example" }, { - "date": "2015-11-04T20:44:28.033Z", + "date": "2015-11-08T11:47:56.440Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/geojson-nested-example", @@ -217,7 +209,7 @@ "title": "GeoJSON nested example" }, { - "date": "2015-11-04T20:44:31.510Z", + "date": "2015-11-08T11:47:56.443Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/bounds-nominatim-example", @@ -225,17 +217,17 @@ "title": "Bounds Nominatim map example" }, { - "date": "2015-11-04T20:44:35.190Z", + "date": "2015-11-08T11:47:56.443Z", "section": "basic", "onlyStandAlone": false, "id": "/basic/tiles-wms-example", "extUrl": "0127-basic-tiles-wms-example.html", - "title": "Loading WMS tilesDict example" + "title": "Loading WMS tiles example" } ], "layers": [ { - "date": "2015-11-04T20:44:38.906Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/simple-example", @@ -243,7 +235,7 @@ "title": "Layers simple example" }, { - "date": "2015-11-04T20:44:42.246Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/overlays-simple-example", @@ -251,7 +243,7 @@ "title": "Baselayer with overlays" }, { - "date": "2015-11-04T20:44:45.690Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/imageoverlay-example", @@ -259,7 +251,7 @@ "title": "Layer with image overlay and maxBounds" }, { - "date": "2015-11-04T20:44:49.193Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/dynamic-addition-example", @@ -267,7 +259,7 @@ "title": "Dynamic addition/removal of layers" }, { - "date": "2015-11-04T20:44:52.556Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/googlemaps-example", @@ -275,7 +267,7 @@ "title": "Google maps example" }, { - "date": "2015-11-04T20:44:56.063Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/googlemaps-fullsize-example", @@ -283,7 +275,7 @@ "title": "Google Maps fullsize example" }, { - "date": "2015-11-04T20:44:59.666Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/hide-baselayer-on-selector-example", @@ -291,7 +283,7 @@ "title": "Baselayer hidden on switch selector to show only overlay" }, { - "date": "2015-11-04T20:45:03.666Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/esri-dynamic-layer-example", @@ -299,7 +291,7 @@ "title": "Esri ArcGIS Dynamic Map Layer" }, { - "date": "2015-11-04T20:45:07.320Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/esri-legend-service-example", @@ -307,7 +299,7 @@ "title": "Esri ArcGIS Legend Service" }, { - "date": "2015-11-04T20:45:10.783Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/webgl-heatmap-example", @@ -315,7 +307,7 @@ "title": "HeatMap WebGL overlay example" }, { - "date": "2015-11-04T20:45:14.183Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/layergroup-simple-example", @@ -323,7 +315,7 @@ "title": "Layer Groups with nested layer definitions" }, { - "date": "2015-11-04T20:45:17.673Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/hide-overlays-on-selector-example", @@ -331,7 +323,7 @@ "title": "Overlay not shown in selector" }, { - "date": "2015-11-04T20:45:22.956Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/bingmaps-example", @@ -339,7 +331,7 @@ "title": "Bing maps" }, { - "date": "2015-11-04T20:45:26.233Z", + "date": "2015-11-08T11:47:56.443Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/utfgrid-example", @@ -347,7 +339,7 @@ "title": "Baselayer with UTFGrid interactivity in Overlay" }, { - "date": "2015-11-04T20:45:30.336Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/overlays-markercluster-example", @@ -355,7 +347,7 @@ "title": "This is a map with overlays and a markercluster" }, { - "date": "2015-11-04T20:45:33.766Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/overlays-markers-nested-example", @@ -363,7 +355,7 @@ "title": "Layers and overlays with nested markers example" }, { - "date": "2015-11-04T20:45:37.353Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/overlays-paths-example", @@ -371,7 +363,7 @@ "title": "Different overlays for paths" }, { - "date": "2015-11-04T20:45:40.563Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/wms-with-different-projection-example", @@ -379,7 +371,7 @@ "title": "Load a map in non standard projection" }, { - "date": "2015-11-04T20:45:43.616Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/heatmap-example", @@ -387,7 +379,7 @@ "title": "HeatMap example" }, { - "date": "2015-11-04T20:45:46.940Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/overlays-hide-on-zoomout-example", @@ -395,7 +387,7 @@ "title": "Baselayer with overlay which is hidden on Zoom less than 4 " }, { - "date": "2015-11-04T20:45:51.923Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/refresh-overlay-every-minute-example", @@ -403,7 +395,7 @@ "title": "Refreshable overlays example" }, { - "date": "2015-11-04T20:45:55.230Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/esri-base-layer-example", @@ -411,7 +403,7 @@ "title": "Esri ArcGIS Basemap Layer" }, { - "date": "2015-11-04T20:45:58.553Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/esri-feature-layer-example", @@ -419,7 +411,7 @@ "title": "Esri ArcGIS Feature Layer" }, { - "date": "2015-11-04T20:46:02.083Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/esri-tiled-map-layer-example", @@ -427,7 +419,7 @@ "title": "Esri ArcGIS Tiled Map Layer" }, { - "date": "2015-11-04T20:46:05.456Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/esri-image-layer-example", @@ -435,7 +427,7 @@ "title": "Esri ArcGIS Image Layer" }, { - "date": "2015-11-04T20:46:09.446Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/esri-clustered-layer-example", @@ -443,7 +435,7 @@ "title": "Esri ArcGIS Clustered Layer" }, { - "date": "2015-11-04T20:46:14.750Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/esri-heatmap-layer-example", @@ -451,7 +443,7 @@ "title": "Esri ArcGIS Heatmap Layer" }, { - "date": "2015-11-04T20:46:18.423Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/yandex-example", @@ -459,7 +451,7 @@ "title": "Yandex layer example" }, { - "date": "2015-11-04T20:46:21.683Z", + "date": "2015-11-08T11:47:56.446Z", "section": "layers", "onlyStandAlone": false, "id": "/layers/overlay-geojson-example", @@ -469,7 +461,7 @@ ], "paths": [ { - "date": "2015-11-04T20:46:24.996Z", + "date": "2015-11-08T11:47:56.450Z", "section": "paths", "onlyStandAlone": false, "id": "/paths/simple-example", @@ -477,7 +469,7 @@ "title": "Paths simple example" }, { - "date": "2015-11-04T20:46:28.110Z", + "date": "2015-11-08T11:47:56.450Z", "section": "paths", "onlyStandAlone": false, "id": "/paths/types-example", @@ -485,7 +477,7 @@ "title": "Types of paths" }, { - "date": "2015-11-04T20:46:31.426Z", + "date": "2015-11-08T11:47:56.450Z", "section": "paths", "onlyStandAlone": false, "id": "/paths/ajax-load-example", @@ -493,7 +485,7 @@ "title": "Load remote paths example" }, { - "date": "2015-11-04T20:46:35.436Z", + "date": "2015-11-08T11:47:56.450Z", "section": "paths", "onlyStandAlone": false, "id": "/paths/3000-items-example", @@ -501,7 +493,7 @@ "title": "3000 items in a map performance" }, { - "date": "2015-11-04T20:46:38.863Z", + "date": "2015-11-08T11:47:56.450Z", "section": "paths", "onlyStandAlone": false, "id": "/paths/advanced-example", @@ -509,7 +501,7 @@ "title": "Advanced Paths Example" }, { - "date": "2015-11-04T20:46:42.513Z", + "date": "2015-11-08T11:47:56.450Z", "section": "paths", "onlyStandAlone": false, "id": "/paths/change-in-group-layer-example", @@ -517,7 +509,7 @@ "title": "Path change in group layer" }, { - "date": "2015-11-04T20:46:45.923Z", + "date": "2015-11-08T11:47:56.450Z", "section": "paths", "onlyStandAlone": false, "id": "/paths/decorations-simple-example", @@ -525,7 +517,7 @@ "title": "Path decoration example" }, { - "date": "2015-11-04T21:20:05.410Z", + "date": "2015-11-08T11:47:56.450Z", "section": "paths", "onlyStandAlone": false, "id": "/paths/events-example-with-id", @@ -533,7 +525,7 @@ "title": "Paths specific events propagation exampl" }, { - "date": "2015-11-04T21:19:28.183Z", + "date": "2015-11-08T11:47:56.450Z", "section": "paths", "onlyStandAlone": false, "id": "/paths/events-example", @@ -543,7 +535,7 @@ ], "controls": [ { - "date": "2015-11-04T20:46:55.920Z", + "date": "2015-11-08T11:47:56.450Z", "section": "controls", "onlyStandAlone": false, "id": "/controls/custom-layer-control-example", @@ -551,7 +543,7 @@ "title": "Dynamic addition and deletion of Overlays control" }, { - "date": "2015-11-04T20:46:59.943Z", + "date": "2015-11-08T11:47:56.450Z", "section": "controls", "onlyStandAlone": false, "id": "/controls/draw-example", @@ -559,7 +551,7 @@ "title": "Draw control example" }, { - "date": "2015-11-04T20:47:04.940Z", + "date": "2015-11-06T19:56:51.716Z", "section": "controls", "onlyStandAlone": false, "id": "/controls/scale-example", @@ -567,7 +559,7 @@ "title": "Scale control example" }, { - "date": "2015-11-04T20:47:08.293Z", + "date": "2015-11-08T11:47:56.450Z", "section": "controls", "onlyStandAlone": false, "id": "/controls/fullscreen-example", @@ -575,7 +567,7 @@ "title": "Fullscreen control example" }, { - "date": "2015-11-04T20:47:11.930Z", + "date": "2015-11-08T11:47:56.450Z", "section": "controls", "onlyStandAlone": false, "id": "/controls/minimap-example", @@ -583,7 +575,7 @@ "title": "Minimap control example" }, { - "date": "2015-11-04T20:47:15.526Z", + "date": "2015-11-08T11:47:56.450Z", "section": "controls", "onlyStandAlone": false, "id": "/controls/search-example", @@ -591,7 +583,7 @@ "title": "Search control example" }, { - "date": "2015-11-04T20:47:18.690Z", + "date": "2015-11-08T11:47:56.450Z", "section": "controls", "onlyStandAlone": false, "id": "/controls/custom-example", @@ -601,7 +593,7 @@ ], "markers": [ { - "date": "2015-11-04T20:47:21.896Z", + "date": "2015-11-08T11:47:56.450Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/simple-example", @@ -609,7 +601,7 @@ "title": "Markers simple example" }, { - "date": "2015-11-04T20:47:25.256Z", + "date": "2015-11-08T11:47:56.450Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/events-add-example", @@ -617,7 +609,7 @@ "title": "Markers with events example" }, { - "date": "2015-11-04T20:47:28.810Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/add-remove-example", @@ -625,7 +617,7 @@ "title": "Add/remove markers easily example" }, { - "date": "2015-11-04T20:47:32.033Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/icons-example", @@ -633,7 +625,7 @@ "title": "Changing the marker icons" }, { - "date": "2015-11-04T20:47:37.293Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/popup-example", @@ -641,7 +633,7 @@ "title": "Marker Popup properties" }, { - "date": "2015-11-04T20:47:40.513Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/label-example", @@ -649,7 +641,7 @@ "title": "Marker with label example" }, { - "date": "2015-11-04T20:47:44.880Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/groups-example", @@ -657,7 +649,7 @@ "title": "Marker groups" }, { - "date": "2015-11-04T20:47:48.606Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/rotation-example", @@ -665,7 +657,7 @@ "title": "Changing Icon Rotation" }, { - "date": "2015-11-04T20:47:52.536Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/change-opacity-example", @@ -673,7 +665,7 @@ "title": "Change icon opacity" }, { - "date": "2015-11-04T20:47:56.913Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/clustering-example", @@ -681,7 +673,7 @@ "title": "Marker clustering example" }, { - "date": "2015-11-04T20:48:01.010Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/clustering-without-overlays-example", @@ -689,7 +681,7 @@ "title": "Marker clustering example without layers" }, { - "date": "2015-11-04T20:48:05.473Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/modal-markercluster-example", @@ -697,7 +689,7 @@ "title": "Markercluster in a SemanticUI modal" }, { - "date": "2015-11-04T20:48:10.166Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/clustering-10000-markers-example", @@ -705,7 +697,7 @@ "title": "Marker clustering example (10000 markers)" }, { - "date": "2015-11-04T21:19:51.237Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/events-example-with-id", @@ -713,7 +705,7 @@ "title": "Marker Events example" }, { - "date": "2015-11-04T20:48:17.390Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/events-example", @@ -721,7 +713,7 @@ "title": "Marker Events example" }, { - "date": "2015-11-04T20:48:20.490Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/delayed-events", @@ -729,7 +721,7 @@ "title": "Markers delayed events example" }, { - "date": "2015-11-04T20:48:24.070Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/angular-template-example", @@ -737,17 +729,25 @@ "title": "Markers angular template example" }, { - "date": "2015-11-04T20:48:28.303Z", + "date": "2015-11-08T11:47:56.453Z", "section": "markers", "onlyStandAlone": false, "id": "/markers/two-maps-events-example", "extUrl": "0516-markers-two-maps-events-example.html", "title": "Two maps with markers and events" + }, + { + "date": "2015-11-09T06:57:56.476Z", + "section": "markers", + "onlyStandAlone": false, + "id": "/markers/compiled-without-icon-example", + "extUrl": "0517-markers-compiled-without-icon-example.html", + "title": "Changing Icon Rotation" } ], "mixed": [ { - "date": "2015-11-04T20:48:34.176Z", + "date": "2015-11-08T11:47:56.456Z", "section": "mixed", "onlyStandAlone": false, "id": "/mixed/image-legend-example", @@ -755,7 +755,7 @@ "title": "Image Legend Service" }, { - "date": "2015-11-04T20:48:37.930Z", + "date": "2015-11-08T11:47:56.456Z", "section": "mixed", "onlyStandAlone": false, "id": "/mixed/geojson-events-example-w-id", @@ -763,7 +763,7 @@ "title": "World map flags example" }, { - "date": "2015-11-04T20:48:41.520Z", + "date": "2015-11-08T11:47:56.456Z", "section": "mixed", "onlyStandAlone": false, "id": "/mixed/geojson-events-example", @@ -771,7 +771,7 @@ "title": "World map flags example" }, { - "date": "2015-11-04T20:48:44.910Z", + "date": "2015-11-08T11:47:56.456Z", "section": "mixed", "onlyStandAlone": false, "id": "/mixed/mapbox-tiles-geojson-example", @@ -779,7 +779,7 @@ "title": "Mapbox tiles and Mapbox GeoJSON loading" }, { - "date": "2015-11-04T20:48:48.416Z", + "date": "2015-11-08T11:47:56.456Z", "section": "mixed", "onlyStandAlone": false, "id": "/mixed/layers-overlays-geojson-example", @@ -787,7 +787,7 @@ "title": "GeoJSON TileLayers" }, { - "date": "2015-11-04T20:48:51.793Z", + "date": "2015-11-08T11:47:56.456Z", "section": "mixed", "onlyStandAlone": false, "id": "/mixed/markers-nested-events-example", @@ -795,7 +795,7 @@ "title": "Marker Events example" }, { - "date": "2015-11-04T20:48:56.626Z", + "date": "2015-11-08T11:47:56.456Z", "section": "mixed", "onlyStandAlone": false, "id": "/mixed/overlays-markers-nested-no-watch-example", @@ -803,7 +803,7 @@ "title": "Overlays with nested markers no watchers example" }, { - "date": "2015-11-04T20:48:59.606Z", + "date": "2015-11-08T11:47:56.456Z", "section": "mixed", "onlyStandAlone": false, "id": "/mixed/esri-legend-service-example", @@ -811,7 +811,7 @@ "title": "Esri ArcGIS Legend Service" }, { - "date": "2015-11-04T20:49:03.750Z", + "date": "2015-11-08T11:47:56.456Z", "section": "mixed", "onlyStandAlone": false, "id": "/mixed/esri-multilayer-legend-service-example", diff --git a/examples/markers-cluster-issue.html b/examples/markers-cluster-issue.html index eaef5dc6..8459b174 100644 --- a/examples/markers-cluster-issue.html +++ b/examples/markers-cluster-issue.html @@ -330,7 +330,7 @@ - +
      diff --git a/examples/markers-updates.html b/examples/markers-updates.html index 1811b868..0080c42e 100644 --- a/examples/markers-updates.html +++ b/examples/markers-updates.html @@ -143,10 +143,10 @@
      - +
      - +
      diff --git a/grunt/aliases.yaml b/grunt/aliases.yaml index 2f2f633a..d84bb3a2 100644 --- a/grunt/aliases.yaml +++ b/grunt/aliases.yaml @@ -30,7 +30,6 @@ default: fast-build: - 'clean:dist' - 'jshint' - - 'jscs' - 'concat:dist' - 'ngAnnotate' - 'uglify' diff --git a/src/directives/bounds.js b/src/directives/bounds.js index d1b1764f..3fa6c4dd 100644 --- a/src/directives/bounds.js +++ b/src/directives/bounds.js @@ -1,4 +1,4 @@ -angular.module('leaflet-directive').directive('bounds', function($log, $timeout, $http, leafletHelpers, nominatimService, leafletBoundsHelpers) { +angular.module('leaflet-directive').directive('lfBounds', function(leafletLogger, $timeout, $http, leafletHelpers, nominatimService, leafletBoundsHelpers) { return { restrict: 'A', @@ -11,7 +11,6 @@ angular.module('leaflet-directive').directive('bounds', function($log, $timeout, var createLeafletBounds = leafletBoundsHelpers.createLeafletBounds; var leafletScope = controller[0].getLeafletScope(); var mapController = controller[0]; - var errorHeader = leafletHelpers.errorHeader + ' [Bounds] '; var emptyBounds = function(bounds) { return (bounds._southWest.lat === 0 && bounds._southWest.lng === 0 && @@ -50,8 +49,10 @@ angular.module('leaflet-directive').directive('bounds', function($log, $timeout, var lastNominatimQuery; leafletScope.$watch('bounds', function(bounds) { - if (scope.settingBoundsFromLeaflet) - return; + if (scope.settingBoundsFromLeaflet) { + return; + } + if (isDefined(bounds.address) && bounds.address !== lastNominatimQuery) { scope.settingBoundsFromScope = true; nominatimService.query(bounds.address, attrs.id).then(function(data) { @@ -60,7 +61,7 @@ angular.module('leaflet-directive').directive('bounds', function($log, $timeout, map.fitBounds(newBounds); }, function(errMsg) { - $log.error(errorHeader + ' ' + errMsg + '.'); + leafletLogger.error(errMsg, 'bounds'); }); lastNominatimQuery = bounds.address; diff --git a/src/directives/center.js b/src/directives/center.js index afad58fb..4d713035 100644 --- a/src/directives/center.js +++ b/src/directives/center.js @@ -1,231 +1,216 @@ -var centerDirectiveTypes = ['center', 'lfCenter']; -var centerDirectives = {}; - -centerDirectiveTypes.forEach(function(directiveName) { - centerDirectives[directiveName] = ['$log', '$q', '$location', '$timeout', 'leafletMapDefaults', 'leafletHelpers', - 'leafletBoundsHelpers', 'leafletMapEvents', - function($log, $q, $location, $timeout, leafletMapDefaults, leafletHelpers, - leafletBoundsHelpers, leafletMapEvents) { - - var isDefined = leafletHelpers.isDefined; - var isNumber = leafletHelpers.isNumber; - var isSameCenterOnMap = leafletHelpers.isSameCenterOnMap; - var safeApply = leafletHelpers.safeApply; - var isValidCenter = leafletHelpers.isValidCenter; - var isValidBounds = leafletBoundsHelpers.isValidBounds; - var isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty; - var errorHeader = leafletHelpers.errorHeader; - - var shouldInitializeMapWithBounds = function(bounds, center) { - return isDefined(bounds) && isValidBounds(bounds) && isUndefinedOrEmpty(center); +angular.module('leaflet-directive').directive('lfCenter', function(leafletLogger, $q, $location, $timeout, leafletMapDefaults, leafletHelpers, leafletBoundsHelpers, leafletMapEvents) { + var isDefined = leafletHelpers.isDefined; + var isNumber = leafletHelpers.isNumber; + var isSameCenterOnMap = leafletHelpers.isSameCenterOnMap; + var safeApply = leafletHelpers.safeApply; + var isValidCenter = leafletHelpers.isValidCenter; + var isValidBounds = leafletBoundsHelpers.isValidBounds; + var isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty; + + var shouldInitializeMapWithBounds = function(bounds, center) { + return isDefined(bounds) && isValidBounds(bounds) && isUndefinedOrEmpty(center); + }; + + var _leafletCenter; + return { + restrict: 'A', + scope: false, + replace: false, + require: 'leaflet', + controller: function() { + _leafletCenter = $q.defer(); + this.getCenter = function() { + return _leafletCenter.promise; }; + }, - var _leafletCenter; - return { - restrict: 'A', - scope: false, - replace: false, - require: 'leaflet', - controller: function() { - _leafletCenter = $q.defer(); - this.getCenter = function() { - return _leafletCenter.promise; - }; - }, + link: function(scope, element, attrs, controller) { + var leafletScope = controller.getLeafletScope(); + + if (!isDefined(leafletScope.center)) { + leafletLogger.error('The scope "center" variable is not defined', 'center'); + leafletScope.center = {}; + } + + var centerModel = leafletScope.center; + controller.getMap().then(function(map) { + var defaults = leafletMapDefaults.getDefaults(attrs.id); + + if (attrs.lfCenter.search('-') !== -1) { + leafletLogger.error('The "center" variable can\'t use a "-" on its key name: "' + attrs.lfCenter, 'center'); + map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + return; + } else if (shouldInitializeMapWithBounds(leafletScope.bounds, centerModel)) { + map.fitBounds(leafletBoundsHelpers.createLeafletBounds(leafletScope.bounds), leafletScope.bounds.options); + safeApply(leafletScope, function(scope) { + angular.extend(scope.center, { + lat: map.getCenter().lat, + lng: map.getCenter().lng, + zoom: map.getZoom(), + autoDiscover: false, + }); + }); - link: function(scope, element, attrs, controller) { - var leafletScope = controller.getLeafletScope(); - var centerModel = leafletScope[directiveName]; + safeApply(leafletScope, function(scope) { + var mapBounds = map.getBounds(); + scope.bounds = { + northEast: { + lat: mapBounds._northEast.lat, + lng: mapBounds._northEast.lng, + }, + southWest: { + lat: mapBounds._southWest.lat, + lng: mapBounds._southWest.lng, + }, + }; + }); + } else if (!isDefined(centerModel)) { + leafletLogger.error('The "center" property is not defined in the main scope', 'center'); + map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + return; + } else if (!(isDefined(centerModel.lat) && isDefined(centerModel.lng)) && !isDefined(centerModel.autoDiscover)) { + angular.copy(defaults.center, centerModel); + } + + var urlCenterHash; + var mapReady; + if (centerModel.allowUrlHashCenter === true) { + var extractCenterFromUrl = function() { + var search = $location.search(); + var centerParam; + if (isDefined(search.c)) { + var cParam = search.c.split(':'); + if (cParam.length === 3) { + centerParam = { + lat: parseFloat(cParam[0]), + lng: parseFloat(cParam[1]), + zoom: parseInt(cParam[2], 10), + allowUrlHashCenter: centerModel.allowUrlHashCenter, + }; + } + } - controller.getMap().then(function(map) { - var defaults = leafletMapDefaults.getDefaults(attrs.id); + return centerParam; + }; - if (attrs[directiveName].search('-') !== -1) { - $log.error(errorHeader + ' The "center" variable can\'t use a "-" on its key name: "' + attrs[directiveName] + '".'); - map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - return; - } else if (shouldInitializeMapWithBounds(leafletScope.bounds, centerModel)) { - map.fitBounds(leafletBoundsHelpers.createLeafletBounds(leafletScope.bounds), leafletScope.bounds.options); - centerModel = map.getCenter(); - safeApply(leafletScope, function(scope) { - angular.extend(scope[directiveName], { - lat: map.getCenter().lat, - lng: map.getCenter().lng, - zoom: map.getZoom(), - autoDiscover: false, - }); - }); + urlCenterHash = extractCenterFromUrl(); - safeApply(leafletScope, function(scope) { - var mapBounds = map.getBounds(); - scope.bounds = { - northEast: { - lat: mapBounds._northEast.lat, - lng: mapBounds._northEast.lng, - }, - southWest: { - lat: mapBounds._southWest.lat, - lng: mapBounds._southWest.lng, - }, - }; - }); - } else if (!isDefined(centerModel)) { - $log.error(errorHeader + ' The "center" property is not defined in the main scope'); - map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - return; - } else if (!(isDefined(centerModel.lat) && isDefined(centerModel.lng)) && !isDefined(centerModel.autoDiscover)) { - angular.copy(defaults.center, centerModel); - } + leafletScope.$on('$locationChangeSuccess', function(event) { + var scope = event.currentScope; - var urlCenterHash; - var mapReady; - if (attrs.urlHashCenter === 'yes') { - var extractCenterFromUrl = function() { - var search = $location.search(); - var centerParam; - if (isDefined(search.c)) { - var cParam = search.c.split(':'); - if (cParam.length === 3) { - centerParam = { - lat: parseFloat(cParam[0]), - lng: parseFloat(cParam[1]), - zoom: parseInt(cParam[2], 10), - }; - } - } - - return centerParam; - }; - - urlCenterHash = extractCenterFromUrl(); - - leafletScope.$on('$locationChangeSuccess', function(event) { - var scope = event.currentScope; - - //$log.debug("updated location..."); - var urlCenter = extractCenterFromUrl(); - if (isDefined(urlCenter) && !isSameCenterOnMap(urlCenter, map)) { - //$log.debug("updating center model...", urlCenter); - angular.extend(scope[directiveName], { - lat: urlCenter.lat, - lng: urlCenter.lng, - zoom: urlCenter.zoom, - }); - } + var urlCenter = extractCenterFromUrl(); + if (isDefined(urlCenter) && !isSameCenterOnMap(urlCenter, map)) { + angular.extend(scope.center, { + lat: urlCenter.lat, + lng: urlCenter.lng, + zoom: urlCenter.zoom, + allowUrlHashCenter: centerModel.allowUrlHashCenter, }); } + }); + } - leafletScope.$watch(directiveName, function(center) { - if (leafletScope.settingCenterFromLeaflet) - return; - - //$log.debug("updated center model..."); - // The center from the URL has priority - if (isDefined(urlCenterHash)) { - angular.copy(urlCenterHash, center); - urlCenterHash = undefined; - } - - if (!isValidCenter(center) && center.autoDiscover !== true) { - $log.warn(errorHeader + ' invalid \'center\''); + leafletScope.$watch('center', function(center) { + if (leafletScope.settingCenterFromLeaflet) { + return; + } - //map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - return; - } + // The center from the URL has priority + if (isDefined(urlCenterHash)) { + angular.copy(urlCenterHash, center); + urlCenterHash = undefined; + } - if (center.autoDiscover === true) { - if (!isNumber(center.zoom)) { - map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - } - - if (isNumber(center.zoom) && center.zoom > defaults.center.zoom) { - map.locate({ - setView: true, - maxZoom: center.zoom, - }); - } else if (isDefined(defaults.maxZoom)) { - map.locate({ - setView: true, - maxZoom: defaults.maxZoom, - }); - } else { - map.locate({ - setView: true, - }); - } - - return; - } + if (!isValidCenter(center) && center.autoDiscover !== true) { + leafletLogger.warn(' invalid \'center\'', 'center'); - if (mapReady && isSameCenterOnMap(center, map)) { - //$log.debug("no need to update map again."); - return; - } + //map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + return; + } - //$log.debug("updating map center...", center); - leafletScope.settingCenterFromScope = true; - map.setView([center.lat, center.lng], center.zoom); - leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); - $timeout(function() { - leafletScope.settingCenterFromScope = false; + if (center.autoDiscover === true) { + if (!isNumber(center.zoom)) { + map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + } - //$log.debug("allow center scope updates"); + if (isNumber(center.zoom) && center.zoom > defaults.center.zoom) { + map.locate({ + setView: true, + maxZoom: center.zoom, }); - }, true); - - map.whenReady(function() { - mapReady = true; - }); + } else if (isDefined(defaults.maxZoom)) { + map.locate({ + setView: true, + maxZoom: defaults.maxZoom, + }); + } else { + map.locate({ + setView: true, + }); + } - map.on('moveend', function(/* event */) { - // Resolve the center after the first map position - _leafletCenter.resolve(); - leafletMapEvents.notifyCenterUrlHashChanged(leafletScope, map, attrs, $location.search()); + return; + } - //$log.debug("updated center on map..."); - if (isSameCenterOnMap(centerModel, map) || leafletScope.settingCenterFromScope) { - //$log.debug("same center in model, no need to update again."); - return; - } + if (mapReady && isSameCenterOnMap(center, map)) { + return; + } - leafletScope.settingCenterFromLeaflet = true; - safeApply(leafletScope, function(scope) { - if (!leafletScope.settingCenterFromScope) { - //$log.debug("updating center model...", map.getCenter(), map.getZoom()); - angular.extend(scope[directiveName], { - lat: map.getCenter().lat, - lng: map.getCenter().lng, - zoom: map.getZoom(), - autoDiscover: false, - }); - } - - leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); - $timeout(function() { - leafletScope.settingCenterFromLeaflet = false; - }); + leafletScope.settingCenterFromScope = true; + map.setView([center.lat, center.lng], center.zoom); + leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); + $timeout(function() { + leafletScope.settingCenterFromScope = false; }); + }, true); + + map.whenReady(function() { + mapReady = true; + }); + + map.on('moveend', function(/* event */) { + // Resolve the center after the first map position + _leafletCenter.resolve(); + + if (centerModel.allowUrlHashCenter === true) { + leafletMapEvents.notifyCenterUrlHashChanged(leafletScope, map, $location.search()); + } + + if (isSameCenterOnMap(centerModel, map) || leafletScope.settingCenterFromScope) { + return; + } + + leafletScope.settingCenterFromLeaflet = true; + safeApply(leafletScope, function(scope) { + if (!leafletScope.settingCenterFromScope) { + angular.extend(scope.center, { + lat: map.getCenter().lat, + lng: map.getCenter().lng, + zoom: map.getZoom(), + autoDiscover: false, + }); + } + + leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); + $timeout(function() { + leafletScope.settingCenterFromLeaflet = false; }); + }); + }); - if (centerModel.autoDiscover === true) { - map.on('locationerror', function() { - $log.warn(errorHeader + ' The Geolocation API is unauthorized on this page.'); - if (isValidCenter(centerModel)) { - map.setView([centerModel.lat, centerModel.lng], centerModel.zoom); - leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); - } else { - map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); - leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); - } - }); + if (centerModel.autoDiscover === true) { + map.on('locationerror', function() { + leafletLogger.warn('The Geolocation API is unauthorized on this page.', 'center'); + if (isValidCenter(centerModel)) { + map.setView([centerModel.lat, centerModel.lng], centerModel.zoom); + leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); + } else { + map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); + leafletMapEvents.notifyCenterChangedToBounds(leafletScope, map); } }); - }, - }; + } + }); }, - ]; -}); - -centerDirectiveTypes.forEach(function(dirType) { - angular.module('leaflet-directive').directive(dirType, centerDirectives[dirType]); + }; }); diff --git a/src/directives/controls.js b/src/directives/controls.js index eeba332c..b69dae5f 100644 --- a/src/directives/controls.js +++ b/src/directives/controls.js @@ -1,4 +1,4 @@ -angular.module('leaflet-directive').directive('controls', function($log, leafletHelpers, leafletControlHelpers) { +angular.module('leaflet-directive').directive('lfControls', function(leafletLogger, leafletHelpers, leafletControlHelpers) { return { restrict: 'A', @@ -17,7 +17,6 @@ angular.module('leaflet-directive').directive('controls', function($log, leaflet var isDefined = leafletHelpers.isDefined; var isArray = leafletHelpers.isArray; var leafletControls = {}; - var errorHeader = leafletHelpers.errorHeader + ' [Controls] '; controller.getMap().then(function(map) { @@ -40,7 +39,7 @@ angular.module('leaflet-directive').directive('controls', function($log, leaflet var controlType = isDefined(newControls[newName].type) ? newControls[newName].type : newName; if (!isValidControlType(controlType)) { - $log.error(errorHeader + ' Invalid control type: ' + controlType + '.'); + leafletLogger.error(' Invalid control type: ' + controlType, 'controls'); return; } diff --git a/src/directives/decorations.js b/src/directives/decorations.js index 89ca1c03..a4c300de 100644 --- a/src/directives/decorations.js +++ b/src/directives/decorations.js @@ -1,4 +1,13 @@ -angular.module('leaflet-directive').directive('decorations', function($log, leafletHelpers) { +angular.module('leaflet-directive').directive('decorations', function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "decorations" markup code is deprecated now. Please ' + + 'update your HTML with "lf-decorations" markup attributes.', 'decorations'); + }, + }; +}); + +angular.module('leaflet-directive').directive('lfDecorations', function(leafletLogger, leafletHelpers) { return { restrict: 'A', @@ -16,7 +25,7 @@ angular.module('leaflet-directive').directive('decorations', function($log, leaf function createDecoration(options) { if (isDefined(options) && isDefined(options.coordinates)) { if (!PolylineDecoratorPlugin.isLoaded()) { - $log.error('[AngularJS - Leaflet] The PolylineDecorator Plugin is not loaded.'); + leafletLogger.error('The PolylineDecorator Plugin is not loaded.', 'decorations'); } } diff --git a/src/directives/deprecated.js b/src/directives/deprecated.js new file mode 100644 index 00000000..4d3fed29 --- /dev/null +++ b/src/directives/deprecated.js @@ -0,0 +1,107 @@ +angular.module('leaflet-directive').directive('maxbounds', function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "maxbounds" markup code is deprecated now. Please ' + + 'update your HTML with "lf-maxbounds" markup attributes.', 'maxbounds'); + }, + }; +}); + +angular.module('leaflet-directive').directive('defaults', function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "defaults" markup code is deprecated now. Please ' + + 'update your HTML with "lf-defaults" markup attributes.', 'defaults'); + }, + }; +}); + +angular.module('leaflet-directive').directive('bounds', function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "bounds" markup code is deprecated now. Please ' + + 'update your HTML with "lf-bounds" markup attributes.', 'bounds'); + }, + }; +}); + +angular.module('leaflet-directive').directive('controls', function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "controls" markup code is deprecated now. Please ' + + 'update your HTML with "lf-controls" markup attributes.', 'controls'); + }, + }; +}); + +angular.module('leaflet-directive').directive('center', function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "center" markup code is deprecated now. Please ' + + 'update your HTML with "lf-center" markup attributes.', 'center'); + }, + }; +}); + +angular.module('leaflet-directive').directive('paths', function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "paths" markup code is deprecated now. Please ' + + 'update your HTML with "lf-paths" markup attributes.', 'paths'); + }, + }; +}); + +angular.module('leaflet-directive').directive('tiles', function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "tiles" markup code is deprecated now. Please ' + + 'update your HTML with "lf-tiles" markup attributes.', 'tiles'); + }, + }; +}); + +angular.module('leaflet-directive').directive('markers', function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "markers" markup code is deprecated now. Please ' + + 'update your HTML with "lf-markers" markup attributes.', 'markers'); + }, + }; +}); + +angular.module('leaflet-directive').directive('eventBroadcast', function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "event-broadcast" markup code is deprecated now. Please ' + + 'update your HTML with "lf-events" markup attributes.', 'events'); + }, + }; +}); + +angular.module('leaflet-directive').directive('geojson', function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "geojson" markup code is deprecated now. Please ' + + 'update your HTML with "lf-geojson" markup attributes.', 'geojson'); + }, + }; +}); + +angular.module('leaflet-directive').directive('layers', function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "layers" markup code is deprecated now. Please ' + + 'update your HTML with "lf-layers" markup attributes.', 'layers'); + }, + }; +}); + +angular.module('leaflet-directive').directive('markers', function(leafletLogger) { + return { + link: function() { + leafletLogger.error('The "markers" markup code is deprecated now. Please ' + + 'update your HTML with "lf-markers" markup attributes.', 'markers'); + }, + }; +}); diff --git a/src/directives/eventBroadcast.js b/src/directives/events.js similarity index 74% rename from src/directives/eventBroadcast.js rename to src/directives/events.js index 3b8a80d1..a6ee2fe6 100644 --- a/src/directives/eventBroadcast.js +++ b/src/directives/events.js @@ -1,4 +1,4 @@ -angular.module('leaflet-directive').directive('eventBroadcast', function($log, $rootScope, leafletHelpers, leafletMapEvents, leafletIterators) { +angular.module('leaflet-directive').directive('lfEvents', function(leafletLogger, $rootScope, leafletHelpers, leafletMapEvents, leafletIterators) { return { restrict: 'A', @@ -10,7 +10,7 @@ angular.module('leaflet-directive').directive('eventBroadcast', function($log, $ var isObject = leafletHelpers.isObject; var isDefined = leafletHelpers.isDefined; var leafletScope = controller.getLeafletScope(); - var eventBroadcast = leafletScope.eventBroadcast; + var eventBroadcast = leafletScope.lfEvents; var availableMapEvents = leafletMapEvents.getAvailableMapEvents(); var addEvents = leafletMapEvents.addEvents; @@ -20,24 +20,24 @@ angular.module('leaflet-directive').directive('eventBroadcast', function($log, $ var logic = 'broadcast'; // We have a possible valid object - if (!isDefined(eventBroadcast.map)) { + if (!isDefined(eventBroadcast) || !isDefined(eventBroadcast.map)) { // We do not have events enable/disable do we do nothing (all enabled by default) mapEvents = availableMapEvents; } else if (!isObject(eventBroadcast.map)) { // Not a valid object - $log.warn('[AngularJS - Leaflet] event-broadcast.map must be an object check your model.'); + leafletLogger.warn('event-broadcast.map must be an object check your model.', 'events'); } else { // We have a possible valid map object // Event propadation logic if (eventBroadcast.map.logic !== 'emit' && eventBroadcast.map.logic !== 'broadcast') { // This is an error - $log.warn('[AngularJS - Leaflet] Available event propagation logic are: \'emit\' or \'broadcast\'.'); + leafletLogger.warn('Available event propagation logic are: \'emit\' or \'broadcast\'.', 'events'); } else { logic = eventBroadcast.map.logic; } if (!(isObject(eventBroadcast.map.enable) && eventBroadcast.map.enable.length >= 0)) { - $log.warn('[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.'); + leafletLogger.warn('[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.', 'events'); } else { // Enable events leafletIterators.each(eventBroadcast.map.enable, function(eventName) { diff --git a/src/directives/geojson.js b/src/directives/geojson.js index 0c5fb5c1..4ba39706 100644 --- a/src/directives/geojson.js +++ b/src/directives/geojson.js @@ -1,5 +1,5 @@ angular.module('leaflet-directive') -.directive('geojson', function($log, $rootScope, leafletData, leafletHelpers, +.directive('lfGeojson', function(leafletLogger, $rootScope, leafletData, leafletHelpers, leafletWatchHelpers, leafletDirectiveControlsHelpers, leafletIterators, leafletGeoJsonEvents) { var _maybeWatch = leafletWatchHelpers.maybeWatch; var _watchOptions = leafletHelpers.watchOptions; @@ -47,8 +47,10 @@ angular.module('leaflet-directive') hlp.isTruthy(attrs.geojsonNested)); var _clean = function() { - if (!leafletGeoJSON) - return; + if (!leafletGeoJSON) { + return; + } + var _remove = function(lObject) { if (isDefined(lObject) && map.hasLayer(lObject)) { map.removeLayer(lObject); @@ -105,8 +107,10 @@ angular.module('leaflet-directive') var _create = function(model) { _clean(); if (isNested) { - if (!model || !Object.keys(model).length) - return; + if (!model || !Object.keys(model).length) { + return; + } + $it.each(model, function(m, name) { //name could be layerName and or groupName //for now it is not tied to a layer diff --git a/src/directives/layercontrol.js b/src/directives/layercontrol.js index 0c0d661e..0dcb359c 100644 --- a/src/directives/layercontrol.js +++ b/src/directives/layercontrol.js @@ -1,4 +1,4 @@ -angular.module('leaflet-directive').directive('layercontrol', function($filter, $log, leafletData, leafletHelpers) { +angular.module('leaflet-directive').directive('layercontrol', function($filter, leafletLogger, leafletData, leafletHelpers) { return { restrict: 'E', @@ -14,7 +14,6 @@ angular.module('leaflet-directive').directive('layercontrol', function($filter, transclude: false, require: '^leaflet', controller: function($scope, $element, $sce) { - $log.debug('[Angular Directive - Layers] layers', $scope, $element); var safeApply = leafletHelpers.safeApply; var isDefined = leafletHelpers.isDefined; angular.extend($scope, { diff --git a/src/directives/layers.js b/src/directives/layers.js index c2a0bf93..4a2f5abe 100644 --- a/src/directives/layers.js +++ b/src/directives/layers.js @@ -1,4 +1,4 @@ -angular.module('leaflet-directive').directive('layers', function($log, $q, leafletData, leafletHelpers, leafletLayerHelpers, leafletControlHelpers) { +angular.module('leaflet-directive').directive('lfLayers', function(leafletLogger, $q, leafletData, leafletHelpers, leafletLayerHelpers, leafletControlHelpers) { return { restrict: 'A', diff --git a/src/directives/leaflet.js b/src/directives/leaflet.js index f3595fe4..15e8792d 100644 --- a/src/directives/leaflet.js +++ b/src/directives/leaflet.js @@ -3,20 +3,18 @@ angular.module('leaflet-directive', []).directive('leaflet', function($q, leafle restrict: 'EA', replace: true, scope: { - center: '=', - lfCenter: '=', - defaults: '=', - maxbounds: '=', - bounds: '=', - markers: '=', - legend: '=', - geojson: '=', - paths: '=', - tiles: '=', - layers: '=', - controls: '=', - decorations: '=', - eventBroadcast: '=', + center: '=lfCenter', + defaults: '=lfDefaults', + maxbounds: '=lfMaxbounds', + bounds: '=lfBounds', + markers: '=lfMarkers', + geojson: '=lfGeojson', + paths: '=lfPaths', + tiles: '=lfTiles', + layers: '=lfLayers', + controls: '=lfControls', + decorations: '=lfDecorations', + events: '=lfEvents', markersWatchOptions: '=', geojsonWatchOptions: '=', }, @@ -95,12 +93,12 @@ angular.module('leaflet-directive', []).directive('leaflet', function($q, leafle var map = new L.Map(element[0], leafletMapDefaults.getMapCreationDefaults(attrs.id)); ctrl._leafletMap.resolve(map); - if (!isDefined(attrs.center) && !isDefined(attrs.lfCenter)) { + if (!isDefined(attrs.lfCenter)) { map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom); } // If no layers nor tiles defined, set the default tileLayer - if (!isDefined(attrs.tiles) && (!isDefined(attrs.layers))) { + if (!isDefined(attrs.lfTiles) && (!isDefined(attrs.lfLayers))) { var tileLayerObj = L.tileLayer(defaults.tileLayer, defaults.tileLayerOptions); tileLayerObj.addTo(map); leafletData.setTiles(tileLayerObj, attrs.id); @@ -123,7 +121,7 @@ angular.module('leaflet-directive', []).directive('leaflet', function($q, leafle } // if no event-broadcast attribute, all events are broadcasted - if (!isDefined(attrs.eventBroadcast)) { + if (!isDefined(attrs.lfEvents)) { var logic = 'broadcast'; addEvents(map, mapEvents, 'eventName', scope, logic); } diff --git a/src/directives/legend.js b/src/directives/legend.js index e330228f..d8bf08c7 100644 --- a/src/directives/legend.js +++ b/src/directives/legend.js @@ -1,4 +1,4 @@ -angular.module('leaflet-directive').directive('legend', function($log, $http, leafletHelpers, leafletLegendHelpers) { +angular.module('leaflet-directive').directive('lfLegend', function(leafletLogger, $http, leafletHelpers, leafletLegendHelpers) { return { restrict: 'A', @@ -38,7 +38,6 @@ angular.module('leaflet-directive').directive('legend', function($log, $http, le leafletScope.$watch('legend', function(newLegend) { if (!isDefined(newLegend)) { - if (isDefined(leafletLegend)) { leafletLegend.removeFrom(map); leafletLegend = null; @@ -48,16 +47,12 @@ angular.module('leaflet-directive').directive('legend', function($log, $http, le } if (!isDefined(newLegend.url) && (type === 'arcgis') && (!isArray(newLegend.colors) || !isArray(newLegend.labels) || newLegend.colors.length !== newLegend.labels.length)) { - - $log.warn('[AngularJS - Leaflet] legend.colors and legend.labels must be set.'); - + leafletLogger.warn('legend.colors and legend.labels must be set.', 'legend'); return; } if (isDefined(newLegend.url)) { - - $log.info('[AngularJS - Leaflet] loading legend service.'); - + leafletLogger.info('loading legend service.', 'legend'); return; } @@ -69,12 +64,12 @@ angular.module('leaflet-directive').directive('legend', function($log, $http, le leafletLegend = L.control({ position: position, }); + if (type === 'arcgis') { leafletLegend.onAdd = leafletLegendHelpers.getOnAddArrayLegend(newLegend, legendClass); } leafletLegend.addTo(map); - }); leafletScope.$watch('legend.url', function(newURL) { @@ -83,31 +78,22 @@ angular.module('leaflet-directive').directive('legend', function($log, $http, le return; } - $http.get(newURL) - .success(function(legendData) { - - if (isDefined(leafletLegend)) { - - leafletLegendHelpers.updateLegend(leafletLegend.getContainer(), legendData, type, newURL); - - } else { - - leafletLegend = L.control({ - position: position, - }); - leafletLegend.onAdd = leafletLegendHelpers.getOnAddLegend(legendData, legendClass, type, newURL); - leafletLegend.addTo(map); - } + $http.get(newURL).success(function(legendData) { + if (isDefined(leafletLegend)) { + leafletLegendHelpers.updateLegend(leafletLegend.getContainer(), legendData, type, newURL); + } else { + leafletLegend = L.control({ position: position, }); + leafletLegend.onAdd = leafletLegendHelpers.getOnAddLegend(legendData, legendClass, type, newURL); + leafletLegend.addTo(map); + } - if (isDefined(legend.loadedData) && isFunction(legend.loadedData)) { - legend.loadedData(); - } - }) - .error(function() { - $log.warn('[AngularJS - Leaflet] legend.url not loaded.'); - }); + if (isDefined(legend.loadedData) && isFunction(legend.loadedData)) { + legend.loadedData(); + } + }).error(function() { + leafletLogger.warn('legend.url not loaded.', 'legend'); + }); }); - }); }, }; diff --git a/src/directives/markers.js b/src/directives/markers.js index 6a020e63..a05fb65e 100644 --- a/src/directives/markers.js +++ b/src/directives/markers.js @@ -1,154 +1,160 @@ -angular.module('leaflet-directive').directive('markers', - function($log, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults, - leafletMarkersHelpers, leafletMarkerEvents, leafletIterators, leafletWatchHelpers, - leafletDirectiveControlsHelpers) { - //less terse vars to helpers - var isDefined = leafletHelpers.isDefined; - var errorHeader = leafletHelpers.errorHeader; - var Helpers = leafletHelpers; - var isString = leafletHelpers.isString; - var addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher; - var updateMarker = leafletMarkersHelpers.updateMarker; - var listenMarkerEvents = leafletMarkersHelpers.listenMarkerEvents; - var addMarkerToGroup = leafletMarkersHelpers.addMarkerToGroup; - var createMarker = leafletMarkersHelpers.createMarker; - var deleteMarker = leafletMarkersHelpers.deleteMarker; - var $it = leafletIterators; - var _markersWatchOptions = leafletHelpers.watchOptions; - var maybeWatch = leafletWatchHelpers.maybeWatch; - var extendDirectiveControls = leafletDirectiveControlsHelpers.extend; - - var _getLMarker = function(leafletMarkers, name, maybeLayerName) { - if (!Object.keys(leafletMarkers).length) return; +angular.module('leaflet-directive').directive('lfMarkers', function(leafletLogger, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults, leafletMarkersHelpers, leafletMarkerEvents, leafletIterators, leafletWatchHelpers, leafletDirectiveControlsHelpers) { + var isDefined = leafletHelpers.isDefined; + var Helpers = leafletHelpers; + var isString = leafletHelpers.isString; + var addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher; + var updateMarker = leafletMarkersHelpers.updateMarker; + var listenMarkerEvents = leafletMarkersHelpers.listenMarkerEvents; + var addMarkerToGroup = leafletMarkersHelpers.addMarkerToGroup; + var createMarker = leafletMarkersHelpers.createMarker; + var deleteMarker = leafletMarkersHelpers.deleteMarker; + var $it = leafletIterators; + var _markersWatchOptions = leafletHelpers.watchOptions; + var maybeWatch = leafletWatchHelpers.maybeWatch; + var extendDirectiveControls = leafletDirectiveControlsHelpers.extend; + + var _getLMarker = function(leafletMarkers, name, maybeLayerName) { + if (!Object.keys(leafletMarkers).length) { + return; + } + + if (maybeLayerName && isString(maybeLayerName)) { + if (!leafletMarkers[maybeLayerName] || !Object.keys(leafletMarkers[maybeLayerName]).length) { + return; + } + + return leafletMarkers[maybeLayerName][name]; + } + + return leafletMarkers[name]; + }; + + var _setLMarker = function(lObject, leafletMarkers, name, maybeLayerName) { if (maybeLayerName && isString(maybeLayerName)) { - if (!leafletMarkers[maybeLayerName] || !Object.keys(leafletMarkers[maybeLayerName]).length) - return; - return leafletMarkers[maybeLayerName][name]; - } - - return leafletMarkers[name]; - }; + if (!isDefined(leafletMarkers[maybeLayerName])) { + leafletMarkers[maybeLayerName] = {}; + } - var _setLMarker = function(lObject, leafletMarkers, name, maybeLayerName) { - if (maybeLayerName && isString(maybeLayerName)) { - if (!isDefined(leafletMarkers[maybeLayerName])) - leafletMarkers[maybeLayerName] = {}; leafletMarkers[maybeLayerName][name] = lObject; - } else - leafletMarkers[name] = lObject; + } else { + leafletMarkers[name] = lObject; + } + return lObject; }; - var _maybeAddMarkerToLayer = function(layerName, layers, model, marker, doIndividualWatch, map) { - - if (!isString(layerName)) { - $log.error(errorHeader + ' A layername must be a string'); - return false; + var _maybeAddMarkerToLayer = function(layerName, layers, model, marker, doIndividualWatch, map) { + + if (!isString(layerName)) { + leafletLogger.error('A layername must be a string', 'markers'); + return false; + } + + if (!isDefined(layers)) { + leafletLogger.error('You must add layers to the directive if the markers are going to use this functionality.', 'markers'); + return false; + } + + if (!isDefined(layers.overlays) || !isDefined(layers.overlays[layerName])) { + leafletLogger.error('A marker can only be added to a layer of type "group"', 'markers'); + return false; + } + + var layerGroup = layers.overlays[layerName]; + if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { + leafletLogger.error('Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"', 'markers'); + return false; + } + + // The marker goes to a correct layer group, so first of all we add it + layerGroup.addLayer(marker); + + // The marker is automatically added to the map depending on the visibility + // of the layer, so we only have to open the popup if the marker is in the map + if (!doIndividualWatch && map.hasLayer(marker) && model.focus === true) { + marker.openPopup(); + } + + return true; + }; + + //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already) + var _addMarkers = function(mapId, markersToRender, oldModels, map, layers, leafletMarkers, leafletScope, + watchOptions, maybeLayerName, skips) { + for (var newName in markersToRender) { + if (skips[newName]) { + continue; + } + + if (newName.search('-') !== -1) { + leafletLogger.error('The marker can\'t use a "-" on his key name: "' + newName + '".', 'markers'); + continue; + } + + var model = Helpers.copy(markersToRender[newName]); + var pathToMarker = Helpers.getObjectDotPath(maybeLayerName ? [maybeLayerName, newName] : [newName]); + var maybeLMarker = _getLMarker(leafletMarkers, newName, maybeLayerName); + if (!isDefined(maybeLMarker)) { + //(nmccready) very important to not have model changes when lObject is changed + //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal + //if it is left as the reference then all changes from oldModel vs newModel are ignored + //see _destroy (where modelDiff becomes meaningless if we do not copy here) + var marker = createMarker(model); + var layerName = (model ? model.layer : undefined) || maybeLayerName; //original way takes pref + if (!isDefined(marker)) { + leafletLogger.error('Received invalid data on the marker ' + newName, 'markers'); + continue; } - if (!isDefined(layers)) { - $log.error(errorHeader + ' You must add layers to the directive if the markers are going to use this functionality.'); - return false; - } + _setLMarker(marker, leafletMarkers, newName, maybeLayerName); - if (!isDefined(layers.overlays) || !isDefined(layers.overlays[layerName])) { - $log.error(errorHeader + ' A marker can only be added to a layer of type "group"'); - return false; + // Bind message + if (isDefined(model.message)) { + marker.bindPopup(model.message, model.popupOptions); } - var layerGroup = layers.overlays[layerName]; - if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { - $log.error(errorHeader + ' Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"'); - return false; + // Add the marker to a cluster group if needed + if (isDefined(model.group)) { + var groupOptions = isDefined(model.groupOption) ? model.groupOption : null; + addMarkerToGroup(marker, model.group, groupOptions, map); } - // The marker goes to a correct layer group, so first of all we add it - layerGroup.addLayer(marker); - - // The marker is automatically added to the map depending on the visibility - // of the layer, so we only have to open the popup if the marker is in the map - if (!doIndividualWatch && map.hasLayer(marker) && model.focus === true) { - marker.openPopup(); + // Show label if defined + if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) { + marker.bindLabel(model.label.message, model.label.options); } - return true; - }; - - //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already) - var _addMarkers = function(mapId, markersToRender, oldModels, map, layers, leafletMarkers, leafletScope, - watchOptions, maybeLayerName, skips) { - for (var newName in markersToRender) { - if (skips[newName]) - continue; + // Check if the marker should be added to a layer + if (isDefined(model) && (isDefined(model.layer) || isDefined(maybeLayerName))) { - if (newName.search('-') !== -1) { - $log.error('The marker can\'t use a "-" on his key name: "' + newName + '".'); - continue; + var pass = _maybeAddMarkerToLayer(layerName, layers, model, marker, + watchOptions.individual.doWatch, map); + if (!pass) { + continue; //something went wrong move on in the loop } - - var model = Helpers.copy(markersToRender[newName]); - var pathToMarker = Helpers.getObjectDotPath(maybeLayerName ? [maybeLayerName, newName] : [newName]); - var maybeLMarker = _getLMarker(leafletMarkers, newName, maybeLayerName); - if (!isDefined(maybeLMarker)) { - //(nmccready) very important to not have model changes when lObject is changed - //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal - //if it is left as the reference then all changes from oldModel vs newModel are ignored - //see _destroy (where modelDiff becomes meaningless if we do not copy here) - var marker = createMarker(model); - var layerName = (model ? model.layer : undefined) || maybeLayerName; //original way takes pref - if (!isDefined(marker)) { - $log.error(errorHeader + ' Received invalid data on the marker ' + newName + '.'); - continue; - } - - _setLMarker(marker, leafletMarkers, newName, maybeLayerName); - - // Bind message - if (isDefined(model.message)) { - marker.bindPopup(model.message, model.popupOptions); - } - - // Add the marker to a cluster group if needed - if (isDefined(model.group)) { - var groupOptions = isDefined(model.groupOption) ? model.groupOption : null; - addMarkerToGroup(marker, model.group, groupOptions, map); - } - - // Show label if defined - if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) { - marker.bindLabel(model.label.message, model.label.options); - } - - // Check if the marker should be added to a layer - if (isDefined(model) && (isDefined(model.layer) || isDefined(maybeLayerName))) { - - var pass = _maybeAddMarkerToLayer(layerName, layers, model, marker, - watchOptions.individual.doWatch, map); - if (!pass) - continue; //something went wrong move on in the loop - } else if (!isDefined(model.group)) { - // We do not have a layer attr, so the marker goes to the map layer - map.addLayer(marker); - if (!watchOptions.individual.doWatch && model.focus === true) { - marker.openPopup(); - } - } - - if (watchOptions.individual.doWatch) { - addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map, - watchOptions.individual.isDeep); - } - - listenMarkerEvents(marker, model, leafletScope, watchOptions.individual.doWatch, map); - leafletMarkerEvents.bindEvents(mapId, marker, pathToMarker, model, leafletScope, layerName); - } else { - var oldModel = isDefined(oldModel) ? oldModels[newName] : undefined; - updateMarker(model, oldModel, maybeLMarker, pathToMarker, leafletScope, layers, map); + } else if (!isDefined(model.group)) { + // We do not have a layer attr, so the marker goes to the map layer + map.addLayer(marker); + if (!watchOptions.individual.doWatch && model.focus === true) { + marker.openPopup(); } } - }; - var _seeWhatWeAlreadyHave = function(markerModels, oldMarkerModels, lMarkers, isEqual, cb) { + if (watchOptions.individual.doWatch) { + addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map, + watchOptions.individual.isDeep); + } + + listenMarkerEvents(marker, model, leafletScope, watchOptions.individual.doWatch, map); + leafletMarkerEvents.bindEvents(mapId, marker, pathToMarker, model, leafletScope, layerName); + } else { + var oldModel = isDefined(oldModel) ? oldModels[newName] : undefined; + updateMarker(model, oldModel, maybeLMarker, pathToMarker, leafletScope, layers, map); + } + } + }; + + var _seeWhatWeAlreadyHave = function(markerModels, oldMarkerModels, lMarkers, isEqual, cb) { var hasLogged = false; var equals = false; var oldMarker; @@ -157,7 +163,6 @@ angular.module('leaflet-directive').directive('markers', var doCheckOldModel = isDefined(oldMarkerModels); for (var name in lMarkers) { if (!hasLogged) { - $log.debug(errorHeader + '[markers] destroy: '); hasLogged = true; } @@ -174,37 +179,38 @@ angular.module('leaflet-directive').directive('markers', !isDefined(markerModels[name]) || !Object.keys(markerModels[name]).length || equals) { - if (cb && Helpers.isFunction(cb)) - cb(newMarker, oldMarker, name); + if (cb && Helpers.isFunction(cb)) { + cb(newMarker, oldMarker, name); + } } } }; - var _destroy = function(markerModels, oldMarkerModels, lMarkers, map, layers) { + var _destroy = function(markerModels, oldMarkerModels, lMarkers, map, layers) { _seeWhatWeAlreadyHave(markerModels, oldMarkerModels, lMarkers, false, function(newMarker, oldMarker, lMarkerName) { - $log.debug(errorHeader + '[marker] is deleting marker: ' + lMarkerName); + leafletLogger.debug('Deleting marker: ' + lMarkerName, 'markers'); deleteMarker(lMarkers[lMarkerName], map, layers); delete lMarkers[lMarkerName]; }); }; - var _getNewModelsToSkipp = function(newModels, oldModels, lMarkers) { + var _getNewModelsToSkipp = function(newModels, oldModels, lMarkers) { var skips = {}; _seeWhatWeAlreadyHave(newModels, oldModels, lMarkers, true, function(newMarker, oldMarker, lMarkerName) { - $log.debug(errorHeader + '[marker] is already rendered, marker: ' + lMarkerName); + leafletLogger.debug('Already rendered marker: ' + lMarkerName, 'markers'); skips[lMarkerName] = newMarker; }); return skips; }; - return { + return { restrict: 'A', scope: false, replace: false, - require: ['leaflet', '?layers'], + require: ['leaflet', '?lfLayers'], link: function(scope, element, attrs, controller) { var mapController = controller[0]; @@ -228,9 +234,10 @@ angular.module('leaflet-directive').directive('markers', var watchOptions = leafletScope.markersWatchOptions || _markersWatchOptions; // backwards compat - if (isDefined(attrs.watchMarkers)) - watchOptions.doWatch = watchOptions.individual.doWatch = - (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers)); + if (isDefined(attrs.watchMarkers)) { + watchOptions.doWatch = watchOptions.individual.doWatch = + (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers)); + } var isNested = (isDefined(attrs.markersNested) && Helpers.isTruthy(attrs.markersNested)); @@ -277,4 +284,4 @@ angular.module('leaflet-directive').directive('markers', }); }, }; - }); +}); diff --git a/src/directives/maxbounds.js b/src/directives/maxbounds.js index efc9968b..a43a0817 100644 --- a/src/directives/maxbounds.js +++ b/src/directives/maxbounds.js @@ -1,4 +1,4 @@ -angular.module('leaflet-directive').directive('maxbounds', function($log, leafletMapDefaults, leafletBoundsHelpers, leafletHelpers) { +angular.module('leaflet-directive').directive('lfMaxbounds', function(leafletLogger, leafletMapDefaults, leafletBoundsHelpers, leafletHelpers) { return { restrict: 'A', diff --git a/src/directives/paths.js b/src/directives/paths.js index 0cb5f4fd..42701604 100644 --- a/src/directives/paths.js +++ b/src/directives/paths.js @@ -1,10 +1,10 @@ -angular.module('leaflet-directive').directive('paths', function($log, $q, leafletData, leafletMapDefaults, leafletHelpers, leafletPathsHelpers, leafletPathEvents) { +angular.module('leaflet-directive').directive('lfPaths', function(leafletLogger, $q, leafletData, leafletMapDefaults, leafletHelpers, leafletPathsHelpers, leafletPathEvents) { return { restrict: 'A', scope: false, replace: false, - require: ['leaflet', '?layers'], + require: ['leaflet', '?lfLayers'], link: function(scope, element, attrs, controller) { var mapController = controller[0]; @@ -80,7 +80,7 @@ angular.module('leaflet-directive').directive('paths', function($log, $q, leafle } if (newName.search('-') !== -1) { - $log.error('[AngularJS - Leaflet] The path name "' + newName + '" is not valid. It must not include "-" and a number.'); + leafletLogger.error('The path name "' + newName + '" is not valid. It must not include "-" and a number.', 'paths'); continue; } @@ -102,23 +102,23 @@ angular.module('leaflet-directive').directive('paths', function($log, $q, leafle if (isDefined(pathData) && isDefined(pathData.layer)) { if (!isString(pathData.layer)) { - $log.error('[AngularJS - Leaflet] A layername must be a string'); + leafletLogger.error('A layername must be a string', 'paths'); continue; } if (!isDefined(layers)) { - $log.error('[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.'); + leafletLogger.error('You must add layers to the directive if the markers are going to use this functionality', 'paths'); continue; } if (!isDefined(layers.overlays) || !isDefined(layers.overlays[pathData.layer])) { - $log.error('[AngularJS - Leaflet] A path can only be added to a layer of type "group"'); + leafletLogger.error('A path can only be added to a layer of type "group"', 'paths'); continue; } var layerGroup = layers.overlays[pathData.layer]; if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { - $log.error('[AngularJS - Leaflet] Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"'); + leafletLogger.error('Adding a path to an overlay needs a overlay of the type "group" or "featureGroup"', 'paths'); continue; } diff --git a/src/directives/tiles.js b/src/directives/tiles.js index 57be0a85..5f792b92 100644 --- a/src/directives/tiles.js +++ b/src/directives/tiles.js @@ -1,4 +1,4 @@ -angular.module('leaflet-directive').directive('tiles', function($log, leafletData, leafletMapDefaults, leafletHelpers) { +angular.module('leaflet-directive').directive('lfTiles', function(leafletLogger, leafletData, leafletMapDefaults, leafletHelpers) { return { restrict: 'A', @@ -12,14 +12,16 @@ angular.module('leaflet-directive').directive('tiles', function($log, leafletDat var tiles = leafletScope.tiles; if (!isDefined(tiles) || !isDefined(tiles.url)) { - $log.warn('[AngularJS - Leaflet] The \'tiles\' definition doesn\'t have the \'url\' property.'); + leafletLogger.warn('[AngularJS - Leaflet] The \'tiles\' definition doesn\'t have the \'url\' property.', 'tiles'); return; } controller.getMap().then(function(map) { var defaults = leafletMapDefaults.getDefaults(attrs.id); var tileLayerObj; + leafletScope.$watch('tiles', function(tiles, oldtiles) { + var tileLayerOptions = defaults.tileLayerOptions; var tileLayerUrl = defaults.tileLayer; @@ -50,7 +52,7 @@ angular.module('leaflet-directive').directive('tiles', function($log, leafletDat return; } - // If the options of the tilelayer is changed, we need to redraw the layer + // If the options of the tilelayer are changed, we need to redraw the layer if (isDefined(tiles.url) && isDefined(tiles.options) && (tiles.type !== oldtiles.type || !angular.equals(tiles.options, tileLayerOptions))) { map.removeLayer(tileLayerObj); diff --git a/src/directives/watchOptions.js b/src/directives/watchOptions.js index 2ae644f5..55b006ea 100644 --- a/src/directives/watchOptions.js +++ b/src/directives/watchOptions.js @@ -5,13 +5,12 @@ */ ['markers', 'geojson'].forEach(function(name) { angular.module('leaflet-directive').directive(name + 'WatchOptions', [ - '$log', '$rootScope', '$q', 'leafletData', 'leafletHelpers', - function($log, $rootScope, $q, leafletData, leafletHelpers) { + 'leafletLogger', '$rootScope', '$q', 'leafletData', 'leafletHelpers', + function(leafletLogger, $rootScope, $q, leafletData, leafletHelpers) { - var isDefined = leafletHelpers.isDefined, - errorHeader = leafletHelpers.errorHeader, - isObject = leafletHelpers.isObject, - _watchOptions = leafletHelpers.watchOptions; + var isDefined = leafletHelpers.isDefined; + var isObject = leafletHelpers.isObject; + var _watchOptions = leafletHelpers.watchOptions; return { restrict: 'A', @@ -28,7 +27,7 @@ if (isObject(scope[name + 'WatchOptions'])) angular.extend(_watchOptions, scope[name + 'WatchOptions']); else - $log.error(errorHeader + '[' + name + 'WatchOptions] is not an object'); + leafletLogger.error('is not an object', 'watch options'); leafletScope[name + 'WatchOptions'] = _watchOptions; } }); diff --git a/src/services/events/leafletEventsHelpers.js b/src/services/events/leafletEventsHelpers.js index de9afd32..394640b4 100644 --- a/src/services/events/leafletEventsHelpers.js +++ b/src/services/events/leafletEventsHelpers.js @@ -1,14 +1,12 @@ angular.module('leaflet-directive') -.factory('LeafletEventsHelpersFactory', function($rootScope, $q, $log, leafletHelpers) { +.factory('LeafletEventsHelpersFactory', function($rootScope, $q, leafletLogger, leafletHelpers) { var safeApply = leafletHelpers.safeApply; var isDefined = leafletHelpers.isDefined; var isObject = leafletHelpers.isObject; var isArray = leafletHelpers.isArray; - var errorHeader = leafletHelpers.errorHeader; 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; @@ -38,12 +36,12 @@ angular.module('leaflet-directive') var _this = this; maybeMapId = maybeMapId || ''; - if (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); }; }; @@ -57,8 +55,9 @@ angular.module('leaflet-directive') modelName: modelName, model: model, }; - if (isDefined(layerName)) - angular.extend(toSend, {layerName: layerName}); + if (isDefined(layerName)) { + angular.extend(toSend, {layerName: layerName}); + } if (logic === 'emit') { scope.$emit(broadcastName, toSend); @@ -78,7 +77,7 @@ angular.module('leaflet-directive') events = this.getAvailableEvents(); } else if (!isObject(leafletScope.eventBroadcast)) { // Not a valid object - $log.error(errorHeader + 'event-broadcast must be an object check your model.'); + leafletLogger.error('event-broadcast must be an object check your model.'); } else { // We have a possible valid object if (!isDefined(leafletScope.eventBroadcast[_this.lObjectType])) { @@ -86,33 +85,37 @@ angular.module('leaflet-directive') 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.'); + 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') - $log.warn(errorHeader + 'Available event propagation logic are: \'emit\' or \'broadcast\'.'); + 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; + isArray(leafletScope.eventBroadcast[_this.lObjectType].enable)) { + eventsEnable = true; + } + if (isDefined(leafletScope.eventBroadcast[_this.lObjectType].disable) && - isArray(leafletScope.eventBroadcast[_this.lObjectType].disable)) - eventsDisable = true; + 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'); + leafletLogger.warn('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'); + leafletLogger.warn('must enable or disable events'); } else { // At this point the object is OK, lets enable or disable events if (eventsEnable) { @@ -121,12 +124,12 @@ angular.module('leaflet-directive') // 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'); + 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 - $log.warn(errorHeader + 'This event ' + eventName + ' does not exist'); + leafletLogger.warn('This event ' + eventName + ' does not exist'); } else { // All ok enable the event events.push(eventName); @@ -140,7 +143,7 @@ angular.module('leaflet-directive') 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'); + leafletLogger.warn('This event ' + eventName + ' does not exist or has been already disabled'); } else { events.splice(index, 1); diff --git a/src/services/events/leafletGeoJsonEvents.js b/src/services/events/leafletGeoJsonEvents.js index f7b33e05..0a22d134 100644 --- a/src/services/events/leafletGeoJsonEvents.js +++ b/src/services/events/leafletGeoJsonEvents.js @@ -1,5 +1,5 @@ angular.module('leaflet-directive') -.factory('leafletGeoJsonEvents', function($rootScope, $q, $log, leafletHelpers, +.factory('leafletGeoJsonEvents', function($rootScope, $q, leafletLogger, leafletHelpers, LeafletEventsHelpersFactory, leafletData) { var safeApply = leafletHelpers.safeApply; var EventsHelper = LeafletEventsHelpersFactory; diff --git a/src/services/events/leafletLabelEvents.js b/src/services/events/leafletLabelEvents.js index f0283ad5..66b25f29 100644 --- a/src/services/events/leafletLabelEvents.js +++ b/src/services/events/leafletLabelEvents.js @@ -1,5 +1,5 @@ angular.module('leaflet-directive') -.factory('leafletLabelEvents', function($rootScope, $q, $log, leafletHelpers, LeafletEventsHelpersFactory) { +.factory('leafletLabelEvents', function($rootScope, $q, leafletLogger, leafletHelpers, LeafletEventsHelpersFactory) { var Helpers = leafletHelpers; var EventsHelper = LeafletEventsHelpersFactory; diff --git a/src/services/events/leafletMapEvents.js b/src/services/events/leafletMapEvents.js index ed665555..cff4b5bf 100644 --- a/src/services/events/leafletMapEvents.js +++ b/src/services/events/leafletMapEvents.js @@ -1,5 +1,5 @@ angular.module('leaflet-directive') -.factory('leafletMapEvents', function($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers, leafletIterators) { +.factory('leafletMapEvents', function($rootScope, $q, leafletLogger, leafletHelpers, leafletEventsHelpers, leafletIterators) { var isDefined = leafletHelpers.isDefined; var fire = leafletEventsHelpers.fire; @@ -53,12 +53,13 @@ angular.module('leaflet-directive') }; var _genDispatchMapEvent = function(scope, eventName, logic, maybeMapId) { - if (maybeMapId) + if (maybeMapId) { maybeMapId = maybeMapId + '.'; + } + return function(e) { // Put together broadcast name var broadcastName = 'leafletDirectiveMap.' + maybeMapId + eventName; - $log.debug(broadcastName); // Safely broadcast the event fire(scope, broadcastName, logic, e, e.target, scope); @@ -69,15 +70,10 @@ angular.module('leaflet-directive') scope.$broadcast('boundsChanged'); }; - var _notifyCenterUrlHashChanged = function(scope, map, attrs, search) { - if (!isDefined(attrs.urlHashCenter)) { - return; - } - + var _notifyCenterUrlHashChanged = function(scope, map, search) { var center = map.getCenter(); var centerUrlHash = (center.lat).toFixed(4) + ':' + (center.lng).toFixed(4) + ':' + map.getZoom(); if (!isDefined(search.c) || search.c !== centerUrlHash) { - //$log.debug("notified new center..."); scope.$emit('centerUrlHash', centerUrlHash); } }; diff --git a/src/services/events/leafletMarkerEvents.js b/src/services/events/leafletMarkerEvents.js index 2bf27a82..f56c588e 100644 --- a/src/services/events/leafletMarkerEvents.js +++ b/src/services/events/leafletMarkerEvents.js @@ -1,5 +1,5 @@ angular.module('leaflet-directive') -.factory('leafletMarkerEvents', function($rootScope, $q, $log, leafletHelpers, LeafletEventsHelpersFactory, leafletLabelEvents) { +.factory('leafletMarkerEvents', function($rootScope, $q, leafletLogger, leafletHelpers, LeafletEventsHelpersFactory, leafletLabelEvents) { var safeApply = leafletHelpers.safeApply; var isDefined = leafletHelpers.isDefined; var Helpers = leafletHelpers; diff --git a/src/services/events/leafletPathEvents.js b/src/services/events/leafletPathEvents.js index 2690f835..c46c8ee5 100644 --- a/src/services/events/leafletPathEvents.js +++ b/src/services/events/leafletPathEvents.js @@ -1,9 +1,8 @@ angular.module('leaflet-directive') -.factory('leafletPathEvents', function($rootScope, $q, $log, leafletHelpers, leafletLabelEvents, leafletEventsHelpers) { +.factory('leafletPathEvents', function($rootScope, $q, leafletLogger, leafletHelpers, leafletLabelEvents, leafletEventsHelpers) { var isDefined = leafletHelpers.isDefined; var isObject = leafletHelpers.isObject; var Helpers = leafletHelpers; - var errorHeader = leafletHelpers.errorHeader; var lblHelp = leafletLabelEvents; var fire = leafletEventsHelpers.fire; @@ -14,12 +13,12 @@ angular.module('leaflet-directive') var _genDispatchPathEvent = function(maybeMapId, eventName, logic, leafletScope, lObject, name, model, layerName) { maybeMapId = maybeMapId || ''; - if (maybeMapId) + if (maybeMapId) { maybeMapId = '.' + maybeMapId; + } return function(e) { var broadcastName = 'leafletDirectivePath' + maybeMapId + '.' + eventName; - $log.debug(broadcastName); fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName); }; }; @@ -35,7 +34,7 @@ angular.module('leaflet-directive') pathEvents = _getAvailablePathEvents(); } else if (!isObject(leafletScope.eventBroadcast)) { // Not a valid object - $log.error(errorHeader + 'event-broadcast must be an object check your model.'); + leafletLogger.error('event-broadcast must be an object check your model.'); } else { // We have a possible valid object if (!isDefined(leafletScope.eventBroadcast.path)) { @@ -43,7 +42,7 @@ angular.module('leaflet-directive') pathEvents = _getAvailablePathEvents(); } else if (isObject(leafletScope.eventBroadcast.paths)) { // Not a valid object - $log.warn(errorHeader + 'event-broadcast.path must be an object check your model.'); + leafletLogger.warn('event-broadcast.path must be an object check your model.'); } else { // We have a possible valid map object // Event propadation logic @@ -51,7 +50,7 @@ angular.module('leaflet-directive') // We take care of possible propagation logic if (leafletScope.eventBroadcast.path.logic !== 'emit' && leafletScope.eventBroadcast.path.logic !== 'broadcast') { // This is an error - $log.warn(errorHeader + 'Available event propagation logic are: \'emit\' or \'broadcast\'.'); + leafletLogger.warn('Available event propagation logic are: \'emit\' or \'broadcast\'.'); } else if (leafletScope.eventBroadcast.path.logic === 'emit') { logic = 'emit'; } @@ -74,10 +73,10 @@ angular.module('leaflet-directive') if (pathEventsEnable && pathEventsDisable) { // Both are active, this is an error - $log.warn(errorHeader + 'can not enable and disable events at the same time'); + leafletLogger.warn('can not enable and disable events at the same time'); } else if (!pathEventsEnable && !pathEventsDisable) { // Both are inactive, this is an error - $log.warn(errorHeader + 'must enable or disable events'); + leafletLogger.warn('must enable or disable events'); } else { // At this point the path object is OK, lets enable or disable events if (pathEventsEnable) { @@ -88,12 +87,12 @@ angular.module('leaflet-directive') // Do we have already the event enabled? if (pathEvents.indexOf(eventName) !== -1) { // Repeated event, this is an error - $log.warn(errorHeader + 'This event ' + eventName + ' is already enabled'); + leafletLogger.warn('This event ' + eventName + ' is already enabled'); } else { // Does the event exists? if (_getAvailablePathEvents().indexOf(eventName) === -1) { // The event does not exists, this is an error - $log.warn(errorHeader + 'This event ' + eventName + ' does not exist'); + leafletLogger.warn('This event ' + eventName + ' does not exist'); } else { // All ok enable the event pathEvents.push(eventName); @@ -108,7 +107,7 @@ angular.module('leaflet-directive') var index = pathEvents.indexOf(eventName); if (index === -1) { // The event does not exist - $log.warn(errorHeader + 'This event ' + eventName + ' does not exist or has been already disabled'); + leafletLogger.warn('This event ' + eventName + ' does not exist or has been already disabled'); } else { pathEvents.splice(index, 1); diff --git a/src/services/leafletBoundsHelpers.js b/src/services/leafletBoundsHelpers.js index 5e869162..4b972c04 100644 --- a/src/services/leafletBoundsHelpers.js +++ b/src/services/leafletBoundsHelpers.js @@ -1,4 +1,4 @@ -angular.module('leaflet-directive').factory('leafletBoundsHelpers', function($log, leafletHelpers) { +angular.module('leaflet-directive').factory('leafletBoundsHelpers', function(leafletLogger, leafletHelpers) { var isArray = leafletHelpers.isArray; var isNumber = leafletHelpers.isNumber; @@ -28,7 +28,7 @@ angular.module('leaflet-directive').factory('leafletBoundsHelpers', function($lo boundsArray[0].length === 2 && boundsArray[1].length === 2 && isNumber(boundsArray[0][0]) && isNumber(boundsArray[0][1]) && isNumber(boundsArray[1][0]) && isNumber(boundsArray[1][1]))) { - $log.error('[AngularJS - Leaflet] The bounds array is not valid.'); + leafletLogger.error('The bounds array is not valid.'); return; } @@ -46,7 +46,7 @@ angular.module('leaflet-directive').factory('leafletBoundsHelpers', function($lo createBoundsFromLeaflet: function(lfBounds) { if (!(isDefined(lfBounds) && isFunction(lfBounds.getNorthEast) && isFunction(lfBounds.getSouthWest))) { - $log.error('[AngularJS - Leaflet] The leaflet bounds is not valid object.'); + leafletLogger.error('The leaflet bounds is not valid object.'); return; } diff --git a/src/services/leafletControlHelpers.js b/src/services/leafletControlHelpers.js index a2d5684f..c683d338 100644 --- a/src/services/leafletControlHelpers.js +++ b/src/services/leafletControlHelpers.js @@ -1,9 +1,8 @@ -angular.module('leaflet-directive').factory('leafletControlHelpers', function($rootScope, $log, leafletHelpers, leafletLayerHelpers, leafletMapDefaults) { +angular.module('leaflet-directive').factory('leafletControlHelpers', function($rootScope, leafletLogger, leafletHelpers, leafletLayerHelpers, leafletMapDefaults) { var isDefined = leafletHelpers.isDefined; var isObject = leafletHelpers.isObject; var createLayer = leafletLayerHelpers.createLayer; var _controls = {}; - var errorHeader = leafletHelpers.errorHeader + ' [Controls] '; var _controlLayersMustBeVisible = function(baselayers, overlays, mapId) { var defaults = leafletMapDefaults.getDefaults(mapId); @@ -58,7 +57,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', function($r draw: { isPluginLoaded: function() { if (!angular.isDefined(L.Control.Draw)) { - $log.error(errorHeader + ' Draw plugin is not loaded.'); + leafletLogger.error('Draw plugin is not loaded.'); return false; } @@ -89,7 +88,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', function($r fullscreen: { isPluginLoaded: function() { if (!angular.isDefined(L.Control.Fullscreen)) { - $log.error(errorHeader + ' Fullscreen plugin is not loaded.'); + leafletLogger.error('Fullscreen plugin is not loaded.'); return false; } @@ -107,7 +106,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', function($r search: { isPluginLoaded: function() { if (!angular.isDefined(L.Control.Search)) { - $log.error(errorHeader + ' Search plugin is not loaded.'); + leafletLogger.error(' Search plugin is not loaded.'); return false; } @@ -126,7 +125,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', function($r minimap: { isPluginLoaded: function() { if (!angular.isDefined(L.Control.MiniMap)) { - $log.error(errorHeader + ' Minimap plugin is not loaded.'); + leafletLogger.error('Minimap plugin is not loaded.'); return false; } @@ -135,7 +134,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', function($r checkValidParams: function(params) { if (!isDefined(params.layer)) { - $log.warn(errorHeader + ' minimap "layer" option should be defined.'); + leafletLogger.warn('minimap "layer" option should be defined.'); return false; } @@ -146,7 +145,7 @@ angular.module('leaflet-directive').factory('leafletControlHelpers', function($r var layer = createLayer(params.layer); if (!isDefined(layer)) { - $log.warn(errorHeader + ' minimap control "layer" could not be created.'); + leafletLogger.warn('minimap control "layer" could not be created.'); return; } diff --git a/src/services/leafletData.js b/src/services/leafletData.js index 181d93e3..efc4e6e1 100644 --- a/src/services/leafletData.js +++ b/src/services/leafletData.js @@ -1,10 +1,10 @@ -angular.module('leaflet-directive').service('leafletData', function($log, $q, leafletHelpers) { - var getDefer = leafletHelpers.getDefer, - getUnresolvedDefer = leafletHelpers.getUnresolvedDefer, - setResolvedDefer = leafletHelpers.setResolvedDefer; +angular.module('leaflet-directive').service('leafletData', function(leafletLogger, $q, leafletHelpers) { + var getDefer = leafletHelpers.getDefer; + var getUnresolvedDefer = leafletHelpers.getUnresolvedDefer; + var setResolvedDefer = leafletHelpers.setResolvedDefer; var _private = {}; - var self = this; + var _this = this; var upperFirst = function(string) { return string.charAt(0).toUpperCase() + string.slice(1); @@ -19,7 +19,8 @@ angular.module('leaflet-directive').service('leafletData', function($log, $q, le 'geoJSON', 'UTFGrid', //odd ball on naming convention keeping to not break 'decorations', - 'directiveControls', ]; + 'directiveControls', + ]; //init _privateItems.forEach(function(itemName) { @@ -36,13 +37,13 @@ angular.module('leaflet-directive').service('leafletData', function($log, $q, le //int repetitive stuff (get and sets) _privateItems.forEach(function(itemName) { var name = upperFirst(itemName); - self['set' + name] = function(lObject, scopeId) { + _this['set' + name] = function(lObject, scopeId) { var defer = getUnresolvedDefer(_private[itemName], scopeId); defer.resolve(lObject); setResolvedDefer(_private[itemName], scopeId); }; - self['get' + name] = function(scopeId) { + _this['get' + name] = function(scopeId) { var defer = getDefer(_private[itemName], scopeId); return defer.promise; }; diff --git a/src/services/leafletDirectiveControlsHelpers.js b/src/services/leafletDirectiveControlsHelpers.js index d0bdc362..a50766a9 100644 --- a/src/services/leafletDirectiveControlsHelpers.js +++ b/src/services/leafletDirectiveControlsHelpers.js @@ -1,17 +1,13 @@ angular.module('leaflet-directive') -.service('leafletDirectiveControlsHelpers', function($log, leafletData, leafletHelpers) { +.service('leafletDirectiveControlsHelpers', function(leafletLogger, leafletData, leafletHelpers) { var _isDefined = leafletHelpers.isDefined; var _isString = leafletHelpers.isString; var _isObject = leafletHelpers.isObject; - var _mainErrorHeader = leafletHelpers.errorHeader; - - var _errorHeader = _mainErrorHeader + '[leafletDirectiveControlsHelpers'; var _extend = function(id, thingToAddName, createFn, cleanFn) { - var _fnHeader = _errorHeader + '.extend] '; var extender = {}; if (!_isDefined(thingToAddName)) { - $log.error(_fnHeader + 'thingToAddName cannot be undefined'); + leafletLogger.error('control name cannot be undefined'); return; } @@ -23,7 +19,7 @@ angular.module('leaflet-directive') } else if (_isObject(thingToAddName) && !_isDefined(createFn) && !_isDefined(cleanFn)) { extender = thingToAddName; } else { - $log.error(_fnHeader + 'incorrect arguments'); + leafletLogger.error('incorrect arguments'); return; } diff --git a/src/services/leafletHelpers.js b/src/services/leafletHelpers.js index 8a161586..74f8173f 100644 --- a/src/services/leafletHelpers.js +++ b/src/services/leafletHelpers.js @@ -1,5 +1,4 @@ -angular.module('leaflet-directive').service('leafletHelpers', function($q, $log) { - var _errorHeader = '[AngularJS - Leaflet] '; +angular.module('leaflet-directive').service('leafletHelpers', function($q, leafletLogger) { var _copy = angular.copy; var _clone = _copy; /* @@ -17,8 +16,9 @@ angular.module('leaflet-directive').service('leafletHelpers', function($q, $log) */ var _getObjectValue = function(object, pathStr) { var obj; - if (!object || !angular.isObject(object)) - return; + if (!object || !angular.isObject(object)) { + return; + } //if the key is not a sting then we already have the value if ((pathStr === null) || !angular.isString(pathStr)) { @@ -71,7 +71,7 @@ angular.module('leaflet-directive').service('leafletHelpers', function($q, $log) } } } else { - $log.error(_errorHeader + '- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call'); + leafletLogger.error('You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call'); } } else { id = mapId; @@ -145,7 +145,6 @@ angular.module('leaflet-directive').service('leafletHelpers', function($q, $log) directiveNormalize: directiveNormalize, copy:_copy, clone:_clone, - errorHeader: _errorHeader, getObjectValue: _getObjectValue, getObjectArrayPath:_getObjectArrayPath, getObjectDotPath: _getObjectDotPath, @@ -658,7 +657,7 @@ angular.module('leaflet-directive').service('leafletHelpers', function($q, $log) if (this.isLoaded()) { return layer instanceof L.UtfGrid; } else { - $log.error('[AngularJS - Leaflet] No UtfGrid plugin found.'); + leafletLogger.error('No UtfGrid plugin found.'); return false; } }, diff --git a/src/services/leafletIterators.js b/src/services/leafletIterators.js index cecab215..6847919f 100644 --- a/src/services/leafletIterators.js +++ b/src/services/leafletIterators.js @@ -1,7 +1,6 @@ -angular.module('leaflet-directive').service('leafletIterators', function($log, leafletHelpers) { +angular.module('leaflet-directive').service('leafletIterators', function(leafletLogger, leafletHelpers) { var lHlp = leafletHelpers; - var errorHeader = leafletHelpers.errorHeader + 'leafletIterators: '; //BEGIN COPY from underscore var _keys = Object.keys; @@ -33,23 +32,34 @@ angular.module('leaflet-directive').service('leafletIterators', function($log, l // of the passed-in callback, to be repeatedly applied in other Underscore // functions. var optimizeCb = function(func, context, argCount) { - if (context === void 0) return func; + if (context === void 0) { + return func; + } + switch (argCount === null ? 3 : argCount) { - case 1: return function(value) { - return func.call(context, value); - }; + case 1: { + return function(value) { + return func.call(context, value); + }; + } - case 2: return function(value, other) { - return func.call(context, value, other); - }; + case 2: { + return function(value, other) { + return func.call(context, value, other); + }; + } - case 3: return function(value, index, collection) { - return func.call(context, value, index, collection); - }; + case 3: { + return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + } - case 4: return function(accumulator, value, index, collection) { - return func.call(context, accumulator, value, index, collection); - }; + case 4: { + return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } } return function() { return func.apply(context, arguments); @@ -60,7 +70,10 @@ angular.module('leaflet-directive').service('leafletIterators', function($log, l var createAssigner = function(keysFunc, undefinedOnly) { return function(obj) { var length = arguments.length; - if (length < 2 || obj === null) return obj; + if (length < 2 || obj === null) { + return obj; + } + for (var index = 1; index < length; index++) { var source = arguments[index]; var keys = keysFunc(source); @@ -68,7 +81,9 @@ angular.module('leaflet-directive').service('leafletIterators', function($log, l for (var i = 0; i < l; i++) { var key = keys[i]; - if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; + if (!undefinedOnly || obj[key] === void 0) { + obj[key] = source[key]; + } } } @@ -86,11 +101,16 @@ angular.module('leaflet-directive').service('leafletIterators', function($log, l var _isMatch = function(object, attrs) { var keys = _keys(attrs); var length = keys.length; - if (object === null) return !length; + if (object === null) { + return !length; + } + var obj = Object(object); for (var i = 0; i < length; i++) { var key = keys[i]; - if (attrs[key] !== obj[key] || !(key in obj)) return false; + if (attrs[key] !== obj[key] || !(key in obj)) { + return false; + } } return true; @@ -111,9 +131,18 @@ angular.module('leaflet-directive').service('leafletIterators', function($log, l // to each element in a collection, returning the desired result — either // identity, an arbitrary callback, a property matcher, or a property accessor. var cb = function(value, context, argCount) { - if (value === null) return _identity; - if (_isFunction(value)) return optimizeCb(value, context, argCount); - if (_isObject(value)) return _matcher(value); + if (value === null) { + return _identity; + } + + if (_isFunction(value)) { + return optimizeCb(value, context, argCount); + } + + if (_isObject(value)) { + return _matcher(value); + } + return _property(value); }; @@ -125,7 +154,9 @@ angular.module('leaflet-directive').service('leafletIterators', function($log, l var length = (keys || obj).length; for (var index = 0; index < length; index++) { var currentKey = keys ? keys[index] : index; - if (!predicate(obj[currentKey], currentKey, obj)) return false; + if (!predicate(obj[currentKey], currentKey, obj)) { + return false; + } } return true; @@ -142,7 +173,7 @@ angular.module('leaflet-directive').service('leafletIterators', function($log, l if (!lHlp.isFunction(cb)) { cbName = lHlp.defaultTo(cb, 'cb'); - $log.error(errorHeader + cbName + ' is not a function'); + leafletLogger.error(cbName + ' is not a function', 'iterators'); return true; } diff --git a/src/services/leafletLayerHelpers.js b/src/services/leafletLayerHelpers.js index d2d5b319..f377f98a 100644 --- a/src/services/leafletLayerHelpers.js +++ b/src/services/leafletLayerHelpers.js @@ -1,16 +1,15 @@ angular.module('leaflet-directive') -.factory('leafletLayerHelpers', function($rootScope, $log, $q, leafletHelpers, leafletIterators) { +.factory('leafletLayerHelpers', function($rootScope, leafletLogger, $q, leafletHelpers, leafletIterators) { var Helpers = leafletHelpers; var isString = leafletHelpers.isString; var isObject = leafletHelpers.isObject; var isArray = leafletHelpers.isArray; var isDefined = leafletHelpers.isDefined; - var errorHeader = leafletHelpers.errorHeader; var $it = leafletIterators; var utfGridCreateLayer = function(params) { if (!Helpers.UTFGridPlugin.isLoaded()) { - $log.error('[AngularJS - Leaflet] The UTFGrid plugin is not loaded.'); + leafletLogger.error('The UTFGrid plugin is not loaded'); return; } @@ -253,7 +252,7 @@ angular.module('leaflet-directive') mustHaveUrl: true, createLayer: function(params) { if (!Helpers.AGSFeatureLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri plugin is not loaded.'); + leafletLogger.warn('The AGS Feature plugin is not loaded.'); return; } @@ -279,7 +278,7 @@ angular.module('leaflet-directive') mustHaveUrl: true, createLayer: function(params) { if (!Helpers.AGSTiledMapLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri plugin is not loaded.'); + leafletLogger.warn(' The AGS Tiled plugin is not loaded'); return; } @@ -292,7 +291,7 @@ angular.module('leaflet-directive') mustHaveUrl: true, createLayer: function(params) { if (!Helpers.AGSDynamicMapLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri plugin is not loaded.'); + leafletLogger.warn(' The AGS Dynamic plugin is not loaded.'); return; } @@ -305,7 +304,7 @@ angular.module('leaflet-directive') mustHaveUrl: true, createLayer: function(params) { if (!Helpers.AGSImageMapLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri plugin is not loaded.'); + leafletLogger.warn('The AGSIImageMapLayer plugin is not loaded.'); return; } @@ -318,12 +317,12 @@ angular.module('leaflet-directive') mustHaveUrl: true, createLayer: function(params) { if (!Helpers.AGSClusteredLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri clustered layer plugin is not loaded.'); + leafletLogger.warn(' The AGS clustered layer plugin is not loaded.'); return; } if (!Helpers.MarkerClusterPlugin.isLoaded()) { - $log.warn(errorHeader + ' The markercluster plugin is not loaded.'); + leafletLogger.warn('The markercluster plugin is not loaded.'); return; } @@ -334,12 +333,12 @@ angular.module('leaflet-directive') mustHaveUrl: true, createLayer: function(params) { if (!Helpers.AGSHeatmapLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The esri heatmap layer plugin is not loaded.'); + leafletLogger.warn('The AGS heatmap layer plugin is not loaded.'); return; } if (!Helpers.HeatLayerPlugin.isLoaded()) { - $log.warn(errorHeader + ' The heatlayer plugin is not loaded.'); + leafletLogger.warn('The heatlayer plugin is not loaded.'); return; } @@ -350,7 +349,7 @@ angular.module('leaflet-directive') mustHaveUrl: false, createLayer: function(params) { if (!Helpers.MarkerClusterPlugin.isLoaded()) { - $log.warn(errorHeader + ' The markercluster plugin is not loaded.'); + leafletLogger.warn('The markercluster plugin is not loaded.'); return; } @@ -438,7 +437,7 @@ angular.module('leaflet-directive') if (params.layer instanceof L.Class) { return angular.copy(params.layer); } else { - $log.error('[AngularJS - Leaflet] A custom layer must be a leaflet Class'); + leafletLogger.error('A custom layer must be a leaflet Class'); } }, }, @@ -453,38 +452,38 @@ angular.module('leaflet-directive') function isValidLayerType(layerDefinition) { // Check if the baselayer has a valid type if (!isString(layerDefinition.type)) { - $log.error('[AngularJS - Leaflet] A layer must have a valid type defined.'); + leafletLogger.error('A layer must have a valid type defined.'); return false; } if (Object.keys(layerTypes).indexOf(layerDefinition.type) === -1) { - $log.error('[AngularJS - Leaflet] A layer must have a valid type: ' + Object.keys(layerTypes)); + leafletLogger.error('A layer must have a valid type: ' + Object.keys(layerTypes)); return false; } // Check if the layer must have an URL if (layerTypes[layerDefinition.type].mustHaveUrl && !isString(layerDefinition.url)) { - $log.error('[AngularJS - Leaflet] A base layer must have an url'); + leafletLogger.error('A base layer must have an url'); return false; } if (layerTypes[layerDefinition.type].mustHaveData && !isDefined(layerDefinition.data)) { - $log.error('[AngularJS - Leaflet] The base layer must have a "data" array attribute'); + leafletLogger.error('The base layer must have a "data" array attribute'); return false; } if (layerTypes[layerDefinition.type].mustHaveLayer && !isDefined(layerDefinition.layer)) { - $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have an layer defined'); + leafletLogger.error('The type of layer ' + layerDefinition.type + ' must have an layer defined'); return false; } if (layerTypes[layerDefinition.type].mustHaveBounds && !isDefined(layerDefinition.bounds)) { - $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have bounds defined'); + leafletLogger.error('The type of layer ' + layerDefinition.type + ' must have bounds defined'); return false; } if (layerTypes[layerDefinition.type].mustHaveKey && !isDefined(layerDefinition.key)) { - $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have key defined'); + leafletLogger.error('The type of layer ' + layerDefinition.type + ' must have key defined'); return false; } @@ -497,7 +496,7 @@ angular.module('leaflet-directive') } if (!isString(layerDefinition.name)) { - $log.error('[AngularJS - Leaflet] A base layer must have a name'); + leafletLogger.error('A base layer must have a name'); return; } @@ -545,7 +544,6 @@ angular.module('leaflet-directive') if (isDefined(layerOptions) && isDefined(layerOptions.loadedDefer)) { if (angular.isFunction(layerOptions.loadedDefer)) { var defers = layerOptions.loadedDefer(); - $log.debug('Loaded Deferred', defers); var count = defers.length; if (count > 0) { var resolve = function() { diff --git a/src/services/leafletLogger.js b/src/services/leafletLogger.js new file mode 100644 index 00000000..3182452e --- /dev/null +++ b/src/services/leafletLogger.js @@ -0,0 +1,31 @@ +angular.module('leaflet-directive').service('leafletLogger', function($log) { + var prefix = '[angular-leaflet] '; + + return { + log: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.log(prefix + section + msg); + }, + + debug: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.debug(prefix + section + msg); + }, + + info: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.info(prefix + section + msg); + }, + + warn: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.warn(prefix + section + msg); + }, + + error: function(msg, section) { + section = section ? '[' + section + '] ' : ''; + $log.error(prefix + section + msg); + }, + + }; +}); diff --git a/src/services/leafletMarkersHelpers.js b/src/services/leafletMarkersHelpers.js index 3c2c3498..38ecb1e9 100644 --- a/src/services/leafletMarkersHelpers.js +++ b/src/services/leafletMarkersHelpers.js @@ -1,4 +1,4 @@ -angular.module('leaflet-directive').service('leafletMarkersHelpers', function($rootScope, $timeout, leafletHelpers, $log, $compile, leafletGeoJsonHelpers) { +angular.module('leaflet-directive').service('leafletMarkersHelpers', function($rootScope, $timeout, leafletHelpers, leafletLogger, $compile, leafletGeoJsonHelpers) { var isDefined = leafletHelpers.isDefined; var defaultTo = leafletHelpers.defaultTo; var MarkerClusterPlugin = leafletHelpers.MarkerClusterPlugin; @@ -14,7 +14,6 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r var isObject = leafletHelpers.isObject; var groups = {}; var geoHlp = leafletGeoJsonHelpers; - var errorHeader = leafletHelpers.errorHeader; var _string = function(marker) { //this exists since JSON.stringify barfs on cyclic @@ -26,15 +25,10 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r return '[leafletMarker] : \n' + retStr; }; - var _log = function(marker, useConsole) { - var logger = useConsole ? console : $log; - logger.debug(_string(marker)); - }; - var createLeafletIcon = function(iconData) { if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'awesomeMarker') { if (!AwesomeMarkersPlugin.isLoaded()) { - $log.error(errorHeader + ' The AwesomeMarkers Plugin is not loaded.'); + leafletLogger.error('The AwesomeMarkers Plugin is not loaded.'); } return new L.AwesomeMarkers.icon(iconData); @@ -42,7 +36,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'vectorMarker') { if (!VectorMarkersPlugin.isLoaded()) { - $log.error(errorHeader + ' The VectorMarkers Plugin is not loaded.'); + leafletLogger.error('The VectorMarkers Plugin is not loaded.'); } return new L.VectorMarkers.icon(iconData); @@ -50,7 +44,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'makiMarker') { if (!MakiMarkersPlugin.isLoaded()) { - $log.error(errorHeader + 'The MakiMarkers Plugin is not loaded.'); + leafletLogger.error('The MakiMarkers Plugin is not loaded.'); } return new L.MakiMarkers.icon(iconData); @@ -58,7 +52,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'extraMarker') { if (!ExtraMarkersPlugin.isLoaded()) { - $log.error(errorHeader + 'The ExtraMarkers Plugin is not loaded.'); + leafletLogger.error('The ExtraMarkers Plugin is not loaded.'); } return new L.ExtraMarkers.icon(iconData); @@ -70,7 +64,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'dom') { if (!DomMarkersPlugin.isLoaded()) { - $log.error(errorHeader + 'The DomMarkers Plugin is not loaded.'); + leafletLogger.error('The DomMarkers Plugin is not loaded.'); } var markerScope = angular.isFunction(iconData.getMarkerScope) ? iconData.getMarkerScope() : $rootScope; @@ -188,7 +182,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r if (compileMessage) { if (!isDefined(marker._popup) || !isDefined(marker._popup._contentNode)) { - $log.error(errorHeader + 'Popup is invalid or does not have any content.'); + leafletLogger.error('Popup is invalid or does not have any content.'); return false; } @@ -220,7 +214,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r // Update the lat-lng property (always present in marker properties) if (!geoHlp.validateCoords(markerData)) { - $log.warn('There are problems with lat-lng data, please verify your marker model'); + leafletLogger.warn('There are problems with lat-lng data, please verify your marker model'); _deleteMarker(marker, map, layers); return; } @@ -271,14 +265,14 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r // The markerData.layer is defined so we add the marker to the layer if it is different from the old data if (!isDefined(layers.overlays[markerData.layer])) { - $log.error(errorHeader + 'You must use a name of an existing layer'); + leafletLogger.error('You must use a name of an existing layer'); return; } // Is a group layer? var layerGroup = layers.overlays[markerData.layer]; if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { - $log.error(errorHeader + 'A marker can only be added to a layer of type "group" or "featureGroup"'); + leafletLogger.error('A marker can only be added to a layer of type "group" or "featureGroup"'); return; } @@ -391,7 +385,7 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r } // The markerData.focus property must be true so we update if there wasn't a previous value or it wasn't true - if (markerData.focus === true && (!isDefined(oldMarkerData.focus) || oldMarkerData.focus === false) || (isInitializing && markerData.focus === true)) { + if (markerData.focus === true && (markerData.lat !== oldMarkerData.lat || markerData.lng !== oldMarkerData.lng || !isDefined(oldMarkerData.focus) || oldMarkerData.focus === false) || (isInitializing && markerData.focus === true)) { // Reopen the popup when focus is still true marker.openPopup(); updatedFocus = true; @@ -453,14 +447,14 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r createMarker: function(markerData) { if (!isDefined(markerData) || !geoHlp.validateCoords(markerData)) { - $log.error(errorHeader + 'The marker definition is not valid.'); + leafletLogger.error('The marker definition is not valid.'); return; } var coords = geoHlp.getCoords(markerData); if (!isDefined(coords)) { - $log.error(errorHeader + 'Unable to get coordinates from markerData.'); + leafletLogger.error('Unable to get coordinates from markerData.'); return; } @@ -492,12 +486,12 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r addMarkerToGroup: function(marker, groupName, groupOptions, map) { if (!isString(groupName)) { - $log.error(errorHeader + 'The marker group you have specified is invalid.'); + leafletLogger.error('The marker group you have specified is invalid.'); return; } if (!MarkerClusterPlugin.isLoaded()) { - $log.error(errorHeader + 'The MarkerCluster plugin is not loaded.'); + leafletLogger.error('The MarkerCluster plugin is not loaded.'); return; } @@ -527,8 +521,9 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r marker.on('add', function(/* event */) { safeApply(leafletScope, function() { - if ('label' in markerData) - _manageOpenLabel(marker, markerData); + if ('label' in markerData) { + _manageOpenLabel(marker, markerData); + } }); }); }, @@ -551,6 +546,5 @@ angular.module('leaflet-directive').service('leafletMarkersHelpers', function($r }, string: _string, - log: _log, }; }); diff --git a/src/services/leafletPathsHelpers.js b/src/services/leafletPathsHelpers.js index e763433c..1a9759f1 100644 --- a/src/services/leafletPathsHelpers.js +++ b/src/services/leafletPathsHelpers.js @@ -1,4 +1,4 @@ -angular.module('leaflet-directive').factory('leafletPathsHelpers', function($rootScope, $log, leafletHelpers) { +angular.module('leaflet-directive').factory('leafletPathsHelpers', function($rootScope, leafletLogger, leafletHelpers) { var isDefined = leafletHelpers.isDefined; var isArray = leafletHelpers.isArray; var isNumber = leafletHelpers.isNumber; @@ -265,7 +265,7 @@ angular.module('leaflet-directive').factory('leafletPathsHelpers', function($roo var pathData = _getPathData(path); if (!pathTypes[path.type].isValid(pathData)) { - $log.error('[AngularJS - Leaflet] Invalid data passed to the ' + path.type + ' path'); + leafletLogger.error('Invalid data passed to the ' + path.type + ' path'); return; } diff --git a/src/services/leafletWatchHelpers.js b/src/services/leafletWatchHelpers.js index b7fe4b84..76ab40b0 100644 --- a/src/services/leafletWatchHelpers.js +++ b/src/services/leafletWatchHelpers.js @@ -5,8 +5,9 @@ angular.module('leaflet-directive') //watchOptions.isDeep is/should be ignored in $watchCollection var unWatch = scope[watchFunctionName](thingToWatchStr, function(newValue, oldValue) { initCb(newValue, oldValue); - if (!watchOptions.doWatch) - unWatch(); + if (!watchOptions.doWatch) { + unWatch(); + } }, watchOptions.isDeep); return unWatch; diff --git a/test/karma-unit.conf.js b/test/karma-unit.conf.js index f247fbd4..1f90c511 100644 --- a/test/karma-unit.conf.js +++ b/test/karma-unit.conf.js @@ -12,8 +12,7 @@ module.exports = function(karma) { 'bower_components/leaflet.vector-markers/dist/Leaflet.vector-markers.js', 'bower_components/Leaflet.PolylineDecorator/leaflet.polylineDecorator.js', 'dist/angular-leaflet-directive.js', - 'test/unit/*.js', - 'test/unit/**/marker*.js', + 'test/unit/**/*.js', ], // Frameworks diff --git a/test/unit/000-leafletDirectiveSpec.js b/test/unit/000-leafletDirectiveSpec.js index 2a0da65b..b281c0dc 100755 --- a/test/unit/000-leafletDirectiveSpec.js +++ b/test/unit/000-leafletDirectiveSpec.js @@ -62,7 +62,7 @@ describe('Directive: leaflet', function() { it('should set the max zoom if specified', function() { angular.extend(scope, { defaults: { maxZoom: 15 } }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var leafletMap; leafletData.getMap().then(function(map) { @@ -75,7 +75,7 @@ describe('Directive: leaflet', function() { it('should set the min zoom if specified', function() { angular.extend(scope, { defaults: { minZoom: 4 } }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var leafletMap; leafletData.getMap().then(function(map) { @@ -87,7 +87,7 @@ describe('Directive: leaflet', function() { }); it('should set the CSS width and height if they are passed as string attributes', function() { - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); expect(element.css('width')).toBe('640px'); @@ -95,7 +95,7 @@ describe('Directive: leaflet', function() { }); it('should set the CSS width and height if they are passed as number attributes', function() { - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); expect(element.css('width')).toBe('640px'); @@ -112,7 +112,7 @@ describe('Directive: leaflet', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var leafletTiles; leafletData.getTiles().then(function(tiles) { @@ -133,7 +133,7 @@ describe('Directive: leaflet', function() { zoomControlPosition: 'topright', }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var leafletMap; leafletData.getMap().then(function(map) { @@ -150,7 +150,7 @@ describe('Directive: leaflet', function() { zoomControl: false, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var leafletMap; leafletData.getMap().then(function(map) { @@ -187,7 +187,7 @@ describe('Directive: leaflet', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var leafletMap; leafletData.getMap().then(function(map) { diff --git a/test/unit/010-centerDirectiveSpec.js b/test/unit/010-centerDirectiveSpec.js index 7f61d11c..04956b16 100644 --- a/test/unit/010-centerDirectiveSpec.js +++ b/test/unit/010-centerDirectiveSpec.js @@ -10,7 +10,6 @@ describe('Directive: leaflet center', function() { var $timeout; var $location; var leafletData; - var center; var scope; beforeEach(module('leaflet-directive')); @@ -21,14 +20,13 @@ describe('Directive: leaflet center', function() { $location = _$location_; leafletData = _leafletData_; - center = { + scope = $rootScope.$new(); + scope.center = { lat: 0.96658, lng: 2.02, zoom: 4, }; - scope = $rootScope.$new(); - scope.center = center; })); afterEach(inject(function($rootScope) { @@ -37,7 +35,7 @@ describe('Directive: leaflet center', function() { it('should have default {[0, 0], 1} parameters on the map if not correctly defined', function() { scope.center = {}; - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); @@ -49,20 +47,21 @@ describe('Directive: leaflet center', function() { }); it('should update the map center if the initial center scope properties are set', function() { - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); leafletData.getMap().then(function(map) { - expect(map.getZoom()).toEqual(center.zoom); + expect(map.getZoom()).toEqual(scope.center.zoom); expect(map.getCenter().lat).toBeCloseTo(0.96658, 4); expect(map.getCenter().lng).toBeCloseTo(2.02, 4); }); }); it('should update the map center if the scope center properties changes', function() { - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); + var map; leafletData.getMap().then(function(leafletMap) { map = leafletMap; @@ -74,9 +73,9 @@ describe('Directive: leaflet center', function() { expect(map.getCenter().lng).toBeCloseTo(2.02, 4); expect(map.getZoom()).toEqual(4); - center.lat = 2.02999; - center.lng = 4.04; - center.zoom = 8; + scope.center.lat = 2.02999; + scope.center.lng = 4.04; + scope.center.zoom = 8; scope.$digest(); expect(map.getCenter().lat).toBeCloseTo(2.02999, 4); @@ -86,7 +85,7 @@ describe('Directive: leaflet center', function() { describe('Using url-hash functionality', function() { it('should update the center of the map if changes the url', function() { - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { @@ -106,7 +105,7 @@ describe('Directive: leaflet center', function() { }); it('should update the url hash if changes the center', function() { - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.center = { lat: 9.52478, lng: -1.8, zoom: 8 }; var centerUrlHash; diff --git a/test/unit/020-boundsDirectiveSpec.js b/test/unit/020-boundsDirectiveSpec.js index bc95c49b..923714ab 100755 --- a/test/unit/020-boundsDirectiveSpec.js +++ b/test/unit/020-boundsDirectiveSpec.js @@ -41,7 +41,7 @@ describe('Directive: bounds', function() { bounds: bounds, center: {}, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; @@ -62,7 +62,7 @@ describe('Directive: bounds', function() { bounds: {}, center: {}, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; @@ -82,7 +82,7 @@ describe('Directive: bounds', function() { bounds: {}, center: { lat: 5, lng: -3, zoom: 4 }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; @@ -109,7 +109,7 @@ describe('Directive: bounds', function() { bounds: bounds, center: {}, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; @@ -139,7 +139,7 @@ describe('Directive: bounds', function() { bounds: bounds, center: {}, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; diff --git a/test/unit/030-tilesDirectiveSpec.js b/test/unit/030-tilesDirectiveSpec.js index 0e5e27e6..3e2c34d9 100755 --- a/test/unit/030-tilesDirectiveSpec.js +++ b/test/unit/030-tilesDirectiveSpec.js @@ -26,7 +26,7 @@ describe('Directive: leaflet', function() { it('should set default tiles if bad tiles structure is provided', function() { angular.extend(scope, { tiles: {} }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); leafletData.getTiles().then(function(leafletTiles) { var defaults = leafletMapDefaults.getDefaults(); @@ -39,8 +39,11 @@ describe('Directive: leaflet', function() { url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', }; angular.extend(scope, { tiles: tiles }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); + + scope.$digest(); + var leafletTiles; leafletData.getTiles().then(function(tiles) { leafletTiles = tiles; @@ -58,14 +61,18 @@ describe('Directive: leaflet', function() { url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', }; angular.extend(scope, { tiles: tiles }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); + scope.$digest(); + var leafletMap; leafletData.getMap().then(function(map) { leafletMap = map; }); + scope.$digest(); + var leafletTiles; leafletData.getTiles().then(function(tiles) { leafletTiles = tiles; @@ -90,14 +97,18 @@ describe('Directive: leaflet', function() { url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', }; angular.extend(scope, { tiles: tiles }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); + scope.$digest(); + var leafletMap; leafletData.getMap().then(function(map) { leafletMap = map; }); + scope.$digest(); + var leafletTiles; leafletData.getTiles().then(function(tiles) { leafletTiles = tiles; diff --git a/test/unit/040-maxboundsDirectiveSpec.js b/test/unit/040-maxboundsDirectiveSpec.js index 8601d04f..1f3627ee 100755 --- a/test/unit/040-maxboundsDirectiveSpec.js +++ b/test/unit/040-maxboundsDirectiveSpec.js @@ -40,7 +40,7 @@ describe('Directive: leaflet', function() { zoomAnimation: false, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)($rootScope); var leafletMap; leafletData.getMap().then(function(map) { diff --git a/test/unit/050-pathsDirectiveSpec.js b/test/unit/050-pathsDirectiveSpec.js index 40442813..00f518e5 100755 --- a/test/unit/050-pathsDirectiveSpec.js +++ b/test/unit/050-pathsDirectiveSpec.js @@ -38,7 +38,7 @@ describe('Directive: leaflet', function() { }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); @@ -64,7 +64,7 @@ describe('Directive: leaflet', function() { p2: { latlngs: latlngs2 }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); leafletData.getPaths().then(function(paths) { @@ -94,7 +94,7 @@ describe('Directive: leaflet', function() { p1: { latlngs: latlngs }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); leafletData.getPaths().then(function(paths) { @@ -126,7 +126,7 @@ describe('Directive: leaflet', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); leafletData.getPaths().then(function(paths) { @@ -152,7 +152,7 @@ describe('Directive: leaflet', function() { { lat: 1.02, lng: 3.04 }, ]; angular.extend(scope, { paths: { p1: { latlngs: latlngs, type: 'polygon' }}}); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); @@ -185,7 +185,7 @@ describe('Directive: leaflet', function() { { lat: 2.02, lng: 4.04 }, ]; angular.extend(scope, { paths: { p1: { latlngs: [latlngs1, latlngs2], type: 'multiPolygon' }}}); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); leafletData.getPaths().then(function(paths) { @@ -222,7 +222,7 @@ describe('Directive: leaflet', function() { { lat: 1.02, lng: 3.04 }, ]; angular.extend(scope, { paths: { p1: { latlngs: latlngs1, type: 'rectangle' }, p2: { latlngs: latlngs2, type: 'rectangle' }}}); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); leafletData.getPaths().then(function(paths) { @@ -259,7 +259,7 @@ describe('Directive: leaflet', function() { type: 'circle', }; angular.extend(scope, { paths: { p1: c1, p2: c2 }}); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); @@ -293,7 +293,7 @@ describe('Directive: leaflet', function() { type: 'circleMarker', }; angular.extend(scope, { paths: { p1: c1, p2: c2 }}); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); leafletData.getPaths().then(function(paths) { @@ -322,7 +322,7 @@ describe('Directive: leaflet', function() { { lat: 1.02, lng: 3.04 }, ]; angular.extend(scope, { paths: { p1: { latlngs: latlngs, type: 'polygon', color: 'white', fillColor: 'red' }}}); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); @@ -350,7 +350,7 @@ describe('Directive: leaflet', function() { { lat: 1.02, lng: 3.04 }, ]; angular.extend(scope, { paths: { p1: { latlngs: latlngs, type: 'polygon', color: 'white', fillColor: 'red' }}}); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); diff --git a/test/unit/070-geojsonDirectiveSpec.js b/test/unit/070-geojsonDirectiveSpec.js index e8ae05b1..0f29e8a8 100644 --- a/test/unit/070-geojsonDirectiveSpec.js +++ b/test/unit/070-geojsonDirectiveSpec.js @@ -29,7 +29,7 @@ describe('Directive: geojson', function() { angular.extend(scope, { geojson: {}, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)(scope); leafletData.getGeoJSON().then(function(geoJSON) { return expect(geoJSON).not.toBeDefined(); @@ -79,7 +79,7 @@ describe('Directive: geojson', function() { }, }, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)(scope); leafletData.getGeoJSON().then(function(geoJSON) { expect(geoJSON).toBeDefined(); @@ -132,17 +132,17 @@ describe('Directive: geojson', function() { }, }, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)(scope); leafletGeoJSON = void 0; leafletMap = void 0; leafletData.getMap().then(function(map) { - return leafletMap = map; + leafletMap = map; }); scope.$digest(); leafletData.getGeoJSON().then(function(geoJSON) { - return leafletGeoJSON = geoJSON; + leafletGeoJSON = geoJSON; }); scope.$digest(); @@ -215,7 +215,7 @@ describe('Directive: geojson', function() { }, }, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)(scope); leafletData.getGeoJSON().then(function(geoJSON) { expect(geoJSON).toBeDefined(); @@ -289,17 +289,17 @@ describe('Directive: geojson', function() { }, }, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)(scope); leafletGeoJSON = void 0; leafletMap = void 0; leafletData.getMap().then(function(map) { - return leafletMap = map; + leafletMap = map; }); scope.$digest(); leafletData.getGeoJSON().then(function(geoJSON) { - return leafletGeoJSON = geoJSON; + leafletGeoJSON = geoJSON; }); scope.$digest(); diff --git a/test/unit/080-markersDirectiveSpec.js b/test/unit/080-markersDirectiveSpec.js.000 similarity index 69% rename from test/unit/080-markersDirectiveSpec.js rename to test/unit/080-markersDirectiveSpec.js.000 index fdfd4608..de816931 100644 --- a/test/unit/080-markersDirectiveSpec.js +++ b/test/unit/080-markersDirectiveSpec.js.000 @@ -11,43 +11,46 @@ describe('Directive: leaflet', function() { var leafletHelpers; var mainLayers; var mainMarkers; + var scope; + var $timeout; mainLayers = mainMarkers = leafletHelpers = leafletData = $rootScope = $compile = void 0; beforeEach(module('leaflet-directive')); beforeEach(inject(function(_$compile_, _$rootScope_, _$timeout_, _leafletData_, _leafletHelpers_) { - var $timeout; - $compile = _$compile_; - $rootScope = _$rootScope_; - leafletData = _leafletData_; - leafletHelpers = _leafletHelpers_; - $timeout = _$timeout_; - })); + $compile = _$compile_; + $rootScope = _$rootScope_; + leafletData = _leafletData_; + leafletHelpers = _leafletHelpers_; + $timeout = _$timeout_; + + scope = $rootScope.$new(); + })); beforeEach(function() { - mainMarkers = { - paris: { - lat: 0.966, - lng: 2.02, - }, - madrid: { - lat: 2.02, - lng: 4.04, - }, - }; - return mainLayers = { - baselayers: { - osm: { - name: 'OpenStreetMap', - type: 'xyz', - url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - layerOptions: { - subdomains: ['a', 'b', 'c'], - attribution: '© OpenStreetMap contributors', - continuousWorld: true, - }, + mainMarkers = { + paris: { + lat: 0.966, + lng: 2.02, + }, + madrid: { + lat: 2.02, + lng: 4.04, + }, + }; + mainLayers = { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true, }, }, - overlays: { + }, + overlays: { cars: { name: 'cars', type: 'group', @@ -59,12 +62,12 @@ describe('Directive: leaflet', function() { visible: false, }, }, - }; - }); + }; + }); afterEach(inject(function($rootScope) { - return $rootScope.$apply(); - })); + $rootScope.$apply(); + })); it('should create main marker on the map', function() { var element; @@ -73,24 +76,24 @@ describe('Directive: leaflet', function() { lng: 2.02, }; - angular.extend($rootScope, { + angular.extend(scope, { markers: { mainMarker: mainMarker, }, }); - element = angular.element(''); - element = $compile(element)($rootScope); - $rootScope.$digest(); - return leafletData.getMarkers().then(function(leafletMarkers) { + element = angular.element(''); + element = $compile(element)(scope); + scope.$digest(); + leafletData.getMarkers().then(function(leafletMarkers) { var leafletMainMarker; leafletMainMarker = leafletMarkers.mainMarker; expect(leafletMainMarker.getLatLng().lat).toBeCloseTo(0.966); - return expect(leafletMainMarker.getLatLng().lng).toBeCloseTo(2.02); + expect(leafletMainMarker.getLatLng().lng).toBeCloseTo(2.02); }); }); describe('handles common markers correctly', function() { - return xit('markers count should be correct post update with no dupes', function() { + xit('markers count should be correct post update with no dupes', function() { var element; var markers1 = [ { @@ -117,20 +120,18 @@ describe('Directive: leaflet', function() { angular.extend($rootScope, { markers: markers1, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); $rootScope.$digest(); - return leafletData.getMarkers().then(function(leafletMarkers) { - return expect(Object.keys(leafletMarkers).length).toBe(markers1.length); - }).then((function(_this) { - return function() { - $rootScope.markers = markers2; - $rootScope.$digest(); - return leafletData.getMarkers().then(function(leafletMarkers) { - return expect(Object.keys(leafletMarkers).length).toBe(markers2.length); - }); - }; - })(this)); + leafletData.getMarkers().then(function(leafletMarkers) { + expect(Object.keys(leafletMarkers).length).toBe(markers1.length); + }).then(function() { + $rootScope.markers = markers2; + $rootScope.$digest(); + leafletData.getMarkers().then(function(leafletMarkers) { + expect(Object.keys(leafletMarkers).length).toBe(markers2.length); + }); + }); }); }); @@ -141,7 +142,7 @@ describe('Directive: leaflet', function() { lat: 0.966, lng: 2.02, }; - return this.testRunner = function(postRunnerCb, preRunnerCb) { + this.testRunner = function(postRunnerCb, preRunnerCb) { var element; var preRunnerRet; angular.extend($rootScope, { @@ -156,40 +157,39 @@ describe('Directive: leaflet', function() { mainMarker = preRunnerRet ? preRunnerRet : mainMarker; } - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); $rootScope.$digest(); - return leafletData.getMarkers().then(function(leafletMarkers) { + leafletData.getMarkers().then(function(leafletMarkers) { var leafletMainMarker; leafletMainMarker = leafletMarkers.layer1.mainMarker; if (postRunnerCb) { - return postRunnerCb(mainMarker, leafletMainMarker); + postRunnerCb(mainMarker, leafletMainMarker); } }); }; }); afterEach(function() { - var self; var _this = this; - return ['testRunner'].forEach(function(key) { - return delete _this[key]; + ['testRunner'].forEach(function(key) { + delete _this[key]; }); }); it('should create main marker on the map', function() { - return this.testRunner(function(mainMarker, leafletMainMarker) { + this.testRunner(function(mainMarker, leafletMainMarker) { expect(leafletMainMarker.getLatLng().lat).toBeCloseTo(mainMarker.lat); - return expect(leafletMainMarker.getLatLng().lng).toBeCloseTo(mainMarker.lng); + expect(leafletMainMarker.getLatLng().lng).toBeCloseTo(mainMarker.lng); }); }); - return it('should bind popup to main marker if message is given', function() { - return this.testRunner((function(mainMarker, leafletMainMarker) { - return expect(leafletMainMarker._popup._content).toEqual(mainMarker.message); - }), function(mainMarker) { + it('should bind popup to main marker if message is given', function() { + this.testRunner(function(mainMarker, leafletMainMarker) { + expect(leafletMainMarker._popup._content).toEqual(mainMarker.message); + }, function(mainMarker) { - return angular.extend(mainMarker, { + angular.extend(mainMarker, { message: 'this is paris', }); }); @@ -197,61 +197,66 @@ describe('Directive: leaflet', function() { }); it('should bind popup to main marker if message is given', function() { - var element; - var marker = { - lat: 0.966, - lng: 2.02, - message: 'this is paris', - }; - - angular.extend($rootScope, { - markers: { - marker: marker, - }, - }); - element = angular.element(''); - element = $compile(element)($rootScope); - $rootScope.$digest(); - return leafletData.getMarkers().then(function(leafletMarkers) { - var leafletMainMarker; - leafletMainMarker = leafletMarkers.marker; - return expect(leafletMainMarker._popup._content).toEqual('this is paris'); - }); + var element; + var marker = { + lat: 0.966, + lng: 2.02, + message: 'this is paris', + }; + + angular.extend($rootScope, { + markers: { + marker: marker, + }, }); - it('message should be compiled if angular template is given', function() { - var element; + element = angular.element(''); + element = $compile(element)($rootScope); + $rootScope.$digest(); + leafletData.getMarkers().then(function(leafletMarkers) { var leafletMainMarker; - var marker = { - lat: 0.966, - lng: 2.02, - message: '

      {{model.color}}

      ', - focus: true, - }; + leafletMainMarker = leafletMarkers.marker; + expect(leafletMainMarker._popup._content).toEqual('this is paris'); + }); + }); - angular.extend($rootScope, { - markers: { - marker: marker, - }, - }, { - model: { - color: 'blue', + it('message should be compiled if angular template is given', function() { + angular.extend($rootScope, { + markers: { + marker: { + lat: 0.966, + lng: 2.02, + message: '

      {{model.color}}

      ', + focus: true, }, - }); - element = angular.element(''); - element = $compile(element)($rootScope); - $rootScope.$digest(); - leafletMainMarker = void 0; - leafletData.getMarkers().then(function(leafletMarkers) { - return leafletMainMarker = leafletMarkers.marker; - }); + }, model: { + color: 'blue', + }, + }); - $rootScope.$digest(); - leafletMainMarker.openPopup(); - $rootScope.$digest(); - return expect(leafletMainMarker._popup._contentNode.innerHTML).toEqual('

      blue

      '); + var element = angular.element(''); + element = $compile(element)($rootScope); + $rootScope.$digest(); + + var leafletMap; + leafletData.getMap().then(function(map) { + leafletMap = map; + }); + + $rootScope.$digest(); + var leafletMainMarker; + leafletData.getMarkers().then(function(leafletMarkers) { + leafletMainMarker = leafletMarkers.marker; }); + $rootScope.$digest(); + leafletMainMarker.openPopup(); + $rootScope.$digest(); + + expect(leafletMainMarker._popup._contentNode.innerHTML).toEqual('

      blue

      '); + + }); + it('message should be compiled in specified scope', function() { var arbitraryIsolateScope; var element; @@ -278,18 +283,18 @@ describe('Directive: leaflet', function() { marker: marker, }, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); $rootScope.$digest(); leafletMainMarker = void 0; leafletData.getMarkers().then(function(leafletMarkers) { - return leafletMainMarker = leafletMarkers.marker; + leafletMainMarker = leafletMarkers.marker; }); $rootScope.$digest(); leafletMainMarker.openPopup(); $rootScope.$digest(); - return expect(leafletMainMarker._popup._contentNode.innerHTML).toEqual('

      angular

      '); + expect(leafletMainMarker._popup._contentNode.innerHTML).toEqual('

      angular

      '); }); it('should bind label to main marker if message is given', function() { @@ -303,11 +308,10 @@ describe('Directive: leaflet', function() { bindLabel: function(content, options) { this.label = new L.Label(options, this); this.label._content = content; - return this; }, updateLabelContent: function(content) { - return this.label._content = content; + this.label._content = content; }, }; L.Marker.include(L.BaseMarkerMethods); @@ -327,21 +331,21 @@ describe('Directive: leaflet', function() { marker: marker, }, }); - element = angular.element(''); + element = angular.element(''); $compile(element)($rootScope); $rootScope.$digest(); leafletData.getMarkers().then(function(leafletMarkers) { var leafletMainMarker; leafletMainMarker = leafletMarkers.marker; - return expect(leafletMainMarker.label._content).toEqual('original'); + expect(leafletMainMarker.label._content).toEqual('original'); }); marker.label.message = 'new'; $rootScope.$digest(); - return leafletData.getMarkers().then(function(leafletMarkers) { + leafletData.getMarkers().then(function(leafletMarkers) { var leafletMainMarker; leafletMainMarker = leafletMarkers.marker; - return expect(leafletMainMarker.label._content).toEqual('new'); + expect(leafletMainMarker.label._content).toEqual('new'); }); }); @@ -350,14 +354,14 @@ describe('Directive: leaflet', function() { angular.extend($rootScope, { markers: mainMarkers, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); $rootScope.$digest(); - return leafletData.getMarkers().then(function(leafletMarkers) { + leafletData.getMarkers().then(function(leafletMarkers) { expect(leafletMarkers.paris.getLatLng().lat).toBeCloseTo(0.966); expect(leafletMarkers.paris.getLatLng().lng).toBeCloseTo(2.02); expect(leafletMarkers.madrid.getLatLng().lat).toBeCloseTo(2.02); - return expect(leafletMarkers.madrid.getLatLng().lng).toBeCloseTo(4.04); + expect(leafletMarkers.madrid.getLatLng().lng).toBeCloseTo(4.04); }); }); @@ -370,23 +374,23 @@ describe('Directive: leaflet', function() { angular.extend($rootScope, { markers: mainMarkers, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); map = void 0; map = leafletData.getMap().then(function(leafletMap) { - return map = leafletMap; + map = leafletMap; }); markers = void 0; leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; + markers = leafletMarkers; }); $rootScope.$digest(); expect(map.hasLayer(markers.madrid)).toBe(true); delete mainMarkers.madrid.lat; $rootScope.$digest(); - return expect(map.hasLayer(markers.madrid)).toBe(false); + expect(map.hasLayer(markers.madrid)).toBe(false); }); it('validates (null lat)', function() { @@ -396,7 +400,7 @@ describe('Directive: leaflet', function() { angular.extend($rootScope, { markers: mainMarkers, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); map = void 0; leafletData.getMap().then(function(leafletMap) { @@ -405,14 +409,14 @@ describe('Directive: leaflet', function() { markers = void 0; leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; + markers = leafletMarkers; }); $rootScope.$digest(); expect(map.hasLayer(markers.madrid)).toBe(true); mainMarkers.madrid.lat = null; $rootScope.$digest(); - return expect(map.hasLayer(markers.madrid)).toBe(false); + expect(map.hasLayer(markers.madrid)).toBe(false); }); it('validate (lat is NaN)', function() { @@ -422,23 +426,23 @@ describe('Directive: leaflet', function() { angular.extend($rootScope, { markers: mainMarkers, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); map = void 0; leafletData.getMap().then(function(leafletMap) { - return map = leafletMap; + map = leafletMap; }); markers = void 0; leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; + markers = leafletMarkers; }); $rootScope.$digest(); expect(map.hasLayer(markers.madrid)).toBe(true); mainMarkers.madrid.lat = 'aak'; $rootScope.$digest(); - return expect(map.hasLayer(markers.madrid)).toBe(false); + expect(map.hasLayer(markers.madrid)).toBe(false); }); it('validates (lat not a number)', function() { @@ -448,23 +452,23 @@ describe('Directive: leaflet', function() { angular.extend($rootScope, { markers: mainMarkers, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); map = void 0; leafletData.getMap().then(function(leafletMap) { - return map = leafletMap; + map = leafletMap; }); markers = void 0; leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; + markers = leafletMarkers; }); $rootScope.$digest(); expect(map.hasLayer(markers.madrid)).toBe(true); mainMarkers.madrid.lat = 'not a number :P'; $rootScope.$digest(); - return expect(map.hasLayer(markers.madrid)).toBe(false); + expect(map.hasLayer(markers.madrid)).toBe(false); }); it('validates (undefined lng)', function() { @@ -474,23 +478,23 @@ describe('Directive: leaflet', function() { angular.extend($rootScope, { markers: mainMarkers, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); map = void 0; leafletData.getMap().then(function(leafletMap) { - return map = leafletMap; + map = leafletMap; }); markers = void 0; leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; + markers = leafletMarkers; }); $rootScope.$digest(); expect(map.hasLayer(markers.madrid)).toBe(true); delete mainMarkers.madrid.lng; $rootScope.$digest(); - return expect(map.hasLayer(markers.madrid)).toBe(false); + expect(map.hasLayer(markers.madrid)).toBe(false); }); it('validates (null lng)', function() { @@ -500,23 +504,23 @@ describe('Directive: leaflet', function() { angular.extend($rootScope, { markers: mainMarkers, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); map = void 0; leafletData.getMap().then(function(leafletMap) { - return map = leafletMap; + map = leafletMap; }); markers = void 0; leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; + markers = leafletMarkers; }); $rootScope.$digest(); expect(map.hasLayer(markers.madrid)).toBe(true); mainMarkers.madrid.lng = null; $rootScope.$digest(); - return expect(map.hasLayer(markers.madrid)).toBe(false); + expect(map.hasLayer(markers.madrid)).toBe(false); }); it('validates (lng is NaN)', function() { @@ -526,16 +530,16 @@ describe('Directive: leaflet', function() { angular.extend($rootScope, { markers: mainMarkers, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); map = void 0; leafletData.getMap().then(function(leafletMap) { - return map = leafletMap; + map = leafletMap; }); markers = void 0; leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; + markers = leafletMarkers; }); $rootScope.$digest(); @@ -552,7 +556,7 @@ describe('Directive: leaflet', function() { angular.extend($rootScope, { markers: mainMarkers, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); map = void 0; leafletData.getMap().then(function(leafletMap) { @@ -568,58 +572,54 @@ describe('Directive: leaflet', function() { expect(map.hasLayer(markers.madrid)).toBe(true); mainMarkers.madrid.lng = 'not a number :P'; $rootScope.$digest(); - return expect(map.hasLayer(markers.madrid)).toBe(false); + expect(map.hasLayer(markers.madrid)).toBe(false); }); it('validates (lng not a number) for a marker in a layer group', function() { - var element; var layers; var map; var markers; var overlays; mainMarkers.paris.layer = 'cars'; mainMarkers.madrid.layer = 'trucks'; - angular.extend($rootScope, { + angular.extend(scope, { markers: mainMarkers, layers: mainLayers, }); - element = angular.element(''); - element = $compile(element)($rootScope); - map = void 0; + var element = angular.element(''); + element = $compile(element)(scope); leafletData.getMap().then(function(leafletMap) { - return map = leafletMap; + map = leafletMap; }); - markers = void 0; + scope.$digest(); leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; + markers = leafletMarkers; }); - $rootScope.$digest(); - layers = void 0; + scope.$digest(); leafletData.getLayers().then(function(leafletLayers) { - return layers = leafletLayers; + layers = leafletLayers; }); - $rootScope.$digest(); + scope.$digest(); overlays = layers.overlays; expect(map.hasLayer(markers.madrid)).toBe(false); - $rootScope.$digest(); expect(overlays.trucks.hasLayer(markers.madrid)).toBe(true); mainMarkers.madrid.lng = 'not a number :P'; - $rootScope.$digest(); + scope.$digest(); expect(map.hasLayer(markers.madrid)).toBe(false); expect(overlays.trucks.hasLayer(markers.madrid)).toBe(false); - $rootScope.$digest(); + scope.$digest(); expect(map.hasLayer(markers.paris)).toBe(true); expect(overlays.cars.hasLayer(markers.paris)).toBe(true); mainMarkers.paris.lat = 'not a number :P'; - $rootScope.$digest(); + scope.$digest(); expect(map.hasLayer(markers.paris)).toBe(false); - return expect(overlays.cars.hasLayer(markers.paris)).toBe(false); + expect(overlays.cars.hasLayer(markers.paris)).toBe(false); }); - return it('validates (lng not a number) for a marker in a layer markercluster', function() { + it('validates (lng not a number) for a marker in a layer markercluster', function() { var element; var layers; var map; @@ -633,22 +633,22 @@ describe('Directive: leaflet', function() { markers: mainMarkers, layers: mainLayers, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); map = void 0; leafletData.getMap().then(function(leafletMap) { - return map = leafletMap; + map = leafletMap; }); markers = void 0; leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; + markers = leafletMarkers; }); $rootScope.$digest(); layers = void 0; leafletData.getLayers().then(function(leafletLayers) { - return layers = leafletLayers; + layers = leafletLayers; }); $rootScope.$digest(); @@ -664,7 +664,7 @@ describe('Directive: leaflet', function() { expect(overlays.cars.hasLayer(markers.paris)).toBe(true); mainMarkers.paris.lat = 'not a number :P'; $rootScope.$digest(); - return expect(map.hasLayer(markers.paris)).toBe(false); + expect(map.hasLayer(markers.paris)).toBe(false); }); }); @@ -676,22 +676,22 @@ describe('Directive: leaflet', function() { angular.extend($rootScope, { markers: mainMarkers, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); map = void 0; leafletData.getMap().then(function(leafletMap) { - return map = leafletMap; + map = leafletMap; }); markers = void 0; leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; + markers = leafletMarkers; }); $rootScope.$digest(); layers = void 0; leafletData.getLayers().then(function(leafletLayers) { - return layers = leafletLayers; + layers = leafletLayers; }); $rootScope.$digest(); @@ -707,10 +707,10 @@ describe('Directive: leaflet', function() { expect(markers.paris.getLatLng().lat).toBeCloseTo(0.98); expect(markers.paris.getLatLng().lng).toBeCloseTo(7.89); expect(markers.madrid.getLatLng().lat).toBeCloseTo(4.56); - return expect(markers.madrid.getLatLng().lng).toBeCloseTo(1.23); + expect(markers.madrid.getLatLng().lng).toBeCloseTo(1.23); }); - return it('updates lat-lng for marker in a layer markercluster', function() { + it('updates lat-lng for marker in a layer markercluster', function() { var element; var layers; var map; @@ -724,21 +724,21 @@ describe('Directive: leaflet', function() { markers: mainMarkers, layers: mainLayers, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); map = void 0; leafletData.getMap().then(function(leafletMap) { - return map = leafletMap; + map = leafletMap; }); markers = void 0; leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; + markers = leafletMarkers; }); layers = void 0; leafletData.getLayers().then(function(leafletLayers) { - return layers = leafletLayers; + layers = leafletLayers; }); $rootScope.$digest(); @@ -763,7 +763,7 @@ describe('Directive: leaflet', function() { expect(markers.paris.getLatLng().lat).toBeCloseTo(0.98); expect(markers.paris.getLatLng().lng).toBeCloseTo(7.89); expect(markers.madrid.getLatLng().lat).toBeCloseTo(4.56); - return expect(markers.madrid.getLatLng().lng).toBeCloseTo(1.23); + expect(markers.madrid.getLatLng().lng).toBeCloseTo(1.23); }); }); @@ -775,7 +775,7 @@ describe('Directive: leaflet', function() { angular.extend($rootScope, { markers: mainMarkers, }); - element = angular.element(''); + element = angular.element(''); element = $compile(element)($rootScope); map = void 0; leafletData.getMap().then(function(leafletMap) { @@ -791,7 +791,7 @@ describe('Directive: leaflet', function() { expect(markers.paris._popup._content).toEqual('this is paris'); }); - return describe('setting markers watches', function() { + describe('setting markers watches', function() { var DEFAULT_URL; var LEAF_URL; var defaultIcon; @@ -831,18 +831,18 @@ describe('Directive: leaflet', function() { }, }; scope = $rootScope.$new(); - return scope.markers = mainMarkers; + scope.markers = mainMarkers; }); it('watches marker icon bindings', function() { var element; var icon; var markers; - element = angular.element(''); + element = angular.element(''); element = $compile(element)(scope); markers = void 0; leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; + markers = leafletMarkers; }); scope.$digest(); @@ -850,24 +850,24 @@ describe('Directive: leaflet', function() { expect(icon.options.iconUrl).toEqual(LEAF_URL); mainMarkers.m1.icon = defaultIcon; scope.$apply(); - return expect(markers.m1.options.icon.options.iconUrl).toEqual(DEFAULT_URL); + expect(markers.m1.options.icon.options.iconUrl).toEqual(DEFAULT_URL); }); - return it('does not watch on markers when watch is disabled', function() { + it('does not watch on markers when watch is disabled', function() { var element; var markers; - element = angular.element(''); + element = angular.element(''); element = $compile(element)(scope); markers = void 0; leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; + markers = leafletMarkers; }); scope.$digest(); expect(markers.m1.options.icon.options.iconUrl).toEqual(LEAF_URL); mainMarkers.m1.icon = defaultIcon; scope.$apply(); - return expect(markers.m1.options.icon.options.iconUrl).toEqual(LEAF_URL); + expect(markers.m1.options.icon.options.iconUrl).toEqual(LEAF_URL); }); }); }); diff --git a/test/unit/090-eventsDirectiveSpec.js b/test/unit/090-eventsDirectiveSpec.js index 74d9d29b..c9deeecb 100755 --- a/test/unit/090-eventsDirectiveSpec.js +++ b/test/unit/090-eventsDirectiveSpec.js @@ -75,8 +75,9 @@ describe('Directive: leaflet', function() { check[origEventName] = true; } - if (mapId) + if (mapId) { mapId = mapId + '.'; + } leafletData.getMap().then(function(map) { mapEvents.forEach(function(origEventName) { @@ -830,7 +831,7 @@ describe('Directive: leaflet', function() { }, }); - var element = angular.element(''); + var element = angular.element(''); $compile(element)($rootScope); $rootScope.$digest(); leafletData.getMarkers().then(function(leafletMarkers) { diff --git a/test/unit/layersDirective/layersDirective.creationSpec.js b/test/unit/layersDirective/layersDirective.creationSpec.js index 6a55e389..da9c5f5e 100755 --- a/test/unit/layersDirective/layersDirective.creationSpec.js +++ b/test/unit/layersDirective/layersDirective.creationSpec.js @@ -45,7 +45,7 @@ describe('Directive: leaflet: layers.creation', function() { }); // If we not provide layers the system will use the default - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); leafletData.getLayers().then(function(layers) { @@ -62,7 +62,7 @@ describe('Directive: leaflet: layers.creation', function() { overlays: {}, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); leafletData.getLayers().then(function(layers) { @@ -90,7 +90,7 @@ describe('Directive: leaflet: layers.creation', function() { overlays: {}, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { @@ -117,7 +117,7 @@ describe('Directive: leaflet: layers.creation', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { @@ -159,7 +159,7 @@ describe('Directive: leaflet: layers.creation', function() { overlays: {}, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { @@ -201,7 +201,7 @@ describe('Directive: leaflet: layers.creation', function() { overlays: {}, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); leafletData.getLayers().then(function(layers) { expect(Object.keys(layers.baselayers).length).toEqual(2); @@ -296,7 +296,7 @@ describe('Directive: leaflet: layers.creation', function() { overlays: {}, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); leafletData.getLayers().then(function(layers) { expect(Object.keys(layers.baselayers).length).toEqual(0); diff --git a/test/unit/layersDirective/layersDirective.overlays.markersSpec.js b/test/unit/layersDirective/layersDirective.overlays.markersSpec.js index dc7d1de2..7f2b0289 100644 --- a/test/unit/layersDirective/layersDirective.overlays.markersSpec.js +++ b/test/unit/layersDirective/layersDirective.overlays.markersSpec.js @@ -1,281 +1,280 @@ -// Generated by CoffeeScript 1.10.0 - /* jshint -W117 jshint globalstrict: true jasmine specs for directives go here */ -(function() { - describe('Directive: leaflet: layers.overlays.markers', function() { - var $compile; - var $q; - var $rootScope; - var $timeout; - var leafletData; - var leafletMarkersHelper; - var scope; - $timeout = $q = scope = leafletData = $rootScope = $compile = leafletMarkersHelper = void 0; - beforeEach(function() { - module('leaflet-directive'); - return inject(function(_$compile_, _$rootScope_, _leafletData_, _leafletMarkersHelpers_, _$q_, _$timeout_) { - $timeout = _$timeout_; - window.ngLeafLetTestGlobals.$timeout = $timeout; - $q = _$q_; - $compile = _$compile_; - $rootScope = _$rootScope_; - leafletData = _leafletData_; - leafletMarkersHelper = _leafletMarkersHelpers_; - return scope = $rootScope.$new(); - }); +describe('Directive: leaflet: layers.overlays.markers', function() { + var $compile; + var $q; + var $rootScope; + var $timeout; + var leafletData; + var leafletMarkersHelper; + var scope; + $timeout = $q = scope = leafletData = $rootScope = $compile = leafletMarkersHelper = void 0; + beforeEach(function() { + module('leaflet-directive'); + inject(function(_$compile_, _$rootScope_, _leafletData_, _leafletMarkersHelpers_, _$q_, _$timeout_) { + $timeout = _$timeout_; + $q = _$q_; + $compile = _$compile_; + $rootScope = _$rootScope_; + leafletData = _leafletData_; + leafletMarkersHelper = _leafletMarkersHelpers_; + scope = $rootScope.$new(); }); + }); - afterEach(inject(function($rootScope) { - if (!scope.$$phase) { - return $rootScope.$apply(); - } - })); + afterEach(inject(function($rootScope) { + if (!scope.$$phase) { + return $rootScope.$apply(); + } + })); - describe('marker isNested', function() { - it('should check for a marker in the layer group that is visible', function(done) { - var element; - angular.extend(scope, { - layers: { - baselayers: { - osm: { - name: 'OpenStreetMap', - type: 'xyz', - url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - layerOptions: { - subdomains: ['a', 'b', 'c'], - attribution: '© OpenStreetMap contributors', - continuousWorld: true, - }, - }, - }, - overlays: { - cars: { - name: 'cars', - type: 'group', - visible: true, + describe('marker isNested', function() { + it('should check for a marker in the layer group that is visible', function(done) { + var element; + angular.extend(scope, { + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true, }, }, }, - markers: { + overlays: { cars: { - m1: { - lat: 1.2, - lng: 0.3, - }, - m2: { - lat: 1.2, - lng: 0.3, - }, + name: 'cars', + type: 'group', + visible: true, }, }, - }); - element = angular.element(''); - element = $compile(element)(scope); - return this.digest($rootScope, function() { - return $q.all([leafletData.getMap(), leafletData.getMarkers(), leafletData.getLayers()]).then(function(promiseArray) { - var layers; - var map; - var markerToCheck; - var markers; - map = promiseArray[0], markers = promiseArray[1], layers = promiseArray[2]; - expect(Object.keys(markers).length).toEqual(1); - expect(Object.keys(markers.cars).length).toEqual(2); - markerToCheck = markers.cars.m1; - expect(markerToCheck instanceof L.Marker).toBe(true); - expect(map.hasLayer(markerToCheck)).toBe(true); - expect(layers.overlays.cars.hasLayer(markerToCheck)).toBe(true); - return done(); - }); - }); - }); - - return it('should check for a marker in a wrong layer group', function() { - var element; - angular.extend(scope, { - layers: { - baselayers: { - osm: { - name: 'OpenStreetMap', - type: 'xyz', - url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - layerOptions: { - subdomains: ['a', 'b', 'c'], - attribution: '© OpenStreetMap contributors', - continuousWorld: true, - }, - }, - }, - overlays: { - cars: { - name: 'cars', - type: 'group', - visible: true, - }, + }, + markers: { + cars: { + m1: { + lat: 1.2, + lng: 0.3, }, - }, - markers: { - bikes: { - m1: { - lat: 1.2, - lng: 0.3, - }, + m2: { + lat: 1.2, + lng: 0.3, }, }, - }); - element = angular.element(''); - element = $compile(element)(scope); - return leafletData.getMarkers().then(function(markers) { - return expect(Object.keys(markers).length).toEqual(0); - }); + }, }); - }); + element = angular.element(''); + element = $compile(element)(scope); - return describe('marker', function() { - it('should check for a marker in the layer group that is visible', function() { - var element; + scope.$digest(); + $q.all([leafletData.getMap(), leafletData.getLayers(), leafletData.getMarkers()]).then(function(promiseArray) { + var layers; var map; + var markerToCheck; var markers; - angular.extend(scope, { - layers: { - baselayers: { - osm: { - name: 'OpenStreetMap', - type: 'xyz', - url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - layerOptions: { - subdomains: ['a', 'b', 'c'], - attribution: '© OpenStreetMap contributors', - continuousWorld: true, - }, + + map = promiseArray[0], layers = promiseArray[1], markers = promiseArray[2]; + expect(Object.keys(markers).length).toEqual(1); + expect(Object.keys(markers.cars).length).toEqual(2); + markerToCheck = markers.cars.m1; + expect(markerToCheck instanceof L.Marker).toBe(true); + expect(map.hasLayer(markerToCheck)).toBe(true); + expect(layers.overlays.cars.hasLayer(markerToCheck)).toBe(true); + done(); + }); + + $rootScope.$digest(); + }); + + it('should check for a marker in a wrong layer group', function() { + var element; + angular.extend(scope, { + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true, }, }, - overlays: { - cars: { - name: 'cars', - type: 'group', - visible: true, - }, + }, + overlays: { + cars: { + name: 'cars', + type: 'group', + visible: true, }, }, - markers: { + }, + markers: { + bikes: { m1: { lat: 1.2, lng: 0.3, - layer: 'cars', }, }, - }); - element = angular.element(''); - element = $compile(element)(scope); - map = void 0; - leafletData.getMap().then(function(leafletMap) { - return map = leafletMap; - }); - - markers = void 0; - leafletData.getMarkers().then(function(leafletMarkers) { - return markers = leafletMarkers; - }); - - scope.$digest(); - return leafletData.getLayers().then(function(layers) { - expect(Object.keys(markers).length).toEqual(1); - expect(markers.m1 instanceof L.Marker).toBe(true); - expect(layers.overlays.cars.hasLayer(markers.m1)).toBe(true); - return expect(map.hasLayer(markers.m1)).toBe(true); - }); + }, + }); + element = angular.element(''); + element = $compile(element)(scope); + leafletData.getMarkers().then(function(markers) { + expect(Object.keys(markers).length).toEqual(0); }); + }); + }); - it('should check for a marker in a wrong layer group', function() { - var element; - angular.extend(scope, { - layers: { - baselayers: { - osm: { - name: 'OpenStreetMap', - type: 'xyz', - url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - layerOptions: { - subdomains: ['a', 'b', 'c'], - attribution: '© OpenStreetMap contributors', - continuousWorld: true, - }, - }, - }, - overlays: { - cars: { - name: 'cars', - type: 'group', - visible: true, + describe('marker', function() { + it('should check for a marker in the layer group that is visible', function() { + var element; + var map; + var markers; + angular.extend(scope, { + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true, }, }, }, - markers: { - m1: { - lat: 1.2, - lng: 0.3, - layer: 'bikes', + overlays: { + cars: { + name: 'cars', + type: 'group', + visible: true, }, }, - }); - element = angular.element(''); - element = $compile(element)(scope); - return leafletData.getMarkers().then(function(markers) { - return expect(Object.keys(markers).length).toEqual(0); - }); + }, + markers: { + m1: { + lat: 1.2, + lng: 0.3, + layer: 'cars', + }, + }, + }); + element = angular.element(''); + element = $compile(element)(scope); + map = void 0; + leafletData.getMap().then(function(leafletMap) { + map = leafletMap; }); - return it('should check for a marker the old way', function() { - var element; - var map; - angular.extend(scope, { - layers: { - baselayers: { - osm: { - name: 'OpenStreetMap', - type: 'xyz', - url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - layerOptions: { - subdomains: ['a', 'b', 'c'], - attribution: '© OpenStreetMap contributors', - continuousWorld: true, - }, + scope.$digest(); + + markers = void 0; + leafletData.getMarkers().then(function(leafletMarkers) { + markers = leafletMarkers; + }); + + scope.$digest(); + leafletData.getLayers().then(function(layers) { + expect(Object.keys(markers).length).toEqual(1); + expect(markers.m1 instanceof L.Marker).toBe(true); + expect(layers.overlays.cars.hasLayer(markers.m1)).toBe(true); + expect(map.hasLayer(markers.m1)).toBe(true); + }); + }); + + it('should check for a marker in a wrong layer group', function() { + var element; + angular.extend(scope, { + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true, }, }, - overlays: { - cars: { - name: 'cars', - type: 'group', - visible: true, + }, + overlays: { + cars: { + name: 'cars', + type: 'group', + visible: true, + }, + }, + }, + markers: { + m1: { + lat: 1.2, + lng: 0.3, + layer: 'bikes', + }, + }, + }); + element = angular.element(''); + element = $compile(element)(scope); + leafletData.getMarkers().then(function(markers) { + expect(Object.keys(markers).length).toEqual(0); + }); + }); + + it('should check for a marker the old way', function() { + var element; + var map; + angular.extend(scope, { + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true, }, }, }, - markers: { - m1: { - lat: 1.2, - lng: 0.3, + overlays: { + cars: { + name: 'cars', + type: 'group', + visible: true, }, }, - }); - element = angular.element(''); - element = $compile(element)(scope); - map = void 0; - leafletData.getMap().then(function(leafletMap) { - return map = leafletMap; - }); + }, + markers: { + m1: { + lat: 1.2, + lng: 0.3, + }, + }, + }); + element = angular.element(''); + element = $compile(element)(scope); + map = void 0; + leafletData.getMap().then(function(leafletMap) { + map = leafletMap; + }); - scope.$digest(); - return leafletData.getMarkers().then(function(markers) { - expect(Object.keys(markers).length).toEqual(1); - return expect(map.hasLayer(markers.m1)).toBe(true); - }); + scope.$digest(); + leafletData.getMarkers().then(function(markers) { + expect(Object.keys(markers).length).toEqual(1); + expect(map.hasLayer(markers.m1)).toBe(true); }); }); }); - -}).call(this); +}); diff --git a/test/unit/layersDirective/layersDirective.overlays.pathsSpec.js b/test/unit/layersDirective/layersDirective.overlays.pathsSpec.js index e9429e32..a369b876 100755 --- a/test/unit/layersDirective/layersDirective.overlays.pathsSpec.js +++ b/test/unit/layersDirective/layersDirective.overlays.pathsSpec.js @@ -61,13 +61,16 @@ describe('Directive: leaflet: layers.overlays', function() { }, }, }); - var element = angular.element(''); + + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { map = leafletMap; }); + scope.$digest(); + var paths; leafletData.getPaths().then(function(leafletPaths) { paths = leafletPaths; @@ -122,7 +125,7 @@ describe('Directive: leaflet: layers.overlays', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { @@ -183,7 +186,7 @@ describe('Directive: leaflet: layers.overlays', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); leafletData.getPaths().then(function(paths) { expect(Object.keys(paths).length).toEqual(0); diff --git a/test/unit/layersDirective/layersDirective.overlaysSpec.js b/test/unit/layersDirective/layersDirective.overlaysSpec.js index 15fc5e9c..654b5988 100755 --- a/test/unit/layersDirective/layersDirective.overlaysSpec.js +++ b/test/unit/layersDirective/layersDirective.overlaysSpec.js @@ -39,7 +39,7 @@ describe('Directive: leaflet: layers.overlays', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); leafletData.getLayers().then(function(layers) { expect(layers.overlays).not.toBe(null); @@ -67,7 +67,7 @@ describe('Directive: leaflet: layers.overlays', function() { overlays: {}, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); leafletData.getLayers().then(function(layers) { expect(layers.overlays).not.toBe(null); @@ -123,7 +123,7 @@ describe('Directive: leaflet: layers.overlays', function() { }); scope.$digest(); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); leafletData.getLayers().then(function(layers) { expect(layers.overlays).not.toBe(null); @@ -183,7 +183,7 @@ describe('Directive: leaflet: layers.overlays', function() { scope.$digest(); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); leafletData.getLayers().then(function(layers) { expect(layers.overlays).not.toBe(null); @@ -221,7 +221,7 @@ describe('Directive: leaflet: layers.overlays', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { @@ -266,7 +266,7 @@ describe('Directive: leaflet: layers.overlays', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { @@ -317,7 +317,7 @@ describe('Directive: leaflet: layers.overlays', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { diff --git a/test/unit/layersDirective/layersDirective.twomapsSpec.js b/test/unit/layersDirective/layersDirective.twomapsSpec.js index 0cc65e4c..050a7fa7 100755 --- a/test/unit/layersDirective/layersDirective.twomapsSpec.js +++ b/test/unit/layersDirective/layersDirective.twomapsSpec.js @@ -86,8 +86,8 @@ describe('Directive: leaflet', function() { }); var elements = []; - elements.push(angular.element('')); - elements.push(angular.element('')); + elements.push(angular.element('')); + elements.push(angular.element('')); var ctrl = []; ctrl.push($compile(elements[0])(scope)); @@ -176,8 +176,8 @@ describe('Directive: leaflet', function() { }); var elements = []; - elements.push(angular.element('')); - elements.push(angular.element('')); + elements.push(angular.element('')); + elements.push(angular.element('')); var ctrl = []; ctrl.push($compile(elements[0])(scope)); diff --git a/test/unit/layersDirective/layersDirective.watch.markersSpec.js b/test/unit/layersDirective/layersDirective.watch.markersSpec.js index 16a02fd2..30170064 100755 --- a/test/unit/layersDirective/layersDirective.watch.markersSpec.js +++ b/test/unit/layersDirective/layersDirective.watch.markersSpec.js @@ -50,7 +50,7 @@ describe('Directive: leaflet: layers.watch.markers', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var layers; leafletData.getLayers().then(function(leafletLayers) { @@ -130,7 +130,7 @@ describe('Directive: leaflet: layers.watch.markers', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); var layers; @@ -215,7 +215,7 @@ describe('Directive: leaflet: layers.watch.markers', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { @@ -328,7 +328,7 @@ describe('Directive: leaflet: layers.watch.markers', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { @@ -386,7 +386,7 @@ describe('Directive: leaflet: layers.watch.markers', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { @@ -437,7 +437,7 @@ describe('Directive: leaflet: layers.watch.markers', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { @@ -487,7 +487,7 @@ describe('Directive: leaflet: layers.watch.markers', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { @@ -547,7 +547,7 @@ describe('Directive: leaflet: layers.watch.markers', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { @@ -621,7 +621,7 @@ describe('Directive: leaflet: layers.watch.markers', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var map; leafletData.getMap().then(function(leafletMap) { diff --git a/test/unit/layersDirective/layersDirective.watchSpec.js b/test/unit/layersDirective/layersDirective.watchSpec.js index edad0d8a..114d2661 100755 --- a/test/unit/layersDirective/layersDirective.watchSpec.js +++ b/test/unit/layersDirective/layersDirective.watchSpec.js @@ -50,7 +50,7 @@ describe('Directive: leaflet: layers.watch', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); var layers; leafletData.getLayers().then(function(leafletLayers) { @@ -130,7 +130,7 @@ describe('Directive: leaflet: layers.watch', function() { }, }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); var layers; @@ -183,15 +183,18 @@ describe('Directive: leaflet: layers.watch', function() { scope.layers.overlays.countries = { name: 'Countries', type: 'geoJSONShape', - data: {type: 'FeatureCollection', - features: [{ - type:'Feature', - geometry: { - type: 'Polygon', - coordinates: [[[22.65715, 44.234923], [22.944832, 43.823785], [22.65715, 44.234923]]], - }, - },], + data: { + type: 'FeatureCollection', + features: [ + { + type:'Feature', + geometry: { + type: 'Polygon', + coordinates: [[[22.65715, 44.234923], [22.944832, 43.823785], [22.65715, 44.234923]]], }, + }, + ], + }, layerOptions: { style: { color: '#00D', diff --git a/test/unit/leafletData/leafletDataService.DirectiveControlsSpec.js b/test/unit/leafletData/leafletDataService.DirectiveControlsSpec.js index f08e29a2..26d00eff 100644 --- a/test/unit/leafletData/leafletDataService.DirectiveControlsSpec.js +++ b/test/unit/leafletData/leafletDataService.DirectiveControlsSpec.js @@ -1,141 +1,132 @@ -// Generated by CoffeeScript 1.10.0 -(function() { - describe('leafletData directiveControls', function() { - var $compile; - var $rootScope; - var geojsonData; - var leafletData; - var leafletHelpers; - var mainLayers; - geojsonData = mainLayers = leafletHelpers = leafletData = $rootScope = $compile = void 0; - beforeEach(function() { - var mainMarkers; - module('leaflet-directive'); - inject(function(_$compile_, _$rootScope_, _$timeout_, _leafletData_, _leafletHelpers_) { - var $timeout; - $compile = _$compile_; - $rootScope = _$rootScope_; - leafletData = _leafletData_; - leafletHelpers = _leafletHelpers_; - $timeout = _$timeout_; - return window.ngLeafLetTestGlobals.$timeout = $timeout; - }); +describe('leafletData directiveControls', function() { + var $compile; + var $rootScope; + var geojsonData; + var leafletData; + var leafletHelpers; + var mainLayers; + var testRunner; - mainMarkers = { - paris: { - lat: 0.966, - lng: 2.02, - layer: 'cars', - }, - madrid: { - lat: 2.02, - lng: 4.04, - }, - }; - geojsonData = { - type: 'FeatureCollection', - features: [ - { - id: 1, - type: 'Feature', - geometry: { - type: 'MultiPolygon', - coordinates: [[[[-81.7909014988425, 26.1600486322945], [-81.7909042034464, 26.160182208485], [-81.7901026433014, 26.1601988284883], [-81.7900509269373, 26.1602037433384], [-81.7899997405748, 26.1602119107851], [-81.789949237096, 26.1602233987689], [-81.7898997957011, 26.1602379300958], [-81.789875463777, 26.1602463399312], [-81.7898396364971, 26.1602604526655], [-81.789793289851, 26.1602818448462], [-81.7897595712933, 26.160299751747], [-81.7897377588728, 26.1603125954271], [-81.789695545123, 26.1603403383986], [-81.7896752441735, 26.1603550537301], [-81.7896459830495, 26.1603784613785], [-81.7896090404221, 26.1604118152686], [-81.7895666860178, 26.1604564097438], [-81.7895359746114, 26.1604945898063], [-81.7895082214574, 26.1605344501827], [-81.7894894785174, 26.1605655033389], [-81.7894673836723, 26.1606081067568], [-81.7894485242141, 26.1606520450804], [-81.7894331024511, 26.1606971796443], [-81.7894212164532, 26.160742982609], [-81.7894128662244, 26.1607894539753], [-81.7894081269003, 26.1608364328483], [-81.78940703152, 26.1608699569814], [-81.7894277245396, 26.1620342659585], [-81.7872054176208, 26.1620696568853], [-81.7871723747966, 26.1602355104408], [-81.7896405283304, 26.160205994433], [-81.7896826589562, 26.1601810030797], [-81.7897210114136, 26.1601608469405], [-81.7897700172426, 26.1601382251093], [-81.7898119238038, 26.1601214654597], [-81.7898547834178, 26.1601066492989], [-81.7898969476196, 26.1600941983404], [-81.7900338907779, 26.1600619923072], [-81.7909014988425, 26.1600486322945]]]], - }, + beforeEach(function() { + var mainMarkers; + module('leaflet-directive'); + inject(function(_$compile_, _$rootScope_, _$timeout_, _leafletData_, _leafletHelpers_) { + var $timeout; + $compile = _$compile_; + $rootScope = _$rootScope_; + leafletData = _leafletData_; + leafletHelpers = _leafletHelpers_; + $timeout = _$timeout_; + scope = $rootScope.$new(); + }); + + mainMarkers = { + paris: { + lat: 0.966, + lng: 2.02, + layer: 'cars', + }, + madrid: { + lat: 2.02, + lng: 4.04, + }, + }; + + geojsonData = { + type: 'FeatureCollection', + features: [ + { + id: 1, + type: 'Feature', + geometry: { + type: 'MultiPolygon', + coordinates: [[[[-81.7909014988425, 26.1600486322945], [-81.7909042034464, 26.160182208485], [-81.7901026433014, 26.1601988284883], [-81.7900509269373, 26.1602037433384], [-81.7899997405748, 26.1602119107851], [-81.789949237096, 26.1602233987689], [-81.7898997957011, 26.1602379300958], [-81.789875463777, 26.1602463399312], [-81.7898396364971, 26.1602604526655], [-81.789793289851, 26.1602818448462], [-81.7897595712933, 26.160299751747], [-81.7897377588728, 26.1603125954271], [-81.789695545123, 26.1603403383986], [-81.7896752441735, 26.1603550537301], [-81.7896459830495, 26.1603784613785], [-81.7896090404221, 26.1604118152686], [-81.7895666860178, 26.1604564097438], [-81.7895359746114, 26.1604945898063], [-81.7895082214574, 26.1605344501827], [-81.7894894785174, 26.1605655033389], [-81.7894673836723, 26.1606081067568], [-81.7894485242141, 26.1606520450804], [-81.7894331024511, 26.1606971796443], [-81.7894212164532, 26.160742982609], [-81.7894128662244, 26.1607894539753], [-81.7894081269003, 26.1608364328483], [-81.78940703152, 26.1608699569814], [-81.7894277245396, 26.1620342659585], [-81.7872054176208, 26.1620696568853], [-81.7871723747966, 26.1602355104408], [-81.7896405283304, 26.160205994433], [-81.7896826589562, 26.1601810030797], [-81.7897210114136, 26.1601608469405], [-81.7897700172426, 26.1601382251093], [-81.7898119238038, 26.1601214654597], [-81.7898547834178, 26.1601066492989], [-81.7898969476196, 26.1600941983404], [-81.7900338907779, 26.1600619923072], [-81.7909014988425, 26.1600486322945]]]], }, - ], - }; - return this.testRunner = function(postRunnerCb, preRunnerCb) { - var element; - var preRunnerRet; - angular.extend($rootScope, { - markers: mainMarkers, - geojson: { - data: geojsonData, - style: { - fillColor: 'blue', - color: 'white', - }, + }, + ], + }; + + testRunner = function(postRunnerCb, preRunnerCb) { + var element; + var preRunnerRet; + angular.extend(scope, { + markers: mainMarkers, + geojson: { + data: geojsonData, + style: { + fillColor: 'blue', + color: 'white', }, - }); - if (preRunnerCb) { - preRunnerRet = preRunnerCb(); + }, + }); + if (preRunnerCb) { + preRunnerRet = preRunnerCb(); + } + + element = angular.element(''); + element = $compile(element)(scope); + scope.$digest(); + leafletData.getDirectiveControls().then(function(controls) { + if (postRunnerCb) { + return postRunnerCb(controls); } + }); + }; + }); - element = angular.element(''); - element = $compile(element)($rootScope); - $rootScope.$digest(); - return leafletData.getDirectiveControls().then(function(controls) { - if (postRunnerCb) { - return postRunnerCb(controls); - } - }); - }; - }); + afterEach(function() { + scope.$apply(); + }); - describe('markers controls', function() { - beforeEach(function() { - return this.rootName = 'markers'; - }); + describe('markers controls', function() { + beforeEach(function() { + scope.rootName = 'markers'; + }); - return describe('exists', function() { - it('root', function() { - return this.testRunner((function(_this) { - return function(controls) { - return expect(controls[_this.rootName]).toBeDefined(); - }; - })(this)); + describe('exists', function() { + it('root', function() { + testRunner(function(controls) { + expect(controls[scope.rootName]).toBeDefined(); }); + }); - it('create', function() { - return this.testRunner((function(_this) { - return function(controls) { - return expect(controls[_this.rootName].create).toBeDefined(); - }; - })(this)); + it('create', function() { + testRunner(function(controls) { + return expect(controls[scope.rootName].create).toBeDefined(); }); + }); - return it('clean', function() { - return this.testRunner((function(_this) { - return function(controls) { - return expect(controls[_this.rootName].clean).toBeDefined(); - }; - })(this)); + it('clean', function() { + testRunner(function(controls) { + return expect(controls[scope.rootName].clean).toBeDefined(); }); }); }); + }); - return describe('geojson controls', function() { - beforeEach(function() { - return this.rootName = 'geojson'; - }); + describe('geojson controls', function() { + beforeEach(function() { + scope.rootName = 'geojson'; + }); - return describe('exists', function() { - it('root', function() { - return this.testRunner((function(_this) { - return function(controls) { - return expect(controls[_this.rootName]).toBeDefined(); - }; - })(this)); + describe('exists', function() { + it('root', function() { + testRunner(function(controls) { + expect(controls[scope.rootName]).toBeDefined(); }); + }); - it('create', function() { - return this.testRunner((function(_this) { - return function(controls) { - return expect(controls[_this.rootName].create).toBeDefined(); - }; - })(this)); + it('create', function() { + testRunner(function(controls) { + expect(controls[scope.rootName].create).toBeDefined(); }); + }); - return it('clean', function() { - return this.testRunner((function(_this) { - return function(controls) { - return expect(controls[_this.rootName].clean).toBeDefined(); - }; - })(this)); + it('clean', function() { + testRunner(function(controls) { + expect(controls[scope.rootName].clean).toBeDefined(); }); }); }); }); - -}).call(this); +}); diff --git a/test/unit/leafletData/leafletDataSpec.js b/test/unit/leafletData/leafletDataSpec.js index 388f4ec7..9a6d6095 100644 --- a/test/unit/leafletData/leafletDataSpec.js +++ b/test/unit/leafletData/leafletDataSpec.js @@ -1,103 +1,90 @@ -// Generated by CoffeeScript 1.10.0 -(function() { - describe('leafletData', function() { - var $compile; - var $q; - var $rootScope; - var geojsonData; - var leafletData; - var leafletHelpers; - var mainLayers; - $q = geojsonData = mainLayers = leafletHelpers = leafletData = $rootScope = $compile = void 0; +describe('leafletData', function() { + var $compile; + var $q; + var $rootScope; + var geojsonData; + var leafletData; + var leafletHelpers; + var mainLayers; + var setPromise; + + $q = geojsonData = mainLayers = leafletHelpers = leafletData = $rootScope = $compile = void 0; + beforeEach(function() { + module('leaflet-directive'); + inject(function(_$compile_, _$rootScope_, _$timeout_, _leafletData_, _leafletHelpers_, _$q_) { + var $timeout; + $q = _$q_; + $compile = _$compile_; + $rootScope = _$rootScope_; + leafletData = _leafletData_; + $timeout = _$timeout_; + scope = $rootScope.$new(); + }); + }); + + describe('no mapId', function() { beforeEach(function() { - module('leaflet-directive'); - return inject(function(_$compile_, _$rootScope_, _$timeout_, _leafletData_, _leafletHelpers_, _$q_) { - var $timeout; - $q = _$q_; - $compile = _$compile_; - $rootScope = _$rootScope_; - leafletData = _leafletData_; - $timeout = _$timeout_; - return window.ngLeafLetTestGlobals.$timeout = $timeout; - }); + scope.knownMarkers = [1, 2, 3]; + scope.knownGeoJSON = ['1', '2', '3']; + setPromise = $q.all([leafletData.setMarkers(scope.knownMarkers), leafletData.setGeoJSON(scope.knownGeoJSON)]); }); - return describe('no mapId', function() { - beforeEach(function() { - this.knownMarkers = [1, 2, 3]; - this.knownGeoJSON = ['1', '2', '3']; - return this.setPromise = $q.all([leafletData.setMarkers(this.knownMarkers), leafletData.setGeoJSON(this.knownGeoJSON)]); + it('has unique data', function(done) { + var _allGet; + var _geoJSON; + var _markers; + _geoJSON = null; + _markers = null; + _allGet = null; + + setPromise.then(function() { + _allGet = $q.all([ + leafletData.getMarkers().then(function(lObjs) { + _markers = lObjs; + }, leafletData.getGeoJSON().then(function(lObjs) { + _geoJSON = lObjs; + })), + ]); }); - it('has unique data', function(done) { - var _allGet; - var _geoJSON; - var _markers; - _geoJSON = null; - _markers = null; - _allGet = null; - this.digest($rootScope, (function(_this) { - return function() { - return _this.setPromise.then(function() { - return _allGet = $q.all([ - leafletData.getMarkers().then(function(lObjs) { - return _markers = lObjs; - }, leafletData.getGeoJSON().then(function(lObjs) { - return _geoJSON = lObjs; - })), - ]); - }); - }; - })(this)); + $rootScope.$digest(); - return this.digest($rootScope, (function(_this) { - return function() { - return _allGet.then(function() { - expect(_this.knownMarkers).toBe(_markers); - expect(_this.knownGeoJSON).toBe(_geoJSON); - expect(_geoJSON !== _markers).toBeTruthy(); - return done(); - }); - }; - })(this)); + _allGet.then(function() { + expect(scope.knownMarkers).toBe(_markers); + expect(scope.knownGeoJSON).toBe(_geoJSON); + expect(_geoJSON !== _markers).toBeTruthy(); + done(); }); - return it('modifying localScope modifies leafletData\'s version', function(done) { - var _allGet; - var _geoJSON; - var _markers; - _geoJSON = null; - _markers = null; - _allGet = null; - this.knownMarkers.push(4); - this.knownGeoJSON.push('4'); - console.log($q); - this.digest($rootScope, (function(_this) { - return function() { - return _this.setPromise.then(function() { - return _allGet = $q.all([ - leafletData.getMarkers().then(function(lObjs) { - return _markers = lObjs; - }, leafletData.getGeoJSON().then(function(lObjs) { - return _geoJSON = lObjs; - })), - ]); - }); - }; - })(this)); + $rootScope.$digest(); + }); + + it('modifying localScope modifies leafletData\'s version', function(done) { + var _allGet; + var _geoJSON; + var _markers; + scope.knownMarkers.push(4); + scope.knownGeoJSON.push('4'); + + setPromise.then(function() { + _allGet = $q.all([ + leafletData.getMarkers().then(function(lObjs) { + _markers = lObjs; + }, leafletData.getGeoJSON().then(function(lObjs) { + _geoJSON = lObjs; + })), + ]); + }); - return this.digest($rootScope, (function(_this) { - return function() { - return _allGet.then(function() { - expect(_this.knownMarkers).toBe(_markers); - expect(_this.knownGeoJSON).toBe(_geoJSON); - expect(_geoJSON !== _markers).toBeTruthy(); - return done(); - }); - }; - })(this)); + $rootScope.$digest(); + _allGet.then(function() { + expect(scope.knownMarkers).toBe(_markers); + expect(scope.knownGeoJSON).toBe(_geoJSON); + expect(_geoJSON !== _markers).toBeTruthy(); + done(); }); + + $rootScope.$digest(); }); }); - -}).call(this); +}); diff --git a/test/unit/plugin/markerPluginVectorMarkersSpec.js b/test/unit/plugin/markerPluginVectorMarkersSpec.js index 80951566..cffa083f 100644 --- a/test/unit/plugin/markerPluginVectorMarkersSpec.js +++ b/test/unit/plugin/markerPluginVectorMarkersSpec.js @@ -48,7 +48,7 @@ describe('Plugin: VectorMarkers', function() { }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest(); @@ -84,7 +84,7 @@ describe('Plugin: VectorMarkers', function() { }, }); - var element = angular.element(''); + var element = angular.element(''); element = $compile(element)(scope); scope.$digest();