blob: 80f84c6a3ae37d2e50a2c59b7ba8139757759ba9 [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.com542b65f2013-10-15 20:10:33 +000034 function($scope, $http, $filter, $location) {
35 $scope.windowTitle = "Loading GM Results...";
epoger@google.comdcb4e652013-10-11 18:45:33 +000036 var resultsToLoad = $location.search().resultsToLoad;
37 $scope.loadingMessage = "Loading results of type '" + resultsToLoad +
38 "', please wait...";
39
40 $http.get("/results/" + resultsToLoad).success(
41 function(data, status, header, config) {
42 $scope.loadingMessage = "Processing data, please wait...";
43
44 $scope.header = data.header;
45 $scope.categories = data.categories;
46 $scope.testData = data.testData;
epoger@google.comf9d134d2013-09-27 15:02:44 +000047 $scope.sortColumn = 'test';
epoger@google.com542b65f2013-10-15 20:10:33 +000048 $scope.showTodos = true;
epoger@google.com5f2bb002013-10-02 18:57:48 +000049
epoger@google.comdcb4e652013-10-11 18:45:33 +000050 for (var i = 0; i < $scope.testData.length; i++) {
51 $scope.testData[i].index = i;
52 }
53
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000054 $scope.hiddenResultTypes = {
55 'failure-ignored': true,
56 'no-comparison': true,
57 'succeeded': true,
58 };
59 $scope.hiddenConfigs = {};
60 $scope.selectedItems = {};
epoger@google.com5f2bb002013-10-02 18:57:48 +000061
62 $scope.updateResults();
epoger@google.comdcb4e652013-10-11 18:45:33 +000063 $scope.loadingMessage = "";
epoger@google.com542b65f2013-10-15 20:10:33 +000064 $scope.windowTitle = "Current GM Results";
epoger@google.comdcb4e652013-10-11 18:45:33 +000065 }
66 ).error(
67 function(data, status, header, config) {
68 $scope.loadingMessage = "Failed to load results of type '"
69 + resultsToLoad + "'";
epoger@google.com542b65f2013-10-15 20:10:33 +000070 $scope.windowTitle = "Failed to Load GM Results";
epoger@google.comf9d134d2013-09-27 15:02:44 +000071 }
72 );
epoger@google.com5f2bb002013-10-02 18:57:48 +000073
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000074 $scope.isItemSelected = function(index) {
75 return (true == $scope.selectedItems[index]);
76 }
77 $scope.toggleItemSelected = function(index) {
78 if (true == $scope.selectedItems[index]) {
79 delete $scope.selectedItems[index];
80 } else {
81 $scope.selectedItems[index] = true;
82 }
83 // unlike other toggle methods below, does not set
84 // $scope.areUpdatesPending = true;
85 }
86
epoger@google.com5f2bb002013-10-02 18:57:48 +000087 $scope.isHiddenResultType = function(thisResultType) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000088 return (true == $scope.hiddenResultTypes[thisResultType]);
epoger@google.com5f2bb002013-10-02 18:57:48 +000089 }
90 $scope.toggleHiddenResultType = function(thisResultType) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000091 if (true == $scope.hiddenResultTypes[thisResultType]) {
92 delete $scope.hiddenResultTypes[thisResultType];
epoger@google.com5f2bb002013-10-02 18:57:48 +000093 } else {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000094 $scope.hiddenResultTypes[thisResultType] = true;
epoger@google.com5f2bb002013-10-02 18:57:48 +000095 }
96 $scope.areUpdatesPending = true;
97 }
98
99 // TODO(epoger): Rather than maintaining these as hard-coded
100 // variants of isHiddenResultType and toggleHiddenResultType, we
101 // should create general-purpose functions that can work with ANY
102 // category.
103 // But for now, I wanted to see this working. :-)
104 $scope.isHiddenConfig = function(thisConfig) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +0000105 return (true == $scope.hiddenConfigs[thisConfig]);
epoger@google.com5f2bb002013-10-02 18:57:48 +0000106 }
107 $scope.toggleHiddenConfig = function(thisConfig) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +0000108 if (true == $scope.hiddenConfigs[thisConfig]) {
109 delete $scope.hiddenConfigs[thisConfig];
epoger@google.com5f2bb002013-10-02 18:57:48 +0000110 } else {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +0000111 $scope.hiddenConfigs[thisConfig] = true;
epoger@google.com5f2bb002013-10-02 18:57:48 +0000112 }
113 $scope.areUpdatesPending = true;
114 }
115
epoger@google.com542b65f2013-10-15 20:10:33 +0000116 $scope.localTimeString = function(secondsPastEpoch) {
117 var d = new Date(secondsPastEpoch * 1000);
118 return d.toString();
119 }
120
epoger@google.com5f2bb002013-10-02 18:57:48 +0000121 $scope.updateResults = function() {
122 $scope.displayLimit = $scope.displayLimitPending;
123 // TODO(epoger): Every time we apply a filter, AngularJS creates
124 // another copy of the array. Is there a way we can filter out
125 // the items as they are displayed, rather than storing multiple
126 // array copies? (For better performance.)
127 $scope.filteredTestData =
epoger@google.com9fb6c8a2013-10-09 18:05:58 +0000128 $filter("orderBy")(
129 $filter("removeHiddenItems")(
130 $scope.testData,
131 $scope.hiddenResultTypes,
132 $scope.hiddenConfigs
133 ),
134 $scope.sortColumn);
epoger@google.com5f2bb002013-10-02 18:57:48 +0000135 $scope.limitedTestData = $filter("limitTo")(
epoger@google.com9fb6c8a2013-10-09 18:05:58 +0000136 $scope.filteredTestData, $scope.displayLimit);
epoger@google.com5f2bb002013-10-02 18:57:48 +0000137 $scope.imageSize = $scope.imageSizePending;
138 $scope.areUpdatesPending = false;
139 }
140
141 $scope.sortResultsBy = function(sortColumn) {
142 $scope.sortColumn = sortColumn;
143 $scope.updateResults();
144 }
epoger@google.comf9d134d2013-09-27 15:02:44 +0000145 }
146);