blob: c8606cce87b67733403dd8c2df4e98edd610cf65 [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.com5f2bb002013-10-02 18:57:48 +000034 function($scope, $http, $filter) {
epoger@google.comf9d134d2013-09-27 15:02:44 +000035 $http.get("/results/all").then(
36 function(response) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000037 $scope.header = response.data.header;
epoger@google.comafaad3d2013-09-30 15:06:25 +000038 $scope.categories = response.data.categories;
39 $scope.testData = response.data.testData;
epoger@google.comf9d134d2013-09-27 15:02:44 +000040 $scope.sortColumn = 'test';
epoger@google.com5f2bb002013-10-02 18:57:48 +000041
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000042 $scope.hiddenResultTypes = {
43 'failure-ignored': true,
44 'no-comparison': true,
45 'succeeded': true,
46 };
47 $scope.hiddenConfigs = {};
48 $scope.selectedItems = {};
epoger@google.com5f2bb002013-10-02 18:57:48 +000049
50 $scope.updateResults();
epoger@google.comf9d134d2013-09-27 15:02:44 +000051 }
52 );
epoger@google.com5f2bb002013-10-02 18:57:48 +000053
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000054 $scope.isItemSelected = function(index) {
55 return (true == $scope.selectedItems[index]);
56 }
57 $scope.toggleItemSelected = function(index) {
58 if (true == $scope.selectedItems[index]) {
59 delete $scope.selectedItems[index];
60 } else {
61 $scope.selectedItems[index] = true;
62 }
63 // unlike other toggle methods below, does not set
64 // $scope.areUpdatesPending = true;
65 }
66
epoger@google.com5f2bb002013-10-02 18:57:48 +000067 $scope.isHiddenResultType = function(thisResultType) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000068 return (true == $scope.hiddenResultTypes[thisResultType]);
epoger@google.com5f2bb002013-10-02 18:57:48 +000069 }
70 $scope.toggleHiddenResultType = function(thisResultType) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000071 if (true == $scope.hiddenResultTypes[thisResultType]) {
72 delete $scope.hiddenResultTypes[thisResultType];
epoger@google.com5f2bb002013-10-02 18:57:48 +000073 } else {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000074 $scope.hiddenResultTypes[thisResultType] = true;
epoger@google.com5f2bb002013-10-02 18:57:48 +000075 }
76 $scope.areUpdatesPending = true;
77 }
78
79 // TODO(epoger): Rather than maintaining these as hard-coded
80 // variants of isHiddenResultType and toggleHiddenResultType, we
81 // should create general-purpose functions that can work with ANY
82 // category.
83 // But for now, I wanted to see this working. :-)
84 $scope.isHiddenConfig = function(thisConfig) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000085 return (true == $scope.hiddenConfigs[thisConfig]);
epoger@google.com5f2bb002013-10-02 18:57:48 +000086 }
87 $scope.toggleHiddenConfig = function(thisConfig) {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000088 if (true == $scope.hiddenConfigs[thisConfig]) {
89 delete $scope.hiddenConfigs[thisConfig];
epoger@google.com5f2bb002013-10-02 18:57:48 +000090 } else {
epoger@google.com9fb6c8a2013-10-09 18:05:58 +000091 $scope.hiddenConfigs[thisConfig] = true;
epoger@google.com5f2bb002013-10-02 18:57:48 +000092 }
93 $scope.areUpdatesPending = true;
94 }
95
96 $scope.updateResults = function() {
97 $scope.displayLimit = $scope.displayLimitPending;
98 // TODO(epoger): Every time we apply a filter, AngularJS creates
99 // another copy of the array. Is there a way we can filter out
100 // the items as they are displayed, rather than storing multiple
101 // array copies? (For better performance.)
102 $scope.filteredTestData =
epoger@google.com9fb6c8a2013-10-09 18:05:58 +0000103 $filter("orderBy")(
104 $filter("removeHiddenItems")(
105 $scope.testData,
106 $scope.hiddenResultTypes,
107 $scope.hiddenConfigs
108 ),
109 $scope.sortColumn);
epoger@google.com5f2bb002013-10-02 18:57:48 +0000110 $scope.limitedTestData = $filter("limitTo")(
epoger@google.com9fb6c8a2013-10-09 18:05:58 +0000111 $scope.filteredTestData, $scope.displayLimit);
epoger@google.com5f2bb002013-10-02 18:57:48 +0000112 $scope.imageSize = $scope.imageSizePending;
113 $scope.areUpdatesPending = false;
114 }
115
116 $scope.sortResultsBy = function(sortColumn) {
117 $scope.sortColumn = sortColumn;
118 $scope.updateResults();
119 }
epoger@google.comf9d134d2013-09-27 15:02:44 +0000120 }
121);