blob: 46d28fca9cd5a43b8447c3baf3790593537e034a [file] [log] [blame]
epoger@google.comf9d134d2013-09-27 15:02:44 +00001/*
2 * Loader:
epoger@google.comafaad3d2013-09-30 15:06:25 +00003 * Reads GM result reports written out by results.py, and imports
4 * them into $scope.categories and $scope.testData .
epoger@google.comf9d134d2013-09-27 15:02:44 +00005 */
6var Loader = angular.module(
7 'Loader',
8 []
9);
epoger@google.com5f2bb002013-10-02 18:57:48 +000010
11// TODO(epoger): Combine ALL of our filtering operations (including
12// truncation) into this one filter, so that runs most efficiently?
13// (We would have to make sure truncation still took place after
14// sorting, though.)
15Loader.filter(
16 'removeHiddenItems',
17 function() {
18 return function(unfilteredItems, hiddenResultTypes, hiddenConfigs) {
19 var filteredItems = [];
20 for (var i = 0; i < unfilteredItems.length; i++) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000021 var item = unfilteredItems[i];
22 if (!(true == hiddenResultTypes[item.resultType]) &&
23 !(true == hiddenConfigs[item.config])) {
24 filteredItems.push(item);
25 }
epoger@google.com5f2bb002013-10-02 18:57:48 +000026 }
27 return filteredItems;
28 };
29 }
30);
31
epoger@google.comf9d134d2013-09-27 15:02:44 +000032Loader.controller(
33 'Loader.Controller',
epoger@google.comdcb4e652013-10-11 18:45:33 +000034 function($scope, $http, $filter, $location) {
35 var resultsToLoad = $location.search().resultsToLoad;
36 $scope.loadingMessage = "Loading results of type '" + resultsToLoad +
37 "', please wait...";
38
39 $http.get("/results/" + resultsToLoad).success(
40 function(data, status, header, config) {
41 $scope.loadingMessage = "Processing data, please wait...";
42
43 $scope.header = data.header;
44 $scope.categories = data.categories;
45 $scope.testData = data.testData;
epoger@google.comf9d134d2013-09-27 15:02:44 +000046 $scope.sortColumn = 'test';
epoger@google.com5f2bb002013-10-02 18:57:48 +000047
epoger@google.comdcb4e652013-10-11 18:45:33 +000048 for (var i = 0; i < $scope.testData.length; i++) {
49 $scope.testData[i].index = i;
50 }
51
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000052 $scope.hiddenResultTypes = {
53 'failure-ignored': true,
54 'no-comparison': true,
55 'succeeded': true,
56 };
57 $scope.hiddenConfigs = {};
58 $scope.selectedItems = {};
epoger@google.com5f2bb002013-10-02 18:57:48 +000059
60 $scope.updateResults();
epoger@google.comdcb4e652013-10-11 18:45:33 +000061 $scope.loadingMessage = "";
62 }
63 ).error(
64 function(data, status, header, config) {
65 $scope.loadingMessage = "Failed to load results of type '"
66 + resultsToLoad + "'";
epoger@google.comf9d134d2013-09-27 15:02:44 +000067 }
68 );
epoger@google.com5f2bb002013-10-02 18:57:48 +000069
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000070 $scope.isItemSelected = function(index) {
71 return (true == $scope.selectedItems[index]);
72 }
73 $scope.toggleItemSelected = function(index) {
74 if (true == $scope.selectedItems[index]) {
75 delete $scope.selectedItems[index];
76 } else {
77 $scope.selectedItems[index] = true;
78 }
79 // unlike other toggle methods below, does not set
80 // $scope.areUpdatesPending = true;
81 }
82
epoger@google.com5f2bb002013-10-02 18:57:48 +000083 $scope.isHiddenResultType = function(thisResultType) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000084 return (true == $scope.hiddenResultTypes[thisResultType]);
epoger@google.com5f2bb002013-10-02 18:57:48 +000085 }
86 $scope.toggleHiddenResultType = function(thisResultType) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000087 if (true == $scope.hiddenResultTypes[thisResultType]) {
88 delete $scope.hiddenResultTypes[thisResultType];
epoger@google.com5f2bb002013-10-02 18:57:48 +000089 } else {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000090 $scope.hiddenResultTypes[thisResultType] = true;
epoger@google.com5f2bb002013-10-02 18:57:48 +000091 }
92 $scope.areUpdatesPending = true;
93 }
94
95 // TODO(epoger): Rather than maintaining these as hard-coded
96 // variants of isHiddenResultType and toggleHiddenResultType, we
97 // should create general-purpose functions that can work with ANY
98 // category.
99 // But for now, I wanted to see this working. :-)
100 $scope.isHiddenConfig = function(thisConfig) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +0000101 return (true == $scope.hiddenConfigs[thisConfig]);
epoger@google.com5f2bb002013-10-02 18:57:48 +0000102 }
103 $scope.toggleHiddenConfig = function(thisConfig) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +0000104 if (true == $scope.hiddenConfigs[thisConfig]) {
105 delete $scope.hiddenConfigs[thisConfig];
epoger@google.com5f2bb002013-10-02 18:57:48 +0000106 } else {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +0000107 $scope.hiddenConfigs[thisConfig] = true;
epoger@google.com5f2bb002013-10-02 18:57:48 +0000108 }
109 $scope.areUpdatesPending = true;
110 }
111
112 $scope.updateResults = function() {
113 $scope.displayLimit = $scope.displayLimitPending;
114 // TODO(epoger): Every time we apply a filter, AngularJS creates
115 // another copy of the array. Is there a way we can filter out
116 // the items as they are displayed, rather than storing multiple
117 // array copies? (For better performance.)
118 $scope.filteredTestData =
epoger@google.com9fb6c8a2013-10-09 18:05:58 +0000119 $filter("orderBy")(
120 $filter("removeHiddenItems")(
121 $scope.testData,
122 $scope.hiddenResultTypes,
123 $scope.hiddenConfigs
124 ),
125 $scope.sortColumn);
epoger@google.com5f2bb002013-10-02 18:57:48 +0000126 $scope.limitedTestData = $filter("limitTo")(
epoger@google.com9fb6c8a2013-10-09 18:05:58 +0000127 $scope.filteredTestData, $scope.displayLimit);
epoger@google.com5f2bb002013-10-02 18:57:48 +0000128 $scope.imageSize = $scope.imageSizePending;
129 $scope.areUpdatesPending = false;
130 }
131
132 $scope.sortResultsBy = function(sortColumn) {
133 $scope.sortColumn = sortColumn;
134 $scope.updateResults();
135 }
epoger@google.comf9d134d2013-09-27 15:02:44 +0000136 }
137);