OLD | NEW |
1 /* | 1 /* |
2 * Loader: | 2 * Loader: |
3 * Reads GM result reports written out by results.py, and imports | 3 * Reads GM result reports written out by results.py, and imports |
4 * them into $scope.categories and $scope.testData . | 4 * them into $scope.categories and $scope.testData . |
5 */ | 5 */ |
6 var Loader = angular.module( | 6 var Loader = angular.module( |
7 'Loader', | 7 'Loader', |
8 [] | 8 [] |
9 ); | 9 ); |
10 | 10 |
11 | 11 |
12 // TODO(epoger): Combine ALL of our filtering operations (including | 12 // TODO(epoger): Combine ALL of our filtering operations (including |
13 // truncation) into this one filter, so that runs most efficiently? | 13 // truncation) into this one filter, so that runs most efficiently? |
14 // (We would have to make sure truncation still took place after | 14 // (We would have to make sure truncation still took place after |
15 // sorting, though.) | 15 // sorting, though.) |
16 Loader.filter( | 16 Loader.filter( |
17 'removeHiddenItems', | 17 'removeHiddenItems', |
18 function() { | 18 function() { |
19 return function(unfilteredItems, hiddenResultTypes, hiddenConfigs, | 19 return function(unfilteredItems, hiddenResultTypes, hiddenConfigs, |
20 viewingTab) { | 20 builderSubstring, testSubstring, viewingTab) { |
21 var filteredItems = []; | 21 var filteredItems = []; |
22 for (var i = 0; i < unfilteredItems.length; i++) { | 22 for (var i = 0; i < unfilteredItems.length; i++) { |
23 var item = unfilteredItems[i]; | 23 var item = unfilteredItems[i]; |
24 // For performance, we examine the "set" objects directly rather | 24 // For performance, we examine the "set" objects directly rather |
25 // than calling $scope.isValueInSet(). | 25 // than calling $scope.isValueInSet(). |
26 // Besides, I don't think we have access to $scope in here... | 26 // Besides, I don't think we have access to $scope in here... |
27 if (!(true == hiddenResultTypes[item.resultType]) && | 27 if (!(true == hiddenResultTypes[item.resultType]) && |
28 !(true == hiddenConfigs[item.config]) && | 28 !(true == hiddenConfigs[item.config]) && |
| 29 !(-1 == item.builder.indexOf(builderSubstring)) && |
| 30 !(-1 == item.test.indexOf(testSubstring)) && |
29 (viewingTab == item.tab)) { | 31 (viewingTab == item.tab)) { |
30 filteredItems.push(item); | 32 filteredItems.push(item); |
31 } | 33 } |
32 } | 34 } |
33 return filteredItems; | 35 return filteredItems; |
34 }; | 36 }; |
35 } | 37 } |
36 ); | 38 ); |
37 | 39 |
38 | 40 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 | 94 |
93 // Arrays within which the user can toggle individual elements. | 95 // Arrays within which the user can toggle individual elements. |
94 $scope.selectedItems = []; | 96 $scope.selectedItems = []; |
95 | 97 |
96 // Sets within which the user can toggle individual elements. | 98 // Sets within which the user can toggle individual elements. |
97 $scope.hiddenResultTypes = { | 99 $scope.hiddenResultTypes = { |
98 'failure-ignored': true, | 100 'failure-ignored': true, |
99 'no-comparison': true, | 101 'no-comparison': true, |
100 'succeeded': true, | 102 'succeeded': true, |
101 }; | 103 }; |
| 104 $scope.allResultTypes = Object.keys(data.categories['resultType']); |
102 $scope.hiddenConfigs = {}; | 105 $scope.hiddenConfigs = {}; |
| 106 $scope.allConfigs = Object.keys(data.categories['config']); |
| 107 |
| 108 // Associative array of partial string matches per category. |
| 109 $scope.categoryValueMatch = {}; |
| 110 $scope.categoryValueMatch.builder = ""; |
| 111 $scope.categoryValueMatch.test = ""; |
103 | 112 |
104 $scope.updateResults(); | 113 $scope.updateResults(); |
105 $scope.loadingMessage = ""; | 114 $scope.loadingMessage = ""; |
106 $scope.windowTitle = "Current GM Results"; | 115 $scope.windowTitle = "Current GM Results"; |
107 } | 116 } |
108 ).error( | 117 ).error( |
109 function(data, status, header, config) { | 118 function(data, status, header, config) { |
110 $scope.loadingMessage = "Failed to load results of type '" | 119 $scope.loadingMessage = "Failed to load results of type '" |
111 + resultsToLoad + "'"; | 120 + resultsToLoad + "'"; |
112 $scope.windowTitle = "Failed to Load GM Results"; | 121 $scope.windowTitle = "Failed to Load GM Results"; |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 // the items as they are displayed, rather than storing multiple | 241 // the items as they are displayed, rather than storing multiple |
233 // array copies? (For better performance.) | 242 // array copies? (For better performance.) |
234 | 243 |
235 if ($scope.viewingTab == $scope.defaultTab) { | 244 if ($scope.viewingTab == $scope.defaultTab) { |
236 $scope.filteredTestData = | 245 $scope.filteredTestData = |
237 $filter("orderBy")( | 246 $filter("orderBy")( |
238 $filter("removeHiddenItems")( | 247 $filter("removeHiddenItems")( |
239 $scope.testData, | 248 $scope.testData, |
240 $scope.hiddenResultTypes, | 249 $scope.hiddenResultTypes, |
241 $scope.hiddenConfigs, | 250 $scope.hiddenConfigs, |
| 251 $scope.categoryValueMatch.builder, |
| 252 $scope.categoryValueMatch.test, |
242 $scope.viewingTab | 253 $scope.viewingTab |
243 ), | 254 ), |
244 $scope.sortColumn); | 255 $scope.sortColumn); |
245 $scope.limitedTestData = $filter("limitTo")( | 256 $scope.limitedTestData = $filter("limitTo")( |
246 $scope.filteredTestData, $scope.displayLimit); | 257 $scope.filteredTestData, $scope.displayLimit); |
247 } else { | 258 } else { |
248 $scope.filteredTestData = | 259 $scope.filteredTestData = |
249 $filter("orderBy")( | 260 $filter("orderBy")( |
250 $filter("filter")( | 261 $filter("filter")( |
251 $scope.testData, | 262 $scope.testData, |
(...skipping 10 matching lines...) Expand all Loading... |
262 /** | 273 /** |
263 * Re-sort the displayed results. | 274 * Re-sort the displayed results. |
264 * | 275 * |
265 * @param sortColumn (string): name of the column to sort on | 276 * @param sortColumn (string): name of the column to sort on |
266 */ | 277 */ |
267 $scope.sortResultsBy = function(sortColumn) { | 278 $scope.sortResultsBy = function(sortColumn) { |
268 $scope.sortColumn = sortColumn; | 279 $scope.sortColumn = sortColumn; |
269 $scope.updateResults(); | 280 $scope.updateResults(); |
270 } | 281 } |
271 | 282 |
| 283 /** |
| 284 * Set $scope.categoryValueMatch[name] = value, and update results. |
| 285 * |
| 286 * @param name |
| 287 * @param value |
| 288 */ |
| 289 $scope.setCategoryValueMatch = function(name, value) { |
| 290 $scope.categoryValueMatch[name] = value; |
| 291 $scope.updateResults(); |
| 292 } |
| 293 |
| 294 /** |
| 295 * Update $scope.hiddenResultTypes so that ONLY this resultType is showing, |
| 296 * and update the visible results. |
| 297 * |
| 298 * @param resultType |
| 299 */ |
| 300 $scope.showOnlyResultType = function(resultType) { |
| 301 $scope.hiddenResultTypes = {}; |
| 302 // TODO(epoger): Maybe change $scope.allResultTypes to be a Set like |
| 303 // $scope.hiddenResultTypes (rather than an array), so this operation is |
| 304 // simpler (just assign or add allResultTypes to hiddenResultTypes). |
| 305 $scope.toggleValuesInSet($scope.allResultTypes, $scope.hiddenResultTypes); |
| 306 $scope.toggleValueInSet(resultType, $scope.hiddenResultTypes); |
| 307 $scope.updateResults(); |
| 308 } |
| 309 |
| 310 /** |
| 311 * Update $scope.hiddenConfigs so that ONLY this config is showing, |
| 312 * and update the visible results. |
| 313 * |
| 314 * @param config |
| 315 */ |
| 316 $scope.showOnlyConfig = function(config) { |
| 317 $scope.hiddenConfigs = {}; |
| 318 $scope.toggleValuesInSet($scope.allConfigs, $scope.hiddenConfigs); |
| 319 $scope.toggleValueInSet(config, $scope.hiddenConfigs); |
| 320 $scope.updateResults(); |
| 321 } |
| 322 |
272 | 323 |
273 // | 324 // |
274 // Operations for sending info back to the server. | 325 // Operations for sending info back to the server. |
275 // | 326 // |
276 | 327 |
277 /** | 328 /** |
278 * Tell the server that the actual results of these particular tests | 329 * Tell the server that the actual results of these particular tests |
279 * are acceptable. | 330 * are acceptable. |
280 * | 331 * |
281 * @param testDataSubset an array of test results, most likely a subset of | 332 * @param testDataSubset an array of test results, most likely a subset of |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 * @param set an Object which we use to mimic set semantics | 436 * @param set an Object which we use to mimic set semantics |
386 */ | 437 */ |
387 $scope.toggleValueInSet = function(value, set) { | 438 $scope.toggleValueInSet = function(value, set) { |
388 if (true == set[value]) { | 439 if (true == set[value]) { |
389 delete set[value]; | 440 delete set[value]; |
390 } else { | 441 } else { |
391 set[value] = true; | 442 set[value] = true; |
392 } | 443 } |
393 } | 444 } |
394 | 445 |
| 446 /** |
| 447 * For each value in valueArray, call toggleValueInSet(value, set). |
| 448 * |
| 449 * @param valueArray |
| 450 * @param set |
| 451 */ |
| 452 $scope.toggleValuesInSet = function(valueArray, set) { |
| 453 var arrayLength = valueArray.length; |
| 454 for (var i = 0; i < arrayLength; i++) { |
| 455 $scope.toggleValueInSet(valueArray[i], set); |
| 456 } |
| 457 } |
| 458 |
395 | 459 |
396 // | 460 // |
397 // Array operations; similar to our Set operations, but operate on a | 461 // Array operations; similar to our Set operations, but operate on a |
398 // Javascript Array so we *can* easily get a list of all values in the Set. | 462 // Javascript Array so we *can* easily get a list of all values in the Set. |
399 // TODO(epoger): move into a separate .js file? | 463 // TODO(epoger): move into a separate .js file? |
400 // | 464 // |
401 | 465 |
402 /** | 466 /** |
403 * Returns true if value "value" is present within array "array". | 467 * Returns true if value "value" is present within array "array". |
404 * | 468 * |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 * | 501 * |
438 * @param secondsPastEpoch (numeric): seconds past epoch in UTC | 502 * @param secondsPastEpoch (numeric): seconds past epoch in UTC |
439 */ | 503 */ |
440 $scope.localTimeString = function(secondsPastEpoch) { | 504 $scope.localTimeString = function(secondsPastEpoch) { |
441 var d = new Date(secondsPastEpoch * 1000); | 505 var d = new Date(secondsPastEpoch * 1000); |
442 return d.toString(); | 506 return d.toString(); |
443 } | 507 } |
444 | 508 |
445 } | 509 } |
446 ); | 510 ); |
OLD | NEW |