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 |