1skadden.ng.controller("NewsSearchController", ['$scope', '$http', '$element', 'queryStringService', '$sce', '$location', '$timeout', 'historyService', function ($scope, $http, $element, queryStringService, $sce, $location, $timeout, historyService) { 2 3 //Filters 4 $scope.keyword = ""; 5 $scope.activeKeyword = ""; 6 $scope.contentTypes = null; 7 $scope.capabilities = null; 8 $scope.capabilityRegions = null; 9 $scope.offices = null; 10 $scope.professionals = null; 11 $scope.daterange = null; 12 13 // Functions For Remove Filter 14 var removeAllFunctions = []; 15 // Functions For Appending To QS 16 var appendQSFunctions = []; 17 var $noresults = $($element.find('.js-no-results')); 18 //This will hold selected filter objects for display of showing in filters 19 $scope.selectedFilterObjects = []; 20 //Will hold all selectedFilterObjects including any changes and will be set to selectedFilterObjects on submitting search 21 var tempSelectedFilterObjects = []; 22 $scope.focusIndex = 0; 23 $scope.results = []; 24 $scope.hasMore = false; 25 $scope.hasSearched = Boolean(queryStringService.getParameterByName('hassearched')); 26 $scope.isLoading = true; 27 $scope.isLoadingMore = false; 28 $scope.skip = 0; 29 $scope.pageNum = 0; 30 $scope.numberOfResultsPerPage = 0; 31 $scope.trustAsHtml = $sce.trustAsHtml; 32 $scope.resultsCount = 0; 33 $scope.panelid = ''; 34 $scope.paneltogglestate = 0; // 0 - None, 1 - Toggle Only, 2 Toggle and Search 35 36 //Watch Url Changes 37 historyService.initialize($scope, doSearch); 38 39 $scope.initPage = function (jsonResult) { 40 $scope.setValues(jsonResult); 41 $scope.hasSearched = $scope.hasSearched || $scope.selectedFilterObjects.length > 1 || $scope.activeKeyword.length > 1; 42 43 $timeout(function () { 44 if (!!$scope.panelid) { 45 window.SearchLandingPanels.forcePanel($scope.panelid); 46 $scope.hasSearched = true; 47 } 48 49 if ($scope.hasSearched) { 50 var qsParms = parseQueryString(window.location.href); 51 var scrollPosition = 0; 52 if (!!qsParms.scroll && qsParms.scroll.length > 0) { 53 scrollPosition = parseInt(qsParms.scroll); 54 } 55 if (scrollPosition > 0) { 56 scrollTo(scrollPosition); 57 } 58 else { 59 $timeout(function () { 60 window.animationSearchLogic.showSearchResults(); 61 }, 800); 62 }
63 $scope.focusIndex = $scope.results.length; 64 } 65 }, 200); 66 } 67 68 $scope.setValues = function (jsonResult) { 69 removeAllFunctions = []; 70 appendQSFunctions = []; 71 72 //add news type to the filter everytime 73 $scope.contentTypes = jsonResult.SearchFilters.ContentTypes; 74 attachSingleSelectFilter($scope.contentTypes); 75 76 $scope.capabilities = jsonResult.SearchFilters.Capabilities; 77 attachSingleSelectFilter($scope.capabilities); 78 79 $scope.capabilityRegions = jsonResult.SearchFilters.CapabilityRegions; 80 attachSingleSelectFilter($scope.capabilityRegions); 81 82 $scope.offices = jsonResult.SearchFilters.Offices; 83 attachSingleSelectFilter($scope.offices); 84 85 $scope.daterange = jsonResult.SearchFilters.DateRange; 86 attachSingleSelectFilter($scope.daterange); 87 88 $scope.professionals = jsonResult.SearchFilters.Professionals; 89 attachTypeAheadFilter($scope.professionals); 90 91 var queryStringObject = $location.search(); 92 93 $scope.selectedFilterObjects = jsonResult.SearchFilters.AllSelectedFilters; 94 95 var hasNewsType = false; 96 for (var i = 0; i < $scope.selectedFilterObjects.length; i++) { 97 if ($scope.selectedFilterObjects[i].ID === jsonResult.SearchFilters.ContentTypes.SelectedValue.ID) { 98 hasNewsType = true; 99 break; 100 } 101 } 102 if (!hasNewsType) { 103 $scope.selectedFilterObjects.push(jsonResult.SearchFilters.ContentTypes.SelectedValue); 104 } 105 106 tempSelectedFilterObjects = angular.copy(jsonResult.SearchFilters.AllSelectedFilters); 107 $scope.keyword = jsonResult.SearchFilters.KeywordFilter; 108 $scope.activeKeyword = $scope.keyword; 109 110 var qsParms = window.parseQueryString(window.location.search); 111 if (qsParms.hasOwnProperty('panelid')) { 112 $scope.panelid = qsParms.panelid; 113 } 114 $scope.paneltogglestate = 0; 115 116 //Do not reset results if this isn't load more 117 if ($scope.isLoadingMore) { 118 $scope.results = $scope.results.concat(jsonResult.SearchResults); 119 $scope.isLoadingMore = false; 120 $scope.isLoading = false; 121 } else { 122 $scope.results = jsonResult.SearchResults; 123 if ($scope.hasSearched) { 124 if (!$scope.selectedFilterObjects.length && !$scope.keyword) { 125 $scope.hasSearched = false; 126 } 127 } 128 } 129 130 $scope.hasMore = jsonResult.HasMoreResults; 131 $scope.resultsCount = jsonResult.ResultCount; 132 $scope.numberOfResultsPerPage = jsonResult.SearchFilters.Take; 133 $scope.skip = jsonResult.SearchFilters.Skip; 134 135 if ($scope.results.length == 0) { 136 $timeout(function () { $noresults.focus(); }, 1000); 137 } 138 } 139 140 function attachSingleSelectFilter(filter) { 141 filter.callback = function (selectedFilterEntity, removeAll) { 142 if (removeAll != null && removeAll) { 143 removeAllFilters(); 144 } 145 if (selectedFilterEntity != null) { 146 filter.SelectedValue = selectedFilterEntity; 147 } 148 var filterEntity = filter.SelectedValue; 149 for (var f = 0; f < filter.Filters.length; f++) { 150 for (var i = 0; i < tempSelectedFilterObjects.length; i++) { 151 if (tempSelectedFilterObjects[i].ID === filter.Filters[f].ID) { 152 tempSelectedFilterObjects.splice(i, 1); 153 break; 154 } 155 } 156 } 157 158 $scope.skip = 0; 159 $scope.pageNum = 0; 160 $scope.isLoadingMore = false; 161 162 $scope.pushActiveFilter(filter.SelectedValue); 163 $scope.performSearch(true); 164 }; 165 166 attachRemove(filter); 167 attachQSAppend(filter); 168 } 169 170 function attachTypeAheadFilter(filter) { 171 filter.callback = function (filterEntity) { 172 filter.SelectedValue = filterEntity; 173 174 $scope.skip = 0; 175 $scope.pageNum = 0; 176 $scope.isLoadingMore = false; 177 178 $scope.pushActiveFilter(filter.SelectedValue); 179 $scope.performSearch(true); 180 } 181 182 attachRemove(filter); 183 attachQSAppend(filter); 184 } 185 186 function attachRemove(filter) { 187 filter.remove = function (filterEntity) { 188 if (!!filterEntity) { 189 if (filter.SelectedValue != null && filter.SelectedValue.ID === filterEntity.ID) { 190 for (var i = 0; i < tempSelectedFilterObjects.length; i++) { 191 if (tempSelectedFilterObjects[i].ID === filterEntity.ID) { 192 tempSelectedFilterObjects.splice(i, 1); 193 break; 194 } 195 } 196 filter.SelectedValue = null; 197 } 198 } else { 199 filter.SelectedValue = null; 200 } 201 }; 202 203 removeAllFunctions.push(filter.remove); 204 } 205 206 function attachQSAppend(filter) { 207 filter.appendQS = function (queryString) { 208 if (filter.SelectedValue != null) 209 return queryStringService.addQueryString(filter.QSParm, filter.SelectedValue.ID, queryString); 210 else 211 return queryString; 212 }; 213 214 appendQSFunctions.push(filter.appendQS); 215 } 216 217 $scope.pushActiveFilter = function (filterEntity) { 218 var currentFilterIndex = null; 219 for (var i = 0; i < tempSelectedFilterObjects.length; i++) { 220 if (tempSelectedFilterObjects[i].ID === filterEntity.ID) { 221 currentFilterIndex = i; 222 break; 223 } 224 } 225 if (currentFilterIndex != null) { 226 tempSelectedFilterObjects.splice(currentFilterIndex, 1); 227 } 228 tempSelectedFilterObjects.push(filterEntity); 229 }; 230 231 $scope.removeActiveFilter = function (filterEntity) { 232 for (var i = 0; i < removeAllFunctions.length; i++) { 233 removeAllFunctions[i](filterEntity); 234 } 235 236 if ($scope.keyword === filterEntity.ID) { 237 $scope.keyword = ''; 238 } 239 240 $scope.performSearch($scope.hasSearched); 241 }; 242 243 $scope.removeKeywordFilter = function () { 244 $scope.keyword = ''; 245 $scope.activeKeyword = ''; 246 $scope.performSearch($scope.hasSearched); 247 }; 248 249 function removeAllFilters() { 250 for (var i = 0; i < removeAllFunctions.length; i++) { 251 removeAllFunctions[i]();
252 } 253 tempSelectedFilterObjects = []; 254 $scope.skip = 0; 255 $scope.pageNum = 0; 256 } 257 258 $scope.ClearAllFilters = function () { 259 removeAllFilters(); 260 $scope.keyword = ''; 261 $scope.performSearch(true); 262 }; 263 264 $scope.performSwitchPanel = function (panelid) { 265 $scope.panelid = panelid; 266 $scope.paneltogglestate = 1; 267 268 $scope.performSearch($scope.hasSearched); 269 }; 270 271 $scope.doSwitchPanel = function (panelid) { 272 $scope.panelid = panelid; 273 $scope.paneltogglestate = 0; 274 275 window.SearchLandingPanels.forcePanel(panelid); 276 }; 277 278 $scope.displayFindMode = function (selectedFilter, panelid, daterange) { 279 $scope.panelid = panelid; 280 $scope.paneltogglestate = 2; 281 282 removeAllFilters(); 283 if (!!daterange) { 284 for (var i = 0; i < $scope.daterange.Filters.length; i++) { 285 if ($scope.daterange.Filters[i].ID === daterange) { 286 $scope.daterange.SelectedValue = $scope.daterange.Filters[i]; 287 $scope.pushActiveFilter($scope.daterange.SelectedValue); 288 break; 289 } 290 } 291 } 292 $timeout(function () { 293 $scope.contentTypes.callback(selectedFilter, true); 294 }, 400); 295 }; 296 297 $scope.performKeywordSearch = function () { 298 if (!!$scope.keyword) { 299 var filterEntity = { 300 ID: $scope.keyword, 301 Name: $scope.keyword 302 }; 303 $scope.pushActiveFilter(filterEntity); 304 $scope.performSearch(true); 305 } 306 } 307 308 $scope.performSearch = function (hasSearched, isLoadMore) { 309 $scope.activeKeyword = $scope.keyword; 310 $scope.isLoading = true; 311 312 if (isLoadMore) { 313 $scope.isLoadingMore = true; 314 $scope.pageNum++; 315 316 $scope.skip = !!$scope.results ? $scope.results.length : 0; 317 } 318 319 var queryString = ""; 320 queryString = queryStringService.addQueryString('skip', $scope.skip, queryString); 321 if ($scope.keyword !== "") 322 queryString = queryStringService.addQueryString('keyword', encodeURIComponent($scope.keyword), queryString); 323 if ($scope.panelid !== "") 324 queryString = queryStringService.addQueryString('panelid', $scope.panelid, queryString); 325 if ($scope.paneltogglestate > 0) 326 queryString = queryStringService.addQueryString('paneltogglestate', $scope.paneltogglestate, queryString); 327 for (var i = 0; i < appendQSFunctions.length; i++) { 328 queryString = appendQSFunctions[i](queryString); 329 } 330 331 //Set has searched to false if there is no search criteria 332 if (!tempSelectedFilterObjects.length && !$scope.keyword) { 333 hasSearched = false; 334 } 335 336 $scope.hasSearched = hasSearched; 337 338 //If user has performed a search action - i.e. Keyword, Filter, etc. (besides load more) 339 if (hasSearched) { 340 queryString = queryStringService.addQueryString('hassearched', $scope.hasSearched, queryString); 341 } 342 343 //Push state 344 var qs = parseQueryString(queryString); 345 $location.search(qs); 346 History.pushState({ qs: queryString }, History.options.initialTitle, $location.url()); 347 } 348 349 function doSearch() { 350 if ($scope.hasSearched) { 351 if (!$scope.isLoadingMore) { 352 window.animationSearchLogic.showLoadingScreen(); 353 } 354 } 355 356 $http.get('/api/sitecore/About/search?' + queryStringService.toQueryString($location.search())).success(function (response) { 357 var wasLoadingMore = $scope.isLoadingMore; 358 359 $scope.hasMore = response.HasMoreResults; 360 $scope.resultsCount = parseInt(response.ResultCount); 361 362 //Reinitialize values 363 $scope.setValues(response); 364 $scope.hasSearched = $scope.hasSearched || $scope.selectedFilterObjects.length > 1 || $scope.activeKeyword.length > 0;
365 366 $timeout(function () { 367 if ($scope.hasSearched) { 368 if (!wasLoadingMore) { 369 window.animationSearchLogic.showSearchResults(); 370 } 371 window.animationSearchLogic.refreshBackToTop(); 372 $scope.focusIndex = $scope.results.length; 373 } else { 374 window.animationSearchLogic.transitionToSearchDefault(); 375 } 376 }, 400); 377 378 }).error(function (data, status, headers, config) { 379 380 }); 381 } 382 383 function scrollTo(scrollPos) { 384 window.addEventListener('wheel', preventDefault); 385 $('html, body').stop().animate({ 386 scrollTop: scrollPos 387 }, { 388 duration: 1000, 389 complete: function () { 390 window.removeEventListener('wheel', preventDefault); 391 } 392 }); 393 } 394 395 function preventDefault(evt) { evt.preventDefault(); } 396 397 $scope.toSafeHtml = function (content) { 398 return $sce.trustAsHtml(content); 399 }; 400}]);
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.