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 |