PageSourceSearch

https://www.skadden.com/assets/site/public/js/custom/controllers/NewsSearchController.js

js skadden.com collected 2026-09-24 08:37:19 UTC 14,734 bytes, 400 lines download raw bytes

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.