source : addDOICtrl.js

(function (angular) {
    'use strict';
    /**
     * @memberof spApp
     * @ngdoc controller
     * @name AddDOICtrl
     * @description
     *   Add a DOI query to the map
     */
    angular.module('add-d-o-i-ctrl', ['doi-service'])
        .controller('AddDOICtrl', ['DoiService', 'MapService', 'UrlParamsService', '$sce', '$scope', 'data', function (DoiService, MapService, UrlParamsService, $sce, $scope, inputData) {
            inputData = inputData || {};
            $scope.searchText = inputData.searchText || "";
            $scope.selectedDOI = inputData.selectedDOI || undefined;
            $scope.selectedDOIData;
            $scope.loading = false;
            $scope.results = inputData.results || undefined;
            $scope.pagination = {
              total: 0,
              page: 1,
              offset: 0,
              max: 10,
              sort: 'dateMinted',
              order: 'desc'
            };
            $scope.trustAsHtml = $sce.trustAsHtml;
            $scope.isDisabled = function () {
                return !$scope.selectedDOI;
            };
            $scope.clearSelection = function(){
                $scope.selectedDOIData = undefined;
                $scope.selectedDOI = undefined;
            };
            $scope.updatePaginationParams = function() {
                if ($scope.results && $scope.results.total) {
                    $scope.pagination.total = $scope.results.total;
                }
                if ($scope.pagination.page >= 1) {
                    $scope.pagination.offset = ($scope.pagination.page - 1) * $scope.pagination.max;
                }
            };
            $scope.fetchResultsForPage = function(){
                $scope.updatePaginationParams();
                $scope.getResults();
            };
            $scope.getQueryString = function(){
                if (!$scope.searchText || !$scope.searchText.trim()) {
                    return "*";
                } else {
                    var query = $scope.searchText,
                        queryWords = query.split(" "),
                        queryTemplate = "applicationMetadata.queryTitle:*SEARCHTERM* applicationMetadata.organisation:SEARCHTERM* applicationMetadata.modeller:SEARCHTERM*",
                        results = [];
                    for(var i =0; i < queryWords.length; i++) {
                        results.push(queryTemplate.replace(/SEARCHTERM/g, queryWords[i]));
                    }
                    return results.join(" ");
                }
            };
            $scope.searchForTerm = function(){
                $scope.clearSelection();
                $scope.getResults();
            };
            $scope.getResults = function () {
                $scope.results = undefined;
                $scope.loading = true;
                DoiService.search($scope.getQueryString(), $scope.pagination).then(function (data) {
                    $scope.results = data;
                    $scope.updatePaginationParams();
                }).finally(function () {
                    $scope.loading = false;
                });
            };
            $scope.getSelectedDOIData = function(){
              if ($scope.selectedDOI != undefined) {
                  if ($scope.results && $scope.results.searchResults && $scope.results.searchResults.length > 0) {
                      var results = $scope.results.searchResults;
                      for(var i=0; i< results.length; i++) {
                          if (results[i].id === $scope.selectedDOI)
                              return results[i];
                      }
                  }
              }
            };
            $scope.setSelectedDOIData = function () {
                $scope.selectedDOIData = $scope.getSelectedDOIData();
            };
            $scope.getDOIInfoString = function(doi) {
                doi = doi || $scope.selectedDOIData;
                if(doi)
                    return DoiService.buildInfoString(doi);
                else
                    return $i18n(462, "No dataset selected");
            };
            $scope.getDOIURL = function(doi){
                doi = doi || doi.selectedDOIData;
                if (doi)
                    return DoiService.getDOIURL(doi);
            };
            $scope.addDOIToMap = function(){
                $scope.$close();
                var doi = $scope.selectedDOIData;
                var url = DoiService.getQueryUrl(doi);
                if (url) {
                    var searchParams = UrlParamsService.parseSearchParams(url);
                    var queryParams = DoiService.buildQueryFromDoi(doi, searchParams);
                    var newName = $i18n(465, "DOI") + ": " + DoiService.buildShortInfo(doi);
                    if (queryParams.q && queryParams.q.length > 0) {
                        queryParams.qid = queryParams.q[0];
                        queryParams.q.splice(0,1);
                    }
                    queryParams.name = MapService.nextLayerName(newName);
                    queryParams.bs = $SH.biocacheServiceUrl;
                    queryParams.ws = $SH.biocacheUrl;
                    return MapService.add(queryParams).then(function () {
                        return true;
                    })
                }
                else {
                    // This shouldn't happen as dois without a URL will be filtered out by the search process.
                    bootbox.alert($i18n(472, "No data was able to be extracted from the selected DOI"));
                }
            };
            if (!$scope.results) {
                $scope.getResults();
            } else {
                $scope.setSelectedDOIData();
            }
        }])
}(angular));