source : addAreaCtrl.js

(function (angular) {
    'use strict';
    /**
     * @memberof spApp
     * @ngdoc controller
     * @name AddAreaCtrl
     * @description
     *   Add an area to the map
     */
    angular.module('add-area-ctrl', ['map-service', 'layers-service', 'predefined-areas-service'])
        .controller('AddAreaCtrl', ['LayoutService', '$scope', 'MapService', '$timeout', 'LayersService',
            '$uibModalInstance', 'PredefinedAreasService', 'data',
            function (LayoutService, $scope, MapService, $timeout, LayersService, $uibModalInstance, PredefinedAreasService, inputData) {
                $scope.inputData = inputData;
                $scope.gazField = $SH.gazField; // used by addAreaContent.tpl.htm
                $scope.config = $SH.config; // used by addAreaContent.tpl.htm
                $scope.step = 'default';
                $scope.area = 'drawBoundingBox';
                $scope.maxFileSize = $SH.maxUploadSize;
                if (inputData !== undefined && inputData.importArea === true) {
                    $scope.area = 'importShapefile';
                }
                $scope.defaultAreas = PredefinedAreasService.getList();
                $scope.selectedArea = {
                    name: $i18n(332, "new area"),
                    wkt: '',
                    q: [],
                    legend: '',
                    metadata: '',
                    wms: ''
                };
                $scope.radius = 10;
                $scope.location = '';
                $scope.areaname = '';
                $scope.intersect = {};
                $scope.uploadingFile = false;
                $scope.uploadProgress = 0;
                $scope.selectionDone = false;
                $scope.circle = {
                    longitude: '',
                    latitude: ''
                };
                $scope.myAreaName = $i18n(332, "new area");
                $scope.$watch('area', function (newValue) {
                    // used by click info popup to check if click came while drawing polygon
                    LayoutService.areaCtrlAreaValue = newValue;
                });
                LayoutService.addToSave($scope);
                $scope.ok = function () {
                    if ($scope.step === 'default') {
                        $scope.step = $scope.area;
                        if ($scope.area === 'drawBoundingBox') {
                            LayoutService.openPanel('area', $scope.area, false)
                        } else if ($scope.area === 'drawPolygon') {
                            LayoutService.openPanel('area', $scope.area, false)
                        } else if ($scope.area === 'drawPointRadius') {
                            LayoutService.openPanel('area', $scope.area, false)
                        } else if ($scope.area === 'pointOnLayer') {
                            LayoutService.openPanel('area', $scope.area, false)
                        } else if ($scope.area === 'drawPolyline') {
                            LayoutService.openPanel('area', $scope.area, false)
                        } else if ($scope.area === 'addressRadius') {
                        } else if ($scope.area === 'pointRadius') {
                        } else if ($scope.area === 'gazetteer') {
                        } else if ($scope.area.match(/^preset_/g) != null) {
                            for (var i = 0; i < $scope.defaultAreas.length; i++) {
                                var v = $scope.defaultAreas[i].name;
                                if ($scope.area.indexOf(v) == $scope.area.length - v.length) {
                                    $scope.selectedArea.name = $scope.defaultAreas[i].name;
                                    $scope.selectedArea.wkt = $scope.defaultAreas[i].wkt;
                                    break;
                                }
                            }
                            $scope.addToMapAndClose();
                        } else if ($scope.area === 'importShapefile' || $scope.area === 'importKML') {
                            $scope.uploadProgress = 0;
                        } else if ($scope.area === 'environmentalEnvelope') {
                            LayoutService.openPanel('envelope', $scope.area, false)
                        } else if ($scope.area === 'wkt') {
                        } else if ($scope.area === 'mergeArea') {
                            LayoutService.openModal('tool', {processName: 'MergeAreas'}, false);
                        }
                    } else {
                        var mapNow = true;
                        if ($scope.area === 'drawBoundingBox') {
                            //n/a
                        } else if ($scope.area === 'drawPolygon') {
                            //n/a
                        } else if ($scope.area === 'drawPointRadius') {
                            //n/a
                        } else if ($scope.area === 'pointOnLayer') {
                            //n/a
                        } else if ($scope.area === 'addressRadius') {
                            $scope.useAddress()
                        } else if ($scope.area === 'pointRadius') {
                            $scope.createCircle()
                        } else if ($scope.area === 'gazetteer') {
                        } else if ($scope.area.match(/^preset_/g) != null) {
                            //n/a
                        } else if ($scope.area === 'importShapefile') {
                            var featureIdxs = $scope.areaList.filter(function (area) {
                                return area.selected || false
                            }).map(function (area) {
                                return area.id
                            }).join();
                            LayersService.createArea($scope.myAreaName, $scope.fileName, $scope.shapeId, featureIdxs).then(function (response) {
                                if (response.data.error) {
                                    bootbox.alert("No areas selected. Points cannot be imported from a shapefile. (Error: " + response.data.error + ")");
                                } else
                                    $scope.setPid(response.data.id, true)
                            });
                            mapNow = false
                        } else if ($scope.area === 'importKML') {
                            //n/a
                        } else if ($scope.area === 'environmentalEnvelope') {
                            //n/a
                        } else if ($scope.area === 'wkt') {
                        }
                        if (mapNow) {
                            $scope.addToMapAndClose();
                        }
                    }
                };
                $scope.addToMapAndClose = function () {
                    var closingLater = false;
                    if ($scope.selectedArea.obj !== undefined && !$scope.isPoint()) {
                        $scope.selectedArea.obj.layertype = 'area';
                        MapService.zoomToExtents($scope.selectedArea.obj.bbox);
                        MapService.add($scope.selectedArea.obj);
                    } else {
                        if ($scope.isPoint()) {
                            //create circle
                            var coord = $scope.selectedArea.wkt.match(/\((.*)\)/)[1].split(" ");
                            $scope.selectedArea.name += ' (' + $scope.radius + 'km radius)';
                            $scope.selectedArea.wkt = Util.createCircle(parseFloat(coord[0]), parseFloat(coord[1]), $scope.radius * 1000)
                        }
                        if ($scope.selectedArea.wkt !== undefined && $scope.selectedArea.wkt.length > 0) {
                            if ($scope.selectedArea.area !== undefined && $scope.selectedArea.q !== undefined && $scope.selectedArea.q.length > 0) {
                                $scope.selectedArea.layertype = 'area';
                                MapService.add($scope.selectedArea);
                            } else {
                                closingLater = true;
                                LayersService.createFromWkt($scope.selectedArea.wkt, $scope.selectedArea.name, '').then(function (data) {
                                    if (!data.data.id) {
                                        bootbox.alert($i18n(479, "Invalid WKT"))
                                    } else {
                                        LayersService.getObject(data.data.id).then(function (data) {
                                            data.data.layertype = 'area';
                                            data.data.wkt = $scope.selectedArea.wkt;
                                            MapService.zoomToExtents(data.data.bbox);
                                            MapService.add(data.data);
                                            $scope.$close()
                                        })
                                    }
                                })
                            }
                        }
                    }
                    if (!closingLater)
                        $scope.$close()
                };
                $scope.set = function (wms, legend, metadata, q, wkt, name) {
                    $scope.selectedArea = {
                        wms: wms,
                        legend: legend,
                        metadata: metadata,
                        q: q,
                        wkt: wkt,
                        name: name
                    }
                };
                $scope.createCircle = function () {
                    $scope.setWkt(Util.createCircle($scope.circle.longitude, $scope.circle.latitude, $scope.radius * 1000))
                };
                $scope.useAddress = function () {
                    var coords = $scope.location.split(',');
                    $scope.selectedArea.name += ' (' + $scope.radius + 'km radius)';
                    $scope.setWkt(Util.createCircle(coords[1] * 1, coords[0] * 1, $scope.radius * 1000))
                };
                $scope.selectShpArea = function () {
                    var selected = "";
                    var userSelectedArea = $scope.areaList.filter(function (area) {
                        return area.selected || false
                    });
                    if (userSelectedArea.length === $scope.areaList.length) {
                        selected = "all";
                        $scope.checkAll = true;
                    } else {
                        selected = userSelectedArea.map(function (area) {
                            return area.id
                        }).join();
                        $scope.checkAll = false;
                    }
                    $scope.shpImg = LayersService.getShpImageUrl($scope.shapeId, selected);
                };
                $scope.toggleAllAreaCheckbox = function () {
                    angular.forEach($scope.areaList, function (area) {
                        area.selected = $scope.checkAll;
                    });
                    $scope.shpImg = LayersService.getShpImageUrl($scope.shapeId, "all");
                };
                $scope.uploadFile = function (newFiles) {
                    if (newFiles == null || newFiles.length == 0) {
                        return
                    }
                    var file = newFiles[0]
                    if (file.$error) {
                        if (file.$errorMessages.maxSize) {
                            bootbox.alert($i18n(476, "The uploaded file is too large. Max file size:") + " " + Math.floor($scope.maxFileSize / 1024 / 1024) + "MB");
                            return
                        }
                    }
                    if ($scope.area === 'importShapefile' && file.type.indexOf('zip') < 0) {
                        bootbox.alert($i18n(333, "The uploaded file must be shape zipped file"));
                        return;
                    }
                    $scope.uploadingFile = true;
                    LayersService.uploadAreaFile(file, $scope.area, $scope.myAreaName, file.name).then(function (response) {
                        if (response.data.error) {
                            $scope.errorMsg = response.data.error
                            $scope.uploadingFile = false;
                            bootbox.alert($scope.errorMsg);
                            $scope.uploadingFile = false;
                            return
                        }
                        if (!response.data.shapeId) {
                            $scope.errorMsg = $i18n(477, "Upload failed.")
                            $scope.uploadingFile = false;
                            bootbox.alert($scope.errorMsg);
                            $scope.uploadingFile = false;
                            return
                        }
                        $scope.fileName = file.name;
                        if ($scope.area === 'importShapefile') {
                            $scope.shapeId = response.data.shapeId;
                            $scope.areaHeader = [];
                            $scope.areaList = response.data.area;
                            if (response.data.area.length > 0) {
                                $scope.areaHeader = Object.keys(response.data.area[0].values);
                                $scope.shpImg = LayersService.getShpImageUrl($scope.shapeId, "all");
                                if (response.data.area.length == 1) {
                                    $scope.areaList[0].selected = true
                                }
                            }
                        } else if ($scope.area === 'importKML') {
                            if (response.data.shapeId) {
                                $scope.setPid(response.data.shapeId, true);
                                $scope.step = 'default';
                            }
                        }
                        $scope.myAreaName = file.name;
                        $scope.selectionDone = true;
                        file.result = response.data;
                        $scope.uploadingFile = false;
                    }, function (response) {
                        $scope.errorMsg = response.status + ': ' + response.data;
                        $scope.uploadingFile = false;
                        bootbox.alert($scope.errorMsg);
                    }, function (evt) {
                        $scope.uploadProgress = parseInt(100.0 * evt.loaded / evt.total);
                    });
                };
                $scope.showWkt = function () {
                    MapService.leafletScope.addWktToMap([$scope.selectedArea.wkt])
                };
                $scope.showLocationRadius = function () {
                    return $scope.selectedArea !== undefined && $scope.selectedArea.wkt !== undefined && $scope.selectedArea.wkt.match(/^POINT/) != null;
                };
                $scope.setWkt = function (wkt) {
                    $scope.selectedArea.wkt = wkt
                };
                $scope.selectArea = function (area) {
                    $scope.area = area;
                };
                $scope.setPid = function (pid, mapNow) {
                    // TODO: disable UI while fetching object, field and wkt info
                    LayersService.getObject(pid).then(function (obj) {
                        obj = obj.data;
                        $scope.selectedArea.obj = obj;
                        $scope.selectedArea.name = obj.name.length > 0 ? obj.name : $i18n(354, "area");
                        LayersService.getField(obj.fid, 0, 0, '').then(function (data) {
                            // only fetch wkt if it is not indexed in biocache
                            $scope.selectedArea.pid = obj.pid;
                            $scope.selectedArea.wms = obj.wmsurl;
                            if (data.data === undefined || data.data.id === undefined || !data.data.indb) {
                                LayersService.getWkt(pid).then(function (wkt) {
                                    $scope.selectedArea.wkt = wkt.data
                                    if (mapNow) {
                                        $scope.addToMapAndClose();
                                    }
                                })
                            } else {
                                $scope.selectedArea.q = obj.fid + ':"' + obj.name + '"';
                                $scope.selectedArea.obj.q = $scope.selectedArea.q
                                if (mapNow) {
                                    $scope.addToMapAndClose();
                                }
                            }
                        })
                    })
                };
                $scope.isDisabled = function () {
                    if ($scope.step === 'default') {
                    } else if ($scope.area === 'addressRadius') {
                        return $scope.location.length === 0
                    } else if ($scope.area === 'pointRadius') {
                        return $scope.circle.longitude.length === 0 || $scope.circle.latitude.length === 0
                    } else if ($scope.area === 'gazetteer') {
                        return $scope.selectedArea.pid === undefined
                    } else if ($scope.area.match(/^preset_/g) != null) {
                    } else if ($scope.area === 'importShapefile' || $scope.area === 'importKML') {
                        if ($scope.areaList) {
                            return $scope.areaList.filter(function (area) {
                                return area.selected || false
                            }).length === 0
                        } else {
                            return true
                        }
                    } else if ($scope.area === 'environmentalEnvelope') {
                    } else if ($scope.area === 'wkt') {
                        return $scope.selectedArea.wkt === undefined || $scope.selectedArea.wkt.length === 0
                    }
                    return false
                };
                $scope.isPoint = function () {
                    return $scope.selectedArea !== undefined && $scope.selectedArea.obj !== undefined && $scope.selectedArea.obj.area_km === 0
                };
                $scope.isLoggedIn = $scope.isLoggedIn = $SH.userId !== undefined && $SH.userId !== null && $SH.userId.length > 0;
                $scope.isNotLoggedIn = !$scope.isLoggedIn;
            }])
}(angular));