OLD | NEW |
| (Empty) |
1 <!DOCTYPE html> | |
2 | |
3 <html ng-app="Loader" ng-controller="Loader.Controller"> | |
4 | |
5 <head> | |
6 <title ng-bind="windowTitle"></title> | |
7 <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></scr
ipt> | |
8 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.20/angular.js
"></script> | |
9 <script src="constants.js"></script> | |
10 <script src="loader.js"></script> | |
11 <script src="utils.js"></script> | |
12 <link rel="stylesheet" href="view.css"> | |
13 </head> | |
14 | |
15 <body> | |
16 <h2> | |
17 Instructions, roadmap, etc. are at | |
18 <a href="http://tinyurl.com/SkiaRebaselineServer"> | |
19 http://tinyurl.com/SkiaRebaselineServer | |
20 </a> | |
21 </h2> | |
22 | |
23 <em ng-show="!readyToDisplay"> | |
24 Loading results from <a href="{{resultsToLoad}}">{{resultsToLoad}}</a> ... | |
25 {{loadingMessage}} | |
26 </em> | |
27 | |
28 <div ng-show="readyToDisplay"> | |
29 | |
30 <div class="warning-div" | |
31 ng-show="urlSchemaVersionLoaded != constants.URL_VALUE__SCHEMA_VERSION_
_CURRENT"> | |
32 WARNING! The URL you loaded used schema version {{urlSchemaVersionLoaded}
}, rather than | |
33 the most recent version {{constants.URL_VALUE__SCHEMA_VERSION__CURRENT}}.
It has been | |
34 converted to the most recent version on a best-effort basis; you may wish
to double-check | |
35 which records are displayed. | |
36 </div> | |
37 | |
38 <div class="warning-div" | |
39 ng-show="header[constants.KEY__HEADER__IS_EDITABLE] && header[constants
.KEY__HEADER__IS_EXPORTED]"> | |
40 WARNING! These results are editable and exported, so any user | |
41 who can connect to this server over the network can modify them. | |
42 </div> | |
43 | |
44 <div ng-show="header[constants.KEY__HEADER__TIME_UPDATED]"> | |
45 These results, from raw JSON file | |
46 <a href="{{resultsToLoad}}">{{resultsToLoad}}</a>, current as of | |
47 {{localTimeString(header[constants.KEY__HEADER__TIME_UPDATED])}} | |
48 <br> | |
49 To see other sets of results (all results, failures only, etc.), | |
50 <a href="/">click here</a> | |
51 </div> | |
52 | |
53 <div class="tab-wrapper"><!-- tabs --> | |
54 <div class="tab-spacer" ng-repeat="tab in tabs"> | |
55 <div class="tab tab-{{tab == viewingTab}}" | |
56 ng-click="setViewingTab(tab)"> | |
57 {{tab}} ({{numResultsPerTab[tab]}}) | |
58 </div> | |
59 <div class="tab-spacer"> | |
60 | |
61 </div> | |
62 </div> | |
63 </div><!-- tabs --> | |
64 | |
65 <div class="tab-main"><!-- main display area of selected tab --> | |
66 | |
67 <br> | |
68 <!-- We only show the filters/settings table on the Unfiled tab. --> | |
69 <table ng-show="viewingTab == defaultTab" border="1"> | |
70 <tr> | |
71 <th colspan="4"> | |
72 Filters | |
73 </th> | |
74 <th> | |
75 Settings | |
76 </th> | |
77 </tr> | |
78 <tr valign="top"> | |
79 | |
80 <!-- filters --> | |
81 <td ng-repeat="columnName in orderedColumnNames"> | |
82 | |
83 <!-- Only display filterable columns here... --> | |
84 <div ng-if="extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMNHEA
DERS__IS_FILTERABLE]"> | |
85 {{extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMNHEADERS__HE
ADER_TEXT]}}<br> | |
86 | |
87 <!-- If we filter this column using free-form text match... --> | |
88 <div ng-if="extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMNH
EADERS__USE_FREEFORM_FILTER]"> | |
89 <input type="text" | |
90 ng-model="columnStringMatch[columnName]" | |
91 ng-change="setUpdatesPending(true)"/> | |
92 <br> | |
93 <button ng-click="setColumnStringMatch(columnName, '')" | |
94 ng-disabled="('' == columnStringMatch[columnName])"> | |
95 clear (show all) | |
96 </button> | |
97 </div> | |
98 | |
99 <!-- If we filter this column using checkboxes... --> | |
100 <div ng-if="!extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMN
HEADERS__USE_FREEFORM_FILTER]"> | |
101 <label ng-repeat="valueAndCount in extraColumnHeaders[columnName][co
nstants.KEY__EXTRACOLUMNHEADERS__VALUES_AND_COUNTS]"> | |
102 <input type="checkbox" | |
103 name="resultTypes" | |
104 value="{{valueAndCount[0]}}" | |
105 ng-checked="isValueInSet(valueAndCount[0], showingColumnVal
ues[columnName])" | |
106 ng-click="toggleValueInSet(valueAndCount[0], showingColumnV
alues[columnName]); setUpdatesPending(true)"> | |
107 {{valueAndCount[0]}} ({{valueAndCount[1]}})<br> | |
108 </label> | |
109 <button ng-click="showingColumnValues[columnName] = {}; toggleValues
InSet(allColumnValues[columnName], showingColumnValues[columnName]); updateResul
ts()" | |
110 ng-disabled="!readyToDisplay || allColumnValues[columnName].
length == setSize(showingColumnValues[columnName])"> | |
111 all | |
112 </button> | |
113 <button ng-click="showingColumnValues[columnName] = {}; updateResult
s()" | |
114 ng-disabled="!readyToDisplay || 0 == setSize(showingColumnVa
lues[columnName])"> | |
115 none | |
116 </button> | |
117 <button ng-click="toggleValuesInSet(allColumnValues[columnName], sho
wingColumnValues[columnName]); updateResults()"> | |
118 toggle | |
119 </button> | |
120 </div> | |
121 | |
122 </div> | |
123 </td> | |
124 | |
125 <!-- settings --> | |
126 <td><table> | |
127 <tr><td> | |
128 <input type="checkbox" ng-model="showThumbnailsPending" | |
129 ng-init="showThumbnailsPending = true" | |
130 ng-change="areUpdatesPending = true"/> | |
131 Show thumbnails | |
132 </td></tr> | |
133 <tr><td> | |
134 <input type="checkbox" ng-model="mergeIdenticalRowsPending" | |
135 ng-init="mergeIdenticalRowsPending = true" | |
136 ng-change="areUpdatesPending = true"/> | |
137 Merge identical rows | |
138 </td></tr> | |
139 <tr><td> | |
140 Image width | |
141 <input type="text" ng-model="imageSizePending" | |
142 ng-init="imageSizePending=100" | |
143 ng-change="areUpdatesPending = true" | |
144 maxlength="4"/> | |
145 </td></tr> | |
146 <tr><td> | |
147 Max records to display | |
148 <input type="text" ng-model="displayLimitPending" | |
149 ng-init="displayLimitPending=50" | |
150 ng-change="areUpdatesPending = true" | |
151 maxlength="4"/> | |
152 </td></tr> | |
153 <tr><td> | |
154 <button class="update-results-button" | |
155 ng-click="updateResults()" | |
156 ng-disabled="!areUpdatesPending"> | |
157 Update Results | |
158 </button> | |
159 </td></tr> | |
160 </tr></table></td> | |
161 </tr> | |
162 </table> | |
163 | |
164 <p> | |
165 | |
166 <!-- Submission UI that we only show in the Pending Approval tab. --> | |
167 <div ng-show="'Pending Approval' == viewingTab"> | |
168 <div style="display:inline-block"> | |
169 <button style="font-size:20px" | |
170 ng-click="submitApprovals(filteredImagePairs)" | |
171 ng-disabled="submitPending || (filteredImagePairs.length == 0)
"> | |
172 Update these {{filteredImagePairs.length}} expectations on the serve
r | |
173 </button> | |
174 </div> | |
175 <div style="display:inline-block"> | |
176 <div style="font-size:20px" | |
177 ng-show="submitPending"> | |
178 Submitting, please wait... | |
179 </div> | |
180 </div> | |
181 <div> | |
182 Advanced settings... | |
183 <input type="checkbox" ng-model="showSubmitAdvancedSettings"> | |
184 show | |
185 <ul ng-show="showSubmitAdvancedSettings"> | |
186 <li ng-repeat="setting in [constants.KEY__EXPECTATIONS__REVIEWED, co
nstants.KEY__EXPECTATIONS__IGNOREFAILURE]"> | |
187 {{setting}} | |
188 <input type="checkbox" ng-model="submitAdvancedSettings[setting]"> | |
189 </li> | |
190 <li ng-repeat="setting in ['bug']"> | |
191 {{setting}} | |
192 <input type="text" ng-model="submitAdvancedSettings[setting]"> | |
193 </li> | |
194 </ul> | |
195 </div> | |
196 </div> | |
197 | |
198 <p> | |
199 | |
200 <div class="results-header"> <!-- results header --> | |
201 <div class="results-header-actions"> | |
202 all tests shown: | |
203 <button ng-click="selectAllImagePairs()"> | |
204 select | |
205 </button> | |
206 <button ng-click="clearAllImagePairs()"> | |
207 clear | |
208 </button> | |
209 <button ng-click="toggleAllImagePairs()"> | |
210 toggle | |
211 </button> | |
212 <div ng-repeat="otherTab in tabs"> | |
213 <button ng-click="moveSelectedImagePairsToTab(otherTab)" | |
214 ng-disabled="selectedImagePairs.length == 0" | |
215 ng-show="otherTab != viewingTab"> | |
216 move {{selectedImagePairs.length}} selected tests to {{otherTab}}
tab | |
217 </button> | |
218 </div> | |
219 </div> | |
220 <div class="results-header-stats"> | |
221 Found {{filteredImagePairs.length}} matches; | |
222 <span ng-show="filteredImagePairs.length > limitedImagePairs.length"> | |
223 displaying the first {{limitedImagePairs.length}}. | |
224 </span> | |
225 <span ng-show="filteredImagePairs.length <= limitedImagePairs.length"> | |
226 displaying them all. | |
227 </span> | |
228 <span ng-show="renderEndTime > renderStartTime"> | |
229 Rendered in {{(renderEndTime - renderStartTime).toFixed(0)}} ms. | |
230 </span> | |
231 <br> | |
232 (click on the column header radio buttons to re-sort by that column) | |
233 </div> | |
234 </div> <!-- results header --> | |
235 | |
236 <table border="0"><tr><td> <!-- table holding results header + results table
--> | |
237 </td></tr><tr><td> | |
238 <table border="1"> <!-- results --> | |
239 <tr> | |
240 <!-- Most column headers are displayed in a common fashion... --> | |
241 <th ng-repeat="columnName in orderedColumnNames"> | |
242 <a ng-class="'sort-' + sortedByColumnsCls(columnName)" | |
243 ng-click="sortResultsBy(constants.KEY__IMAGEPAIRS__EXTRACOLUMNS
, columnName)" | |
244 href="" | |
245 class="sortable-header"> | |
246 {{extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMNHEADER
S__HEADER_TEXT]}} | |
247 </a> | |
248 </th> | |
249 | |
250 <!-- ... but there are a few columns where we display things different
ly. --> | |
251 <th> | |
252 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__EXPECTATION
S__BUGS)" | |
253 ng-click="sortResultsBy(constants.KEY__IMAGEPAIRS__EXPECTATIONS,
constants.KEY__EXPECTATIONS__BUGS)" | |
254 href="" | |
255 class="sortable-header"> | |
256 bugs | |
257 </a> | |
258 </th> | |
259 <th width="{{imageSize}}"> | |
260 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__IMAGEPAIRS_
_IMAGE_A_URL)" | |
261 ng-click="sortResultsBy('none', constants.KEY__IMAGEPAIRS__IMAGE_
A_URL)" | |
262 href="" | |
263 class="sortable-header"> | |
264 {{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_A][constants
.KEY__IMAGESETS__FIELD__DESCRIPTION]}} | |
265 </a> | |
266 </th> | |
267 <th width="{{imageSize}}"> | |
268 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__IMAGEPAIRS_
_IMAGE_B_URL)" | |
269 ng-click="sortResultsBy('none', constants.KEY__IMAGEPAIRS__IMAGE_
B_URL)" | |
270 href="" | |
271 class="sortable-header"> | |
272 {{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_B][constants.
KEY__IMAGESETS__FIELD__DESCRIPTION]}} | |
273 </a> | |
274 </th> | |
275 <th width="{{imageSize}}"> | |
276 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__DIFFERENCES
__PERCENT_DIFF_PIXELS)" | |
277 ng-click="sortResultsBy(constants.KEY__IMAGEPAIRS__DIFFERENCES, c
onstants.KEY__DIFFERENCES__PERCENT_DIFF_PIXELS)" | |
278 href="" | |
279 class="sortable-header"> | |
280 differing pixels in white | |
281 </a> | |
282 </th> | |
283 <th width="{{imageSize}}"> | |
284 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__DIFFERENCES
__PERCEPTUAL_DIFF)" | |
285 ng-click="sortResultsBy(constants.KEY__IMAGEPAIRS__DIFFERENCES, c
onstants.KEY__DIFFERENCES__PERCEPTUAL_DIFF)" | |
286 href="" | |
287 class="sortable-header"> | |
288 perceptual difference | |
289 </a> | |
290 <br> | |
291 <input type="range" ng-model="pixelDiffBgColorBrightness" | |
292 ng-init="pixelDiffBgColorBrightness=64; pixelDiffBgColor=brig
htnessStringToHexColor(pixelDiffBgColorBrightness)" | |
293 ng-change="pixelDiffBgColor=brightnessStringToHexColor(pixelD
iffBgColorBrightness)" | |
294 title="image background brightness" | |
295 min="0" max="255"/> | |
296 </th> | |
297 <th> | |
298 <!-- imagepair-selection checkbox column --> | |
299 </th> | |
300 </tr> | |
301 | |
302 <tr ng-repeat="imagePair in limitedImagePairs" valign="top" | |
303 ng-class-odd="'results-odd'" ng-class-even="'results-even'" | |
304 results-updated-callback-directive> | |
305 | |
306 <td ng-repeat="columnName in orderedColumnNames"> | |
307 {{imagePair[constants.KEY__IMAGEPAIRS__EXTRACOLUMNS][columnName]}} | |
308 <br> | |
309 <button class="show-only-button" | |
310 ng-show="viewingTab == defaultTab" | |
311 ng-disabled="1 == setSize(showingColumnValues[columnName])" | |
312 ng-click="showOnlyColumnValue(columnName, imagePair[constant
s.KEY__IMAGEPAIRS__EXTRACOLUMNS][columnName])" | |
313 title="show only results of {{extraColumnHeaders[columnName]
[constants.KEY__EXTRACOLUMNHEADERS__HEADER_TEXT]}} {{imagePair[constants.KEY__IM
AGEPAIRS__EXTRACOLUMNS][columnName]}}"> | |
314 show only | |
315 </button> | |
316 <br> | |
317 <button class="show-all-button" | |
318 ng-show="viewingTab == defaultTab" | |
319 ng-disabled="allColumnValues[columnName].length == setSize(s
howingColumnValues[columnName])" | |
320 ng-click="showAllColumnValues(columnName)" | |
321 title="show results of all {{extraColumnHeaders[columnName][
constants.KEY__EXTRACOLUMNHEADERS__HEADER_TEXT]}}s"> | |
322 show all | |
323 </button> | |
324 </td> | |
325 | |
326 <!-- bugs --> | |
327 <td> | |
328 <a ng-repeat="bug in imagePair[constants.KEY__IMAGEPAIRS__EXPECTATIO
NS][constants.KEY__EXPECTATIONS__BUGS]" | |
329 href="https://code.google.com/p/skia/issues/detail?id={{bug}}" | |
330 target="_blank"> | |
331 {{bug}} | |
332 </a> | |
333 </td> | |
334 | |
335 <!-- image A --> | |
336 <td width="{{imageSize}}" ng-if="imagePair[constants.KEY__IMAGEPAIRS__
ROWSPAN] > 0" rowspan="{{imagePair[constants.KEY__IMAGEPAIRS__ROWSPAN]}}"> | |
337 <div ng-if="imagePair[constants.KEY__IMAGEPAIRS__IMAGE_A_URL] != nul
l"> | |
338 <a href="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_A][const
ants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__I
MAGE_A_URL]}}" target="_blank">View Image</a><br/> | |
339 <img ng-if="showThumbnails" | |
340 width="{{imageSize}}" | |
341 ng-src="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_A][c
onstants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIR
S__IMAGE_A_URL]}}" /> | |
342 </div> | |
343 <div ng-show="imagePair[constants.KEY__IMAGEPAIRS__IMAGE_A_URL] == n
ull" | |
344 style="text-align:center"> | |
345 –none– | |
346 </div> | |
347 </td> | |
348 | |
349 <!-- image B --> | |
350 <td width="{{imageSize}}" ng-if="imagePair[constants.KEY__IMAGEPAIRS__
ROWSPAN] > 0" rowspan="{{imagePair[constants.KEY__IMAGEPAIRS__ROWSPAN]}}"> | |
351 <div ng-if="imagePair[constants.KEY__IMAGEPAIRS__IMAGE_B_URL] != nul
l"> | |
352 <a href="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_B][const
ants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__I
MAGE_B_URL]}}" target="_blank">View Image</a><br/> | |
353 <img ng-if="showThumbnails" | |
354 width="{{imageSize}}" | |
355 ng-src="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_B][c
onstants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIR
S__IMAGE_B_URL]}}" /> | |
356 </div> | |
357 <div ng-show="imagePair[constants.KEY__IMAGEPAIRS__IMAGE_B_URL] == n
ull" | |
358 style="text-align:center"> | |
359 –none– | |
360 </div> | |
361 </td> | |
362 | |
363 <!-- whitediffs: every differing pixel shown in white --> | |
364 <td width="{{imageSize}}" ng-if="imagePair[constants.KEY__IMAGEPAIRS__
ROWSPAN] > 0" rowspan="{{imagePair[constants.KEY__IMAGEPAIRS__ROWSPAN]}}"> | |
365 <div ng-if="imagePair[constants.KEY__IMAGEPAIRS__IS_DIFFERENT]" | |
366 title="{{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][cons
tants.KEY__DIFFERENCES__NUM_DIFF_PIXELS] | number:0}} of {{(100 * imagePair[cons
tants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__NUM_DIFF_PIXELS]
/ imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES_
_PERCENT_DIFF_PIXELS]) | number:0}} pixels ({{imagePair[constants.KEY__IMAGEPAIR
S__DIFFERENCES][constants.KEY__DIFFERENCES__PERCENT_DIFF_PIXELS].toFixed(4)}}%)
differ from expectation."> | |
367 | |
368 <a href="{{imageSets[constants.KEY__IMAGESETS__SET__WHITEDIFFS][co
nstants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS
__DIFFERENCES][constants.KEY__DIFFERENCES__WHITE_DIFF_URL]}}" target="_blank">Vi
ew Image</a><br/> | |
369 <img ng-if="showThumbnails" | |
370 width="{{imageSize}}" | |
371 ng-src="{{imageSets[constants.KEY__IMAGESETS__SET__WHITEDIFFS
][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEP
AIRS__DIFFERENCES][constants.KEY__DIFFERENCES__WHITE_DIFF_URL]}}" /> | |
372 <br/> | |
373 {{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY_
_DIFFERENCES__PERCENT_DIFF_PIXELS].toFixed(4)}}% | |
374 ({{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY
__DIFFERENCES__NUM_DIFF_PIXELS]}}) | |
375 </div> | |
376 <div ng-show="!imagePair[constants.KEY__IMAGEPAIRS__IS_DIFFERENT]" | |
377 style="text-align:center"> | |
378 –none– | |
379 </div> | |
380 </td> | |
381 | |
382 <!-- diffs: per-channel RGB deltas --> | |
383 <td width="{{imageSize}}" ng-if="imagePair[constants.KEY__IMAGEPAIRS__
ROWSPAN] > 0" rowspan="{{imagePair[constants.KEY__IMAGEPAIRS__ROWSPAN]}}"> | |
384 <div ng-if="imagePair[constants.KEY__IMAGEPAIRS__IS_DIFFERENT]" | |
385 title="Perceptual difference measure is {{imagePair[constants.K
EY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__PERCEPTUAL_DIFF].toFixe
d(4)}}%. Maximum difference per channel: R={{imagePair[constants.KEY__IMAGEPAIR
S__DIFFERENCES][constants.KEY__DIFFERENCES__MAX_DIFF_PER_CHANNEL][0]}}, G={{imag
ePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__MAX_DI
FF_PER_CHANNEL][1]}}, B={{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][cons
tants.KEY__DIFFERENCES__MAX_DIFF_PER_CHANNEL][2]}}"> | |
386 | |
387 <a href="{{imageSets[constants.KEY__IMAGESETS__SET__DIFFS][constan
ts.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__DIF
FERENCES][constants.KEY__DIFFERENCES__DIFF_URL]}}" target="_blank">View Image</a
><br/> | |
388 <img ng-if="showThumbnails" | |
389 ng-style="{backgroundColor: pixelDiffBgColor}" | |
390 width="{{imageSize}}" | |
391 ng-src="{{imageSets[constants.KEY__IMAGESETS__SET__DIFFS][con
stants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS_
_DIFFERENCES][constants.KEY__DIFFERENCES__DIFF_URL]}}" /> | |
392 <br/> | |
393 {{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY_
_DIFFERENCES__PERCEPTUAL_DIFF].toFixed(4)}}% | |
394 {{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY_
_DIFFERENCES__MAX_DIFF_PER_CHANNEL]}} | |
395 </div> | |
396 <div ng-show="!imagePair[constants.KEY__IMAGEPAIRS__IS_DIFFERENT]" | |
397 style="text-align:center"> | |
398 –none– | |
399 </div> | |
400 </td> | |
401 | |
402 <td ng-if="imagePair[constants.KEY__IMAGEPAIRS__ROWSPAN] > 0" rowspan=
"{{imagePair[constants.KEY__IMAGEPAIRS__ROWSPAN]}}"> | |
403 <br/> | |
404 <input type="checkbox" | |
405 name="rowSelect" | |
406 value="{{imagePair.index}}" | |
407 ng-checked="isValueInArray(imagePair.index, selectedImagePair
s)" | |
408 ng-click="toggleSomeImagePairs($index, imagePair[constants.KE
Y__IMAGEPAIRS__ROWSPAN])"> | |
409 </tr> | |
410 </table> <!-- imagePairs --> | |
411 </td></tr></table> <!-- table holding results header + imagePairs table --> | |
412 | |
413 </div><!-- main display area of selected tab --> | |
414 </div><!-- everything: hide until readyToDisplay --> | |
415 | |
416 </body> | |
417 </html> | |
OLD | NEW |