source : leafletQuickLinks.js

/*
 * Copyright (C) 2016 Atlas of Living Australia
 * All Rights Reserved.
 *
 * The contents of this file are subject to the Mozilla Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 * 
 * Created by Temi on 8/09/2016.
 */
(function (angular) {
    'use strict';
    /**
     * @memberof spApp
     * @ngdoc directive
     * @name leafletQuickLinks
     * @description
     *   Quicklinks panel
     */
    angular.module('leaflet-quick-links-directive', ['leaflet-directive'])
        .directive('leafletQuickLinks', [
            function () {
                return {
                    transclude: true,
                    controller: ['$scope', '$compile', '$templateRequest', '$timeout', '$rootScope', 'leafletData', 'MapService', 'LayoutService',
                        function ($scope, $compile, $templateRequest, $timeout, $rootScope, leafletData, MapService, LayoutService) {
                            $scope.expanded = true;
                            $scope.showMainMenu = true;
                            $scope.species = undefined;
                            $scope.layer = undefined;
                            $scope.area = undefined;
                            $scope.toggle = function () {
                                $scope.expanded = !$scope.expanded;
                                event.stopPropagation()
                            };
                            $scope.setDefault = function (data, key, value) {
                                if (data.overrideValues === undefined) data.overrideValues = {};
                                if (data.overrideValues.input === undefined) data.overrideValues.input = {};
                                if (data.overrideValues.input[key] === undefined) data.overrideValues.input[key] = {};
                                if (data.overrideValues.input[key].constraints === undefined) data.overrideValues.input[key].constraints = {};
                                data.overrideValues.input[key].constraints['default'] = value;
                            };
                            $scope.open = function (name, data, includeSpecies, includeArea) {
                                if ($scope.species && (includeSpecies === undefined || includeSpecies !== false)) {
                                    var species = MapService.getSpeciesLayerQuery($scope.species);
                                    if (includeSpecies === undefined || includeSpecies === true) {
                                        $scope.setDefault(data, 'species', species);
                                    } else {
                                        $scope.setDefault(data, includeSpecies, species);
                                    }
                                }
                                if ($scope.area && (includeArea === undefined || includeArea !== false)) {
                                    var area = MapService.getAreaLayerQuery($scope.area);
                                    if (includeArea === undefined || includeArea === true) {
                                        $scope.setDefault(data, 'area', area);
                                    } else {
                                        $scope.setDefault(data, includeArea, area);
                                    }
                                }
                                data.processName = name;
                                LayoutService.clear();
                                LayoutService.openModal('tool', data)
                            };
                            $scope.delegateCall = function (type, inputs) {
                                var data = {};
                                switch (type) {
                                    case 'metadata':
                                        switch (inputs) {
                                            case 'species':
                                                LayoutService.info($scope.species);
                                                break;
                                            case 'layer':
                                                LayoutService.info($scope.layer);
                                                break;
                                            case 'area':
                                                LayoutService.info($scope.area);
                                                break;
                                        }
                                        break;
                                    case 'download':
                                        switch (inputs) {
                                            case 'speciesarea':
                                                $scope.open("ToolExportSampleService", data);
                                                break;
                                            case 'specieslist':
                                                $scope.open("ToolExportChecklistService", data);
                                                break;
                                            case 'area':
                                                $scope.open("ToolExportSampleService", data, false);
                                                break;
                                            case 'species':
                                                $scope.open("ToolExportSampleService", data, true, false);
                                                break;
                                        }
                                        break;
                                    case 'export':
                                        switch (inputs) {
                                            case 'area':
                                                $scope.open("ToolExportAreaService", data);
                                                break;
                                        }
                                        break;
                                    case 'areareport':
                                        $scope.open("ToolAreaReportService", data, inputs.includeSpecies, inputs.includeArea);
                                        break;
                                    case 'classification':
                                        $scope.open("Classification", {opening: true});
                                        break;
                                    case 'scatterplot':
                                        switch (inputs) {
                                            case 'species':
                                                $scope.open("ScatterplotCreate", {opening: true}, "species1", false);
                                                break;
                                            case 'speciesarea':
                                                $scope.open("ScatterplotCreate", {opening: true}, "species1", "area");
                                                break;
                                        }
                                        break;
                                    case 'prediction':
                                        switch (inputs) {
                                            case 'species':
                                                $scope.open("Maxent", {opening: true}, "species", false);
                                                break;
                                            case 'speciesarea':
                                                $scope.open("Maxent", {opening: true}, "species", "area");
                                                break;
                                        }
                                        break;
                                    case 'pointstogrid':
                                        switch (inputs) {
                                            case 'species':
                                                $scope.open("PointsToGrid", {opening: true}, true, false);
                                                break;
                                            case 'speciesarea':
                                                $scope.open("PointsToGrid", {opening: true}, true, true);
                                        }
                                        break;
                                    case 'gdm':
                                        // todo
                                        break;
                                    case 'facet':
                                        // cannot consistently drop down a select box programmatically in all browsers
                                        break;
                                    case '':
                                        break
                                }
                                event.stopPropagation()
                            };
                            $scope.controlVisibility = function (linkOfType) {
                                if (linkOfType === 'speciesarea') {
                                    return !!($scope.species && $scope.area)
                                } else if (linkOfType === 'species') {
                                    return !!$scope.species && !$scope.area
                                } else if (linkOfType === 'area') {
                                    return !!$scope.area
                                } else if (linkOfType === 'layer') {
                                    return !!$scope.layer
                                } else {
                                    return true
                                }
                            };
                            function getSelectedOrFirstLayer(selected, layers, layertype) {
                                if (layers && layers.length) {
                                    var i = 0;
                                    while (i < layers.length && !layers[i].visible) i++;
                                    if (selected && (i >= layers.length || selected.layertype === layers[i].layertype)) {
                                        return selected
                                    } else if (i < layers.length) {
                                        return layers[i]
                                    }
                                } else {
                                    if (selected && (selected.layertype === layertype)) {
                                        return selected
                                    }
                                }
                            }
                            $scope.mappedLayers = MapService.mappedLayers;
                            $scope.$watch('mappedLayers', function () {
                                var groups = MapService.groupLayersByType();
                                $scope.area = getSelectedOrFirstLayer($scope.selectedlayer, groups.area, 'area');
                                $scope.layer = getSelectedOrFirstLayer($scope.selectedlayer, groups.contextual, 'contextual');
                                $scope.layer = $scope.layer || getSelectedOrFirstLayer($scope.selectedlayer, groups.grid, 'grid');
                                $scope.species = getSelectedOrFirstLayer($scope.selectedlayer, groups.species, 'species')
                            }, true);
                            $scope.selectedLayer = MapService.selected;
                            $scope.$watch('selectedLayer', function () {
                                $scope.selectedlayer = MapService.selected
                            });
                            $scope.openModal = function (type, data) {
                                LayoutService.clear();
                                LayoutService.openModal(type, data)
                            };
                            $scope.openTool = function (type) {
                                $scope.openModal('tool', {processName: type})
                            };
                            $timeout(function () {
                                $templateRequest('/spApp/quickLinksContent.htm').then(function (content) {
                                    var html = $compile(content)($scope);
                                    if ($SH.config.quicklinks) {
                                        leafletData.getMap().then(function (map) {
                                            new L.Control.QuickLinks({template: html[0]}).addTo(map)
                                        });
                                    }
                                })
                            }, 500);
                        }]
                }
            }])
}(angular));