| 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.extraColumnHeaders and $scope.imagePairs . | 4 * them into $scope.extraColumnHeaders and $scope.imagePairs . |
| 5 */ | 5 */ |
| 6 var Loader = angular.module( | 6 var Loader = angular.module( |
| 7 'Loader', | 7 'Loader', |
| 8 ['ConstantsModule'] | 8 ['ConstantsModule'] |
| 9 ); | 9 ); |
| 10 | 10 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 ] | 23 ] |
| 24 ); | 24 ); |
| 25 | 25 |
| 26 // TODO(epoger): Combine ALL of our filtering operations (including | 26 // TODO(epoger): Combine ALL of our filtering operations (including |
| 27 // truncation) into this one filter, so that runs most efficiently? | 27 // truncation) into this one filter, so that runs most efficiently? |
| 28 // (We would have to make sure truncation still took place after | 28 // (We would have to make sure truncation still took place after |
| 29 // sorting, though.) | 29 // sorting, though.) |
| 30 Loader.filter( | 30 Loader.filter( |
| 31 'removeHiddenImagePairs', | 31 'removeHiddenImagePairs', |
| 32 function(constants) { | 32 function(constants) { |
| 33 return function(unfilteredImagePairs, showingColumnValues, | 33 return function(unfilteredImagePairs, filterableColumnNames, showingColumnVa
lues, |
| 34 builderSubstring, testSubstring, viewingTab) { | 34 viewingTab) { |
| 35 var filteredImagePairs = []; | 35 var filteredImagePairs = []; |
| 36 for (var i = 0; i < unfilteredImagePairs.length; i++) { | 36 for (var i = 0; i < unfilteredImagePairs.length; i++) { |
| 37 var imagePair = unfilteredImagePairs[i]; | 37 var imagePair = unfilteredImagePairs[i]; |
| 38 var extraColumnValues = imagePair[constants.KEY__IMAGEPAIRS__EXTRACOLUMN
S]; | 38 var extraColumnValues = imagePair[constants.KEY__IMAGEPAIRS__EXTRACOLUMN
S]; |
| 39 // For performance, we examine the "set" objects directly rather | 39 var allColumnValuesAreVisible = true; |
| 40 // than calling $scope.isValueInSet(). | 40 // Loop over all columns, and if any of them contain values not found in |
| 41 // Besides, I don't think we have access to $scope in here... | 41 // showingColumnValues[columnName], don't include this imagePair. |
| 42 if (showingColumnValues[constants.KEY__EXTRACOLUMNS__RESULT_TYPE] | 42 // |
| 43 [extraColumnValues[constants.KEY__EXTRACOLUMNS__R
ESULT_TYPE]] && | 43 // We use this same filtering mechanism regardless of whether each colum
n |
| 44 showingColumnValues[constants.KEY__EXTRACOLUMNS__CONFIG] | 44 // has USE_FREEFORM_FILTER set or not; if that flag is set, then we will |
| 45 [extraColumnValues[constants.KEY__EXTRACOLUMNS__C
ONFIG]] && | 45 // have already used the freeform text entry block to populate |
| 46 !(-1 == extraColumnValues[constants.KEY__EXTRACOLUMNS__BUILDER] | 46 // showingColumnValues[columnName]. |
| 47 .indexOf(builderSubstring)) && | 47 for (var j = 0; j < filterableColumnNames.length; j++) { |
| 48 !(-1 == extraColumnValues[constants.KEY__EXTRACOLUMNS__TEST] | 48 var columnName = filterableColumnNames[j]; |
| 49 .indexOf(testSubstring)) && | 49 var columnValue = extraColumnValues[columnName]; |
| 50 (viewingTab == imagePair.tab)) { | 50 if (!showingColumnValues[columnName][columnValue]) { |
| 51 allColumnValuesAreVisible = false; |
| 52 break; |
| 53 } |
| 54 } |
| 55 if (allColumnValuesAreVisible && (viewingTab == imagePair.tab)) { |
| 51 filteredImagePairs.push(imagePair); | 56 filteredImagePairs.push(imagePair); |
| 52 } | 57 } |
| 53 } | 58 } |
| 54 return filteredImagePairs; | 59 return filteredImagePairs; |
| 55 }; | 60 }; |
| 56 } | 61 } |
| 57 ); | 62 ); |
| 58 | 63 |
| 59 /** | 64 /** |
| 60 * Limit the input imagePairs to some max number, and merge identical rows | 65 * Limit the input imagePairs to some max number, and merge identical rows |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 "server is still loading results; will retry at " + | 157 "server is still loading results; will retry at " + |
| 153 $scope.localTimeString(timeToReload / 1000); | 158 $scope.localTimeString(timeToReload / 1000); |
| 154 $timeout( | 159 $timeout( |
| 155 function(){location.reload();}, | 160 function(){location.reload();}, |
| 156 timeToReload - timeNow); | 161 timeToReload - timeNow); |
| 157 } else { | 162 } else { |
| 158 $scope.loadingMessage = "processing data, please wait..."; | 163 $scope.loadingMessage = "processing data, please wait..."; |
| 159 | 164 |
| 160 $scope.header = dataHeader; | 165 $scope.header = dataHeader; |
| 161 $scope.extraColumnHeaders = data[constants.KEY__ROOT__EXTRACOLUMNHEADE
RS]; | 166 $scope.extraColumnHeaders = data[constants.KEY__ROOT__EXTRACOLUMNHEADE
RS]; |
| 167 $scope.orderedColumnNames = data[constants.KEY__ROOT__EXTRACOLUMNORDER
]; |
| 162 $scope.imagePairs = data[constants.KEY__ROOT__IMAGEPAIRS]; | 168 $scope.imagePairs = data[constants.KEY__ROOT__IMAGEPAIRS]; |
| 163 $scope.imageSets = data[constants.KEY__ROOT__IMAGESETS]; | 169 $scope.imageSets = data[constants.KEY__ROOT__IMAGESETS]; |
| 164 $scope.sortColumnSubdict = constants.KEY__IMAGEPAIRS__DIFFERENCES; | 170 $scope.sortColumnSubdict = constants.KEY__IMAGEPAIRS__DIFFERENCES; |
| 165 $scope.sortColumnKey = constants.KEY__DIFFERENCES__PERCEPTUAL_DIFF; | 171 $scope.sortColumnKey = constants.KEY__DIFFERENCES__PERCEPTUAL_DIFF; |
| 166 | 172 |
| 167 $scope.showSubmitAdvancedSettings = false; | 173 $scope.showSubmitAdvancedSettings = false; |
| 168 $scope.submitAdvancedSettings = {}; | 174 $scope.submitAdvancedSettings = {}; |
| 169 $scope.submitAdvancedSettings[ | 175 $scope.submitAdvancedSettings[ |
| 170 constants.KEY__EXPECTATIONS__REVIEWED] = true; | 176 constants.KEY__EXPECTATIONS__REVIEWED] = true; |
| 171 $scope.submitAdvancedSettings[ | 177 $scope.submitAdvancedSettings[ |
| (...skipping 21 matching lines...) Expand all Loading... |
| 193 | 199 |
| 194 // Add index and tab fields to all records. | 200 // Add index and tab fields to all records. |
| 195 for (var i = 0; i < $scope.imagePairs.length; i++) { | 201 for (var i = 0; i < $scope.imagePairs.length; i++) { |
| 196 $scope.imagePairs[i].index = i; | 202 $scope.imagePairs[i].index = i; |
| 197 $scope.imagePairs[i].tab = $scope.defaultTab; | 203 $scope.imagePairs[i].tab = $scope.defaultTab; |
| 198 } | 204 } |
| 199 | 205 |
| 200 // Arrays within which the user can toggle individual elements. | 206 // Arrays within which the user can toggle individual elements. |
| 201 $scope.selectedImagePairs = []; | 207 $scope.selectedImagePairs = []; |
| 202 | 208 |
| 209 // Set up filters. |
| 210 // |
| 211 // filterableColumnNames is a list of all column names we can filter o
n. |
| 203 // allColumnValues[columnName] is a list of all known values | 212 // allColumnValues[columnName] is a list of all known values |
| 204 // for this column. | 213 // for a given column. |
| 205 // showingColumnValues[columnName] is a set indicating which values | 214 // showingColumnValues[columnName] is a set indicating which values |
| 206 // in this column would cause us to show a row, rather than hiding it. | 215 // in a given column would cause us to show a row, rather than hiding
it. |
| 216 // |
| 217 // columnStringMatch[columnName] is a string used as a pattern to gene
rate |
| 218 // showingColumnValues[columnName] for columns we filter using free-fo
rm text. |
| 219 // It is ignored for any columns with USE_FREEFORM_FILTER == false. |
| 220 $scope.filterableColumnNames = []; |
| 207 $scope.allColumnValues = {}; | 221 $scope.allColumnValues = {}; |
| 208 $scope.showingColumnValues = {}; | 222 $scope.showingColumnValues = {}; |
| 223 $scope.columnStringMatch = {}; |
| 209 | 224 |
| 210 // set allColumnValues/showingColumnValues for RESULT_TYPE; | 225 angular.forEach( |
| 226 Object.keys($scope.extraColumnHeaders), |
| 227 function(columnName) { |
| 228 var columnHeader = $scope.extraColumnHeaders[columnName]; |
| 229 if (columnHeader[constants.KEY__EXTRACOLUMNHEADERS__IS_FILTERABLE]
) { |
| 230 $scope.filterableColumnNames.push(columnName); |
| 231 $scope.allColumnValues[columnName] = $scope.columnSliceOf2DArray
( |
| 232 columnHeader[constants.KEY__EXTRACOLUMNHEADERS__VALUES_AND_C
OUNTS], 0); |
| 233 $scope.showingColumnValues[columnName] = {}; |
| 234 $scope.toggleValuesInSet($scope.allColumnValues[columnName], |
| 235 $scope.showingColumnValues[columnName])
; |
| 236 $scope.columnStringMatch[columnName] = ""; |
| 237 } |
| 238 } |
| 239 ); |
| 240 |
| 241 // TODO(epoger): Special handling for RESULT_TYPE column: |
| 211 // by default, show only KEY__RESULT_TYPE__FAILED results | 242 // by default, show only KEY__RESULT_TYPE__FAILED results |
| 212 $scope.allColumnValues[constants.KEY__EXTRACOLUMNS__RESULT_TYPE] = | |
| 213 $scope.columnSliceOf2DArray( | |
| 214 $scope.extraColumnHeaders[constants.KEY__EXTRACOLUMNS__RESULT_
TYPE] | |
| 215 [constants.KEY__EXTRACOLUMNHEADERS__V
ALUES_AND_COUNTS], | |
| 216 0); | |
| 217 $scope.showingColumnValues[constants.KEY__EXTRACOLUMNS__RESULT_TYPE] =
{}; | 243 $scope.showingColumnValues[constants.KEY__EXTRACOLUMNS__RESULT_TYPE] =
{}; |
| 218 $scope.showingColumnValues[constants.KEY__EXTRACOLUMNS__RESULT_TYPE][ | 244 $scope.showingColumnValues[constants.KEY__EXTRACOLUMNS__RESULT_TYPE][ |
| 219 constants.KEY__RESULT_TYPE__FAILED] = true; | 245 constants.KEY__RESULT_TYPE__FAILED] = true; |
| 220 | 246 |
| 221 // set allColumnValues/showingColumnValues for CONFIG; | 247 // Set up mapping for URL parameters. |
| 222 // by default, show results for all configs | 248 // parameter name -> copier object to load/save parameter value |
| 223 $scope.allColumnValues[constants.KEY__EXTRACOLUMNS__CONFIG] = | 249 $scope.queryParameters.map = { |
| 224 $scope.columnSliceOf2DArray( | 250 'resultsToLoad': $scope.queryParameters.copiers.simple, |
| 225 $scope.extraColumnHeaders[constants.KEY__EXTRACOLUMNS__CONFIG] | 251 'displayLimitPending': $scope.queryParameters.copiers.simple, |
| 226 [constants.KEY__EXTRACOLUMNHEADERS__V
ALUES_AND_COUNTS], | 252 'showThumbnailsPending': $scope.queryParameters.copiers.simple, |
| 227 0); | 253 'mergeIdenticalRowsPending': $scope.queryParameters.copiers.simple, |
| 228 $scope.showingColumnValues[constants.KEY__EXTRACOLUMNS__CONFIG] = {}; | 254 'imageSizePending': $scope.queryParameters.copiers.simple, |
| 229 $scope.toggleValuesInSet($scope.allColumnValues[constants.KEY__EXTRACO
LUMNS__CONFIG], | 255 'sortColumnSubdict': $scope.queryParameters.copiers.simple, |
| 230 $scope.showingColumnValues[constants.KEY__EXT
RACOLUMNS__CONFIG]); | 256 'sortColumnKey': $scope.queryParameters.copiers.simple, |
| 231 | 257 }; |
| 232 // Associative array of partial string matches per category. | 258 // Some parameters are handled differently based on whether they USE_F
REEFORM_FILTER. |
| 233 // TODO(epoger): Rename as columnValueMatch to be more consistent | 259 angular.forEach( |
| 234 // with allColumnValues/showingColumnValues ? | 260 $scope.filterableColumnNames, |
| 235 $scope.categoryValueMatch = {}; | 261 function(columnName) { |
| 236 $scope.categoryValueMatch[constants.KEY__EXTRACOLUMNS__BUILDER] = ""; | 262 if ($scope.extraColumnHeaders[columnName] |
| 237 $scope.categoryValueMatch[constants.KEY__EXTRACOLUMNS__TEST] = ""; | 263 [constants.KEY__EXTRACOLUMNHEADERS__USE_FREEFORM_FILTER]) { |
| 264 $scope.queryParameters.map[columnName] = |
| 265 $scope.queryParameters.copiers.columnStringMatch; |
| 266 } else { |
| 267 $scope.queryParameters.map[columnName] = |
| 268 $scope.queryParameters.copiers.showingColumnValuesSet; |
| 269 } |
| 270 } |
| 271 ); |
| 238 | 272 |
| 239 // If any defaults were overridden in the URL, get them now. | 273 // If any defaults were overridden in the URL, get them now. |
| 240 $scope.queryParameters.load(); | 274 $scope.queryParameters.load(); |
| 241 | 275 |
| 242 // Any image URLs which are relative should be relative to the JSON | 276 // Any image URLs which are relative should be relative to the JSON |
| 243 // file's source directory; absolute URLs should be left alone. | 277 // file's source directory; absolute URLs should be left alone. |
| 244 var baseUrlKey = constants.KEY__IMAGESETS__FIELD__BASE_URL; | 278 var baseUrlKey = constants.KEY__IMAGESETS__FIELD__BASE_URL; |
| 245 angular.forEach( | 279 angular.forEach( |
| 246 $scope.imageSets, | 280 $scope.imageSets, |
| 247 function(imageSet) { | 281 function(imageSet) { |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 var value = nameValuePairs[name]; | 418 var value = nameValuePairs[name]; |
| 385 if (value) { | 419 if (value) { |
| 386 $scope[name] = value; | 420 $scope[name] = value; |
| 387 } | 421 } |
| 388 }, | 422 }, |
| 389 'save': function(nameValuePairs, name) { | 423 'save': function(nameValuePairs, name) { |
| 390 nameValuePairs[name] = $scope[name]; | 424 nameValuePairs[name] = $scope[name]; |
| 391 } | 425 } |
| 392 }, | 426 }, |
| 393 | 427 |
| 394 'categoryValueMatch': { | 428 'columnStringMatch': { |
| 395 'load': function(nameValuePairs, name) { | 429 'load': function(nameValuePairs, name) { |
| 396 var value = nameValuePairs[name]; | 430 var value = nameValuePairs[name]; |
| 397 if (value) { | 431 if (value) { |
| 398 $scope.categoryValueMatch[name] = value; | 432 $scope.columnStringMatch[name] = value; |
| 399 } | 433 } |
| 400 }, | 434 }, |
| 401 'save': function(nameValuePairs, name) { | 435 'save': function(nameValuePairs, name) { |
| 402 nameValuePairs[name] = $scope.categoryValueMatch[name]; | 436 nameValuePairs[name] = $scope.columnStringMatch[name]; |
| 403 } | 437 } |
| 404 }, | 438 }, |
| 405 | 439 |
| 406 'showingColumnValuesSet': { | 440 'showingColumnValuesSet': { |
| 407 'load': function(nameValuePairs, name) { | 441 'load': function(nameValuePairs, name) { |
| 408 var value = nameValuePairs[name]; | 442 var value = nameValuePairs[name]; |
| 409 if (value) { | 443 if (value) { |
| 410 var valueArray = value.split(','); | 444 var valueArray = value.split(','); |
| 411 $scope.showingColumnValues[name] = {}; | 445 $scope.showingColumnValues[name] = {}; |
| 412 $scope.toggleValuesInSet(valueArray, $scope.showingColumnValues[name
]); | 446 $scope.toggleValuesInSet(valueArray, $scope.showingColumnValues[name
]); |
| 413 } | 447 } |
| 414 }, | 448 }, |
| 415 'save': function(nameValuePairs, name) { | 449 'save': function(nameValuePairs, name) { |
| 416 nameValuePairs[name] = Object.keys($scope.showingColumnValues[name]).j
oin(','); | 450 nameValuePairs[name] = Object.keys($scope.showingColumnValues[name]).j
oin(','); |
| 417 } | 451 } |
| 418 }, | 452 }, |
| 419 | 453 |
| 420 }; | 454 }; |
| 421 | 455 |
| 422 // parameter name -> copier objects to load/save parameter value | |
| 423 $scope.queryParameters.map = { | |
| 424 'resultsToLoad': $scope.queryParameters.copiers.simple, | |
| 425 'displayLimitPending': $scope.queryParameters.copiers.simple, | |
| 426 'showThumbnailsPending': $scope.queryParameters.copiers.simple, | |
| 427 'mergeIdenticalRowsPending': $scope.queryParameters.copiers.simple, | |
| 428 'imageSizePending': $scope.queryParameters.copiers.simple, | |
| 429 'sortColumnSubdict': $scope.queryParameters.copiers.simple, | |
| 430 'sortColumnKey': $scope.queryParameters.copiers.simple, | |
| 431 }; | |
| 432 $scope.queryParameters.map[constants.KEY__EXTRACOLUMNS__RESULT_TYPE] = | |
| 433 $scope.queryParameters.copiers.showingColumnValuesSet; | |
| 434 $scope.queryParameters.map[constants.KEY__EXTRACOLUMNS__BUILDER] = | |
| 435 $scope.queryParameters.copiers.categoryValueMatch; | |
| 436 $scope.queryParameters.map[constants.KEY__EXTRACOLUMNS__TEST] = | |
| 437 $scope.queryParameters.copiers.categoryValueMatch; | |
| 438 $scope.queryParameters.map[constants.KEY__EXTRACOLUMNS__CONFIG] = | |
| 439 $scope.queryParameters.copiers.showingColumnValuesSet; | |
| 440 | |
| 441 // Loads all parameters into $scope from the URL query string; | 456 // Loads all parameters into $scope from the URL query string; |
| 442 // any which are not found within the URL will keep their current value. | 457 // any which are not found within the URL will keep their current value. |
| 443 $scope.queryParameters.load = function() { | 458 $scope.queryParameters.load = function() { |
| 444 var nameValuePairs = $location.search(); | 459 var nameValuePairs = $location.search(); |
| 445 | 460 |
| 446 // If urlSchemaVersion is not specified, we assume the current version. | 461 // If urlSchemaVersion is not specified, we assume the current version. |
| 447 var urlSchemaVersion = constants.URL_VALUE__SCHEMA_VERSION__CURRENT; | 462 var urlSchemaVersion = constants.URL_VALUE__SCHEMA_VERSION__CURRENT; |
| 448 if (constants.URL_KEY__SCHEMA_VERSION in nameValuePairs) { | 463 if (constants.URL_KEY__SCHEMA_VERSION in nameValuePairs) { |
| 449 urlSchemaVersion = nameValuePairs[constants.URL_KEY__SCHEMA_VERSION]; | 464 urlSchemaVersion = nameValuePairs[constants.URL_KEY__SCHEMA_VERSION]; |
| 450 } else if ('hiddenResultTypes' in nameValuePairs) { | 465 } else if ('hiddenResultTypes' in nameValuePairs) { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 /** | 558 /** |
| 544 * Update the displayed results, based on filters/settings, | 559 * Update the displayed results, based on filters/settings, |
| 545 * and call $scope.queryParameters.save() so that the new filter results | 560 * and call $scope.queryParameters.save() so that the new filter results |
| 546 * can be bookmarked. | 561 * can be bookmarked. |
| 547 */ | 562 */ |
| 548 $scope.updateResults = function() { | 563 $scope.updateResults = function() { |
| 549 $scope.renderStartTime = window.performance.now(); | 564 $scope.renderStartTime = window.performance.now(); |
| 550 $log.debug("renderStartTime: " + $scope.renderStartTime); | 565 $log.debug("renderStartTime: " + $scope.renderStartTime); |
| 551 $scope.displayLimit = $scope.displayLimitPending; | 566 $scope.displayLimit = $scope.displayLimitPending; |
| 552 $scope.mergeIdenticalRows = $scope.mergeIdenticalRowsPending; | 567 $scope.mergeIdenticalRows = $scope.mergeIdenticalRowsPending; |
| 568 |
| 569 // For each USE_FREEFORM_FILTER column, populate showingColumnValues. |
| 570 // This is more efficient than applying the freeform filter within the |
| 571 // tight loop in removeHiddenImagePairs. |
| 572 angular.forEach( |
| 573 $scope.filterableColumnNames, |
| 574 function(columnName) { |
| 575 var columnHeader = $scope.extraColumnHeaders[columnName]; |
| 576 if (columnHeader[constants.KEY__EXTRACOLUMNHEADERS__USE_FREEFORM_FILTE
R]) { |
| 577 var columnStringMatch = $scope.columnStringMatch[columnName]; |
| 578 var showingColumnValues = {}; |
| 579 angular.forEach( |
| 580 $scope.allColumnValues[columnName], |
| 581 function(columnValue) { |
| 582 if (-1 != columnValue.indexOf(columnStringMatch)) { |
| 583 showingColumnValues[columnValue] = true; |
| 584 } |
| 585 } |
| 586 ); |
| 587 $scope.showingColumnValues[columnName] = showingColumnValues; |
| 588 } |
| 589 } |
| 590 ); |
| 591 |
| 553 // TODO(epoger): Every time we apply a filter, AngularJS creates | 592 // TODO(epoger): Every time we apply a filter, AngularJS creates |
| 554 // another copy of the array. Is there a way we can filter out | 593 // another copy of the array. Is there a way we can filter out |
| 555 // the imagePairs as they are displayed, rather than storing multiple | 594 // the imagePairs as they are displayed, rather than storing multiple |
| 556 // array copies? (For better performance.) | 595 // array copies? (For better performance.) |
| 557 | 596 |
| 558 if ($scope.viewingTab == $scope.defaultTab) { | 597 if ($scope.viewingTab == $scope.defaultTab) { |
| 559 | 598 |
| 560 // TODO(epoger): Until we allow the user to reverse sort order, | 599 // TODO(epoger): Until we allow the user to reverse sort order, |
| 561 // there are certain columns we want to sort in a different order. | 600 // there are certain columns we want to sort in a different order. |
| 562 var doReverse = ( | 601 var doReverse = ( |
| 563 ($scope.sortColumnKey == | 602 ($scope.sortColumnKey == |
| 564 constants.KEY__DIFFERENCES__PERCENT_DIFF_PIXELS) || | 603 constants.KEY__DIFFERENCES__PERCENT_DIFF_PIXELS) || |
| 565 ($scope.sortColumnKey == | 604 ($scope.sortColumnKey == |
| 566 constants.KEY__DIFFERENCES__PERCEPTUAL_DIFF)); | 605 constants.KEY__DIFFERENCES__PERCEPTUAL_DIFF)); |
| 567 | 606 |
| 568 $scope.filteredImagePairs = | 607 $scope.filteredImagePairs = |
| 569 $filter("orderBy")( | 608 $filter("orderBy")( |
| 570 $filter("removeHiddenImagePairs")( | 609 $filter("removeHiddenImagePairs")( |
| 571 $scope.imagePairs, | 610 $scope.imagePairs, |
| 611 $scope.filterableColumnNames, |
| 572 $scope.showingColumnValues, | 612 $scope.showingColumnValues, |
| 573 $scope.categoryValueMatch[constants.KEY__EXTRACOLUMNS__BUILD
ER], | |
| 574 $scope.categoryValueMatch[constants.KEY__EXTRACOLUMNS__TEST]
, | |
| 575 $scope.viewingTab | 613 $scope.viewingTab |
| 576 ), | 614 ), |
| 577 [$scope.getSortColumnValue, $scope.getSecondOrderSortValue], | 615 [$scope.getSortColumnValue, $scope.getSecondOrderSortValue], |
| 578 doReverse); | 616 doReverse); |
| 579 $scope.limitedImagePairs = $filter("mergeAndLimit")( | 617 $scope.limitedImagePairs = $filter("mergeAndLimit")( |
| 580 $scope.filteredImagePairs, $scope.displayLimit, $scope.mergeIdentica
lRows); | 618 $scope.filteredImagePairs, $scope.displayLimit, $scope.mergeIdentica
lRows); |
| 581 } else { | 619 } else { |
| 582 $scope.filteredImagePairs = | 620 $scope.filteredImagePairs = |
| 583 $filter("orderBy")( | 621 $filter("orderBy")( |
| 584 $filter("filter")( | 622 $filter("filter")( |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 * adjacent rows as much as possible. | 683 * adjacent rows as much as possible. |
| 646 * | 684 * |
| 647 * @param imagePair: imagePair to get a column value out of. | 685 * @param imagePair: imagePair to get a column value out of. |
| 648 */ | 686 */ |
| 649 $scope.getSecondOrderSortValue = function(imagePair) { | 687 $scope.getSecondOrderSortValue = function(imagePair) { |
| 650 return imagePair[constants.KEY__IMAGEPAIRS__IMAGE_A_URL] + "-vs-" + | 688 return imagePair[constants.KEY__IMAGEPAIRS__IMAGE_A_URL] + "-vs-" + |
| 651 imagePair[constants.KEY__IMAGEPAIRS__IMAGE_B_URL]; | 689 imagePair[constants.KEY__IMAGEPAIRS__IMAGE_B_URL]; |
| 652 } | 690 } |
| 653 | 691 |
| 654 /** | 692 /** |
| 655 * Set $scope.categoryValueMatch[name] = value, and update results. | 693 * Set $scope.columnStringMatch[name] = value, and update results. |
| 656 * | 694 * |
| 657 * @param name | 695 * @param name |
| 658 * @param value | 696 * @param value |
| 659 */ | 697 */ |
| 660 $scope.setCategoryValueMatch = function(name, value) { | 698 $scope.setColumnStringMatch = function(name, value) { |
| 661 $scope.categoryValueMatch[name] = value; | 699 $scope.columnStringMatch[name] = value; |
| 662 $scope.updateResults(); | 700 $scope.updateResults(); |
| 663 } | 701 } |
| 664 | 702 |
| 665 /** | 703 /** |
| 666 * Update $scope.showingColumnValues[columnName] so that ONLY entries with | 704 * Update $scope.showingColumnValues[columnName] and $scope.columnStringMatc
h[columnName] |
| 667 * this columnValue are showing, and update the visible results. | 705 * so that ONLY entries with this columnValue are showing, and update the vi
sible results. |
| 706 * (We update both of those, so we cover both freeform and checkbox filtered
columns.) |
| 668 * | 707 * |
| 669 * @param columnName | 708 * @param columnName |
| 670 * @param columnValue | 709 * @param columnValue |
| 671 */ | 710 */ |
| 672 $scope.showOnlyColumnValue = function(columnName, columnValue) { | 711 $scope.showOnlyColumnValue = function(columnName, columnValue) { |
| 712 $scope.columnStringMatch[columnName] = columnValue; |
| 673 $scope.showingColumnValues[columnName] = {}; | 713 $scope.showingColumnValues[columnName] = {}; |
| 674 $scope.toggleValueInSet(columnValue, $scope.showingColumnValues[columnName
]); | 714 $scope.toggleValueInSet(columnValue, $scope.showingColumnValues[columnName
]); |
| 675 $scope.updateResults(); | 715 $scope.updateResults(); |
| 676 } | 716 } |
| 677 | 717 |
| 678 /** | 718 /** |
| 679 * Update $scope.showingColumnValues[columnName] so that ALL entries are | 719 * Update $scope.showingColumnValues[columnName] and $scope.columnStringMatc
h[columnName] |
| 680 * showing, and update the visible results. | 720 * so that ALL entries are showing, and update the visible results. |
| 721 * (We update both of those, so we cover both freeform and checkbox filtered
columns.) |
| 681 * | 722 * |
| 682 * @param columnName | 723 * @param columnName |
| 683 */ | 724 */ |
| 684 $scope.showAllColumnValues = function(columnName) { | 725 $scope.showAllColumnValues = function(columnName) { |
| 726 $scope.columnStringMatch[columnName] = ""; |
| 685 $scope.showingColumnValues[columnName] = {}; | 727 $scope.showingColumnValues[columnName] = {}; |
| 686 $scope.toggleValuesInSet($scope.allColumnValues[columnName], | 728 $scope.toggleValuesInSet($scope.allColumnValues[columnName], |
| 687 $scope.showingColumnValues[columnName]); | 729 $scope.showingColumnValues[columnName]); |
| 688 $scope.updateResults(); | 730 $scope.updateResults(); |
| 689 } | 731 } |
| 690 | 732 |
| 691 | 733 |
| 692 // | 734 // |
| 693 // Operations for sending info back to the server. | 735 // Operations for sending info back to the server. |
| 694 // | 736 // |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 975 */ | 1017 */ |
| 976 $scope.getImageDiffRelativeUrl = function(imagePair) { | 1018 $scope.getImageDiffRelativeUrl = function(imagePair) { |
| 977 var before = | 1019 var before = |
| 978 imagePair[constants.KEY__IMAGEPAIRS__IMAGE_A_URL] + "-vs-" + | 1020 imagePair[constants.KEY__IMAGEPAIRS__IMAGE_A_URL] + "-vs-" + |
| 979 imagePair[constants.KEY__IMAGEPAIRS__IMAGE_B_URL]; | 1021 imagePair[constants.KEY__IMAGEPAIRS__IMAGE_B_URL]; |
| 980 return before.replace(/[^\w\-]/g, "_") + ".png"; | 1022 return before.replace(/[^\w\-]/g, "_") + ".png"; |
| 981 } | 1023 } |
| 982 | 1024 |
| 983 } | 1025 } |
| 984 ); | 1026 ); |
| OLD | NEW |