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 | |
epoger
2013/10/29 03:25:57
For now, added a TODO here. I think it could be a
| |
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="categoryValueMatch[category] = ''; updateResults()" | |
borenet
2013/10/29 13:56:54
Why not use setCategoryValueMatch()?
epoger
2013/10/29 15:44:58
Done.
| |
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])"> | |
epoger
2013/10/29 03:25:57
Added the (viewingTab != defaultTab) quasi-conditi
| |
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 |