1'use strict'; 2 3angular 4 .module('app') 5 .controller( 6 'searchController', 7 ['$scope', '$stateParams', '$timeout', 'apiService', 'subscService', 8 function($scope, $stateParams, $timeout, apiService, subscService) { 9 //console.log('searchController()'); 10 11 $scope.init = function (){ 12 //console.log('init() in searchController()'); 13 14 // Setup scope 15 $scope.id = 'searchController'; 16 $scope.scopeLoading = false; 17 $scope.searchLoading = false; 18 $scope.searched = false; 19 $scope.searchTimeout = null; 20 $scope.subscSearchResultsData = []; 21 $scope.newsSearchResultsData = []; 22 $scope.model = {}; 23 $scope.model.searchText = ( defined($stateParams.q) ) ? $stateParams.q : ''; 24 25 // Initiate search if we have a query on-load 26 if ( $scope.model.searchText.length ) { 27 $scope.search($scope.model.searchText); 28 } 29 30 } 31 32 $scope.searchTextChanged = function( $event ){ 33 //console.log('searchTextChanged() in searchController()'); 34 //console.log('$scope.model.searchText="' + $scope.model.searchText + '"'); 35 36 // Cancel a previous search so searches don't pile up when the user types quickly 37 if ( $scope.searchTimeout ) { 38 //console.log('Cancelling previous $scope.searchTimeout in searchTextChanged() in searchController()'); 39 var result = $timeout.cancel($scope.searchTimeout); 40 //console.log('result=' + result); console.dir(result); 41 } 42 43 // Skip if no search text 44 if ( ! $scope.model.searchText.length ) { 45 $scope.subscSearchResultsData = []; 46 $scope.newsSearchResultsData = []; 47 return; 48 } 49 50 // Fire off a search 51 var searchDelay = getConfValue('web.search_delay'); 52 //console.log('searchDelay=' + searchDelay); 53 $scope.searchTimeout = $timeout(function(){ 54 //console.log('searchTimeout() in searchTextChanged() in searchController()'); 55 $scope.search($scope.model.searchText); 56 }, searchDelay); 57 $scope.searchTimeout.then(function successCallback ( result ) { 58 //console.log('searchTimeout() successCallback() in searchTextChanged() in searchController()'); 59 $scope.searchTimeout = null; 60 }, function failureCallback ( result ) { 61 //console.log('searchTimeout() failureCallback() in searchTextChanged() in searchController()'); 62 $scope.searchTimeout = null; 63 }); 64 65 }; 66 67 // (string) -> [{}] 68 // Return search result data for given search text 69 $scope.search = function( searchText ){ 70 //console.log('search() in searchController()'); 71 //console.log('searchText="' + searchText + '"'); 72 $scope.searched = true; 73 $scope.searchLoading = true; 74 $scope.getSearch({searchText: searchText}).then(function successCallback ( result ) { 75 //console.log('getSearch() successCallback in search() in searchController()'); 76 //console.log('result='); console.dir(result); 77 78 // Setup scope and process 79 $scope.subscSearchResultsData = []; 80 $scope.newsSearchResultsData = []; 81 var searchResultsData = result.data; 82 for ( var i = 0; i < searchResultsData.length; i++ ) { 83 84 // Process by type 85 var searchResultData = searchResultsData[i]; 86 if ( searchResultData.type == 'SUBSC' ) { 87 $scope.subscSearchResultsData.push( searchResultData ); 88 } else { 89 $scope.newsSearchResultsData.push( searchResultData ); 90 } 91 92 } 93 94 // Unflag loading 95 $scope.searchLoading = false; 96 97 // Refresh scope 98 $scope.$apply(); 99 100 }, function failureCallback ( result ) { 101 console.error('getSearch() failureCallback in search() in searchController()'); 102 console.error('result='); console.dir(result); 103 $scope.searchLoading = false; 104 }); 105 }; 106 107 // () -> Promise 108 // Returns a promise and resolves with search results data 109 $scope.getSearch = function ( options ) { 110 //console.log('getSearch() in searchController()'); 111 if ( ! options ) options = {}; 112 113 // Options 114 var searchText = ( options.hasOwnProperty('searchText') && defined(options['searchText']) ) ? options['searchText'] : null; 115 //console.log('searchText="' + searchText + '"'); 116 117 return new Promise( function(resolve, reject){ 118 var url = '/api/search.php?action=search'; 119 if ( defined(searchText) ) url += '&searchText=' + encodeURIComponent(searchText); 120 apiService.callAPI(url, {}, 'GET', {/*no data*/}, function (result) { 121 //console.log('apiService.callAPI() url="' + url + '" callback in getSearch() in searchController()'); 122 //console.log('result='); console.dir(result); 123 if (result.success) { 124 var apiResponse = result.apiResponse.data; 125 var apiData = apiResponse.data; 126 resolve({data: apiData}); 127 } else { 128 console.error('Failure result in apiService.callAPI() url="' + url + '" callback in getSearch() in searchController()'); 129 console.error('result='); console.dir(result); 130 reject({message: 'apiService.callAPI() failure: result.success="' + result.success + '"'}); 131 } 132 133 }); 134 }); 135 }; 136 137 138 139 $scope.$on('$viewContentLoaded', function(){ 140 //console.log('$viewContentLoaded in searchController()'); 141 }); 142 143 $scope.$on('$destroy', function(){ // Always stop background tasks (eg. timeouts, intervals) on-destroy to avoid memory leaks. 144 //console.log('$destroy in searchController()'); 145 }); 146 147 // Initialize 148 $scope.init(); 149 150 }] 151);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.