| OLD | NEW |
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 | 2 |
| 3 <html ng-app="Loader" ng-controller="Loader.Controller"> | 3 <html ng-app="Loader" ng-controller="Loader.Controller"> |
| 4 | 4 |
| 5 <head> | 5 <head> |
| 6 <title ng-bind="windowTitle"></title> | 6 <title ng-bind="windowTitle"></title> |
| 7 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.js"
></script> | 7 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.js"
></script> |
| 8 <script src="loader.js"></script> | 8 <script src="loader.js"></script> |
| 9 <link rel="stylesheet" href="view.css"> | 9 <link rel="stylesheet" href="view.css"> |
| 10 </head> | 10 </head> |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 <p> | 26 <p> |
| 27 TODO(epoger): | 27 TODO(epoger): |
| 28 <input type="checkbox" ng-model="showTodos"> | 28 <input type="checkbox" ng-model="showTodos"> |
| 29 show | 29 show |
| 30 <ul ng-hide="!showTodos"> | 30 <ul ng-hide="!showTodos"> |
| 31 <li> | 31 <li> |
| 32 If server was run with --reload flag, automatically check for | 32 If server was run with --reload flag, automatically check for |
| 33 new results and tell the user when new results are available | 33 new results and tell the user when new results are available |
| 34 (the user can reload the page if he wants to see them). | 34 (the user can reload the page if he wants to see them). |
| 35 </li><li> | 35 </li><li> |
| 36 Add ability to filter builder and test names | |
| 37 (using a free-form text field, with partial string match) | |
| 38 </li><li> | |
| 39 Add pixel diffs, and sorting by percentage of different pixels | 36 Add pixel diffs, and sorting by percentage of different pixels |
| 40 </li><li> | 37 </li><li> |
| 41 Add ability to sort/filter by reviewed-by-human. Depends on | 38 Add ability to sort/filter by reviewed-by-human. Depends on |
| 42 <a href="https://code.google.com/p/skia/issues/detail?id=1758"> | 39 <a href="https://code.google.com/p/skia/issues/detail?id=1758"> |
| 43 bug 1758 | 40 bug 1758 |
| 44 </a> | 41 </a> |
| 45 ('rebaseline_server: make the "categories" struct passed from server t
o client a list instead of a dict') | 42 ('rebaseline_server: make the "categories" struct passed from server t
o client a list instead of a dict') |
| 46 </li><li> | 43 </li><li> |
| 47 Improve the column sorting, as per | 44 Improve the column sorting, as per |
| 48 <a href="http://jsfiddle.net/vojtajina/js64b/14/"> | 45 <a href="http://jsfiddle.net/vojtajina/js64b/14/"> |
| 49 http://jsfiddle.net/vojtajina/js64b/14/ | 46 http://jsfiddle.net/vojtajina/js64b/14/ |
| 50 </a> | 47 </a> |
| 51 </li><li> | 48 </li><li> |
| 49 For the text-filtered categories, allow regular expression matching |
| 50 (or Unix-style wildcard matching) instead of simple substring match? |
| 51 <!-- In order to do this efficiently, we should probably do the |
| 52 expression matching over the list of categories returned, |
| 53 use that to generate a list of category values that fulfill the |
| 54 regex, and when filtering the results just look for category |
| 55 values within that list. --> |
| 56 </li><li> |
| 52 Right now, if you change which column is used to | 57 Right now, if you change which column is used to |
| 53 sort the data, the column widths may fluctuate based on the | 58 sort the data, the column widths may fluctuate based on the |
| 54 longest string <i>currently visible</i> within the top {{displayLimit}
} | 59 longest string <i>currently visible</i> within the top {{displayLimit}
} |
| 55 results. Can we fix the column widths to be wide enough to hold | 60 results. Can we fix the column widths to be wide enough to hold |
| 56 any result, even the currently hidden results? | 61 any result, even the currently hidden results? |
| 57 </li> | 62 </li> |
| 58 </ul> | 63 </ul> |
| 59 </div><!-- TODOs --> | 64 </div><!-- TODOs --> |
| 60 | 65 |
| 61 <div ng-hide="!(header.timeUpdated)"> | 66 <div ng-hide="!(header.timeUpdated)"> |
| (...skipping 11 matching lines...) Expand all Loading... |
| 73 </div> | 78 </div> |
| 74 </div> | 79 </div> |
| 75 </div><!-- tabs --> | 80 </div><!-- tabs --> |
| 76 | 81 |
| 77 <div class="tab-main"><!-- main display area of selected tab --> | 82 <div class="tab-main"><!-- main display area of selected tab --> |
| 78 | 83 |
| 79 <br> | 84 <br> |
| 80 <!-- We only show the filters/settings table on the Unfiled tab. --> | 85 <!-- We only show the filters/settings table on the Unfiled tab. --> |
| 81 <table ng-hide="viewingTab != defaultTab" border="1"> | 86 <table ng-hide="viewingTab != defaultTab" border="1"> |
| 82 <tr> | 87 <tr> |
| 83 <th colspan="2"> | 88 <th colspan="4"> |
| 84 Filters | 89 Filters |
| 85 </th> | 90 </th> |
| 86 <th> | 91 <th> |
| 87 Settings | 92 Settings |
| 88 </th> | 93 </th> |
| 89 </tr> | 94 </tr> |
| 90 <tr valign="top"> | 95 <tr valign="top"> |
| 91 <!-- TODO(epoger): make this an ng-repeat over resultType, config, etc? --
> | 96 <!-- TODO(epoger): make this an ng-repeat over resultType, config, etc? --
> |
| 92 <td> | 97 <td> |
| 93 resultType<br> | 98 resultType<br> |
| 94 <label ng-repeat="(resultType, count) in categories['resultType'] track
by $index"> | 99 <label ng-repeat="(resultType, count) in categories['resultType'] track
by $index"> |
| 95 <input type="checkbox" | 100 <input type="checkbox" |
| 96 name="resultTypes" | 101 name="resultTypes" |
| 97 value="{{resultType}}" | 102 value="{{resultType}}" |
| 98 ng-checked="!isValueInSet(resultType, hiddenResultTypes)" | 103 ng-checked="!isValueInSet(resultType, hiddenResultTypes)" |
| 99 ng-click="toggleValueInSet(resultType, hiddenResultTypes); setU
pdatesPending(true)"> | 104 ng-click="toggleValueInSet(resultType, hiddenResultTypes); setU
pdatesPending(true)"> |
| 100 {{resultType}} ({{count}})<br> | 105 {{resultType}} ({{count}})<br> |
| 101 </label> | 106 </label> |
| 107 <button ng-click="hiddenResultTypes = {}; updateResults()"> |
| 108 all |
| 109 </button> |
| 110 <button ng-click="hiddenResultTypes = {}; toggleValuesInSet(allResultTyp
es, hiddenResultTypes); updateResults()"> |
| 111 none |
| 112 </button> |
| 113 <button ng-click="toggleValuesInSet(allResultTypes, hiddenResultTypes);
updateResults()"> |
| 114 toggle |
| 115 </button> |
| 116 </td> |
| 117 <td ng-repeat="category in ['builder', 'test']"> |
| 118 {{category}} |
| 119 <br> |
| 120 <input type="text" |
| 121 ng-model="categoryValueMatch[category]" |
| 122 ng-change="setUpdatesPending(true)"/> |
| 123 <br> |
| 124 <button ng-click="setCategoryValueMatch(category, '')" |
| 125 ng-disabled="('' == categoryValueMatch[category])"> |
| 126 clear (show all) |
| 127 </button> |
| 102 </td> | 128 </td> |
| 103 <td> | 129 <td> |
| 104 config<br> | 130 config<br> |
| 105 <label ng-repeat="(config, count) in categories['config'] track by $inde
x"> | 131 <label ng-repeat="(config, count) in categories['config'] track by $inde
x"> |
| 106 <input type="checkbox" | 132 <input type="checkbox" |
| 107 name="configs" | 133 name="configs" |
| 108 value="{{config}}" | 134 value="{{config}}" |
| 109 ng-checked="!isValueInSet(config, hiddenConfigs)" | 135 ng-checked="!isValueInSet(config, hiddenConfigs)" |
| 110 ng-click="toggleValueInSet(config, hiddenConfigs); setUpdatesPe
nding(true)"> | 136 ng-click="toggleValueInSet(config, hiddenConfigs); setUpdatesPe
nding(true)"> |
| 111 {{config}} ({{count}})<br> | 137 {{config}} ({{count}})<br> |
| 112 </label> | 138 </label> |
| 139 <button ng-click="hiddenConfigs = {}; updateResults()"> |
| 140 all |
| 141 </button> |
| 142 <button ng-click="hiddenConfigs = {}; toggleValuesInSet(allConfigs, hidd
enConfigs); updateResults()"> |
| 143 none |
| 144 </button> |
| 145 <button ng-click="toggleValuesInSet(allConfigs, hiddenConfigs); updateRe
sults()"> |
| 146 toggle |
| 147 </button> |
| 113 </td> | 148 </td> |
| 114 <td><table> | 149 <td><table> |
| 115 <tr><td> | 150 <tr><td> |
| 116 Image size | 151 Image size |
| 117 <input type="text" ng-model="imageSizePending" | 152 <input type="text" ng-model="imageSizePending" |
| 118 ng-init="imageSizePending=100" | 153 ng-init="imageSizePending=100" |
| 119 ng-change="areUpdatesPending = true" | 154 ng-change="areUpdatesPending = true" |
| 120 maxlength="4"/> | 155 maxlength="4"/> |
| 121 </td></tr> | 156 </td></tr> |
| 122 <tr><td> | 157 <tr><td> |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 name="sortColumnRadio" | 279 name="sortColumnRadio" |
| 245 value="actualHashDigest" | 280 value="actualHashDigest" |
| 246 ng-checked="(sortColumn == 'actualHashDigest')" | 281 ng-checked="(sortColumn == 'actualHashDigest')" |
| 247 ng-click="sortResultsBy('actualHashDigest')"> | 282 ng-click="sortResultsBy('actualHashDigest')"> |
| 248 actual image | 283 actual image |
| 249 </th> | 284 </th> |
| 250 <th> | 285 <th> |
| 251 <!-- item-selection checkbox column --> | 286 <!-- item-selection checkbox column --> |
| 252 </th> | 287 </th> |
| 253 </tr> | 288 </tr> |
| 289 |
| 290 <!-- For most columns... if the user clicks on the cell, and we are on |
| 291 the default tab, update the filter to only show results with the |
| 292 same value for this category. |
| 293 This is made a bit tricky by the fact that AngularJS expressions |
| 294 do not allow control flow statements. See |
| 295 http://docs.angularjs.org/guide/expression --> |
| 254 <tr ng-repeat="result in limitedTestData"> | 296 <tr ng-repeat="result in limitedTestData"> |
| 255 <td ng-repeat="categoryName in ['resultType', 'builder', 'test', 'conf
ig']"> | 297 <td ng-click="(viewingTab != defaultTab) || showOnlyResultType(result.
resultType)"> |
| 298 {{result.resultType}} |
| 299 </td> |
| 300 <td ng-repeat="categoryName in ['builder', 'test']" |
| 301 ng-click="(viewingTab != defaultTab) || setCategoryValueMatch(cate
goryName, result[categoryName])"> |
| 256 {{result[categoryName]}} | 302 {{result[categoryName]}} |
| 257 </td> | 303 </td> |
| 304 <td ng-click="(viewingTab != defaultTab) || showOnlyConfig(result.conf
ig)"> |
| 305 {{result.config}} |
| 306 </td> |
| 258 <td> | 307 <td> |
| 259 <a ng-repeat="bug in result['bugs']" | 308 <a ng-repeat="bug in result['bugs']" |
| 260 href="https://code.google.com/p/skia/issues/detail?id={{bug}}" | 309 href="https://code.google.com/p/skia/issues/detail?id={{bug}}" |
| 261 target="_blank"> | 310 target="_blank"> |
| 262 {{bug}} | 311 {{bug}} |
| 263 </a> | 312 </a> |
| 264 </td> | 313 </td> |
| 265 <td> | 314 <td> |
| 266 <a target="_blank" href="http://chromium-skia-gm.commondatastorage.g
oogleapis.com/gm/{{result.expectedHashType}}/{{result.test}}/{{result.expectedHa
shDigest}}.png"> | 315 <a target="_blank" href="http://chromium-skia-gm.commondatastorage.g
oogleapis.com/gm/{{result.expectedHashType}}/{{result.test}}/{{result.expectedHa
shDigest}}.png"> |
| 267 <img width="{{imageSize}}" src="http://chromium-skia-gm.commondata
storage.googleapis.com/gm/{{result.expectedHashType}}/{{result.test}}/{{result.e
xpectedHashDigest}}.png"/> | 316 <img width="{{imageSize}}" src="http://chromium-skia-gm.commondata
storage.googleapis.com/gm/{{result.expectedHashType}}/{{result.test}}/{{result.e
xpectedHashDigest}}.png"/> |
| (...skipping 18 matching lines...) Expand all Loading... |
| 286 <!-- TODO(epoger): Can we get the base URLs (commondatastorage and | 335 <!-- TODO(epoger): Can we get the base URLs (commondatastorage and |
| 287 issues list) from | 336 issues list) from |
| 288 http://skia.googlecode.com/svn/buildbot/site_config/global_variables.json | 337 http://skia.googlecode.com/svn/buildbot/site_config/global_variables.json |
| 289 ? I tried importing the | 338 ? I tried importing the |
| 290 http://skia.googlecode.com/svn/buildbot/skia_tools.js script and using | 339 http://skia.googlecode.com/svn/buildbot/skia_tools.js script and using |
| 291 that to do so, but I got Access-Control-Allow-Origin errors. | 340 that to do so, but I got Access-Control-Allow-Origin errors. |
| 292 --> | 341 --> |
| 293 | 342 |
| 294 </body> | 343 </body> |
| 295 </html> | 344 </html> |
| OLD | NEW |