Skip to content

Commit 0d47c50

Browse files
committed
Add filtering
Signed-off-by: Conor MacBride <[email protected]>
1 parent 72d5734 commit 0d47c50

File tree

3 files changed

+98
-55
lines changed

3 files changed

+98
-55
lines changed

pytest_mpl/summary/templates/extra.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,43 @@ var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
1313

1414
// Search, sort and filter
1515
var options = {
16-
valueNames: ['test-name', 'status-sort', 'rms-sort', 'rms-value', 'baseline-hash-value', 'result-hash-value']
16+
valueNames: ['test-name', 'status-sort', 'rms-sort', 'filter-classes',
17+
'rms-value', 'baseline-hash-value', 'result-hash-value']
1718
};
1819
var resultsList = new List('results', options);
1920
resultsList.sort('status-sort');
21+
22+
function applyFilters() {
23+
var cond_and = document.getElementById('filterForm').elements['conditionand'].checked;
24+
var filters = [];
25+
var filterElements = document.getElementById('filterForm').getElementsByClassName('filter');
26+
for (var i = 0, elem; elem = filterElements[i++];) {
27+
if (elem.checked) {
28+
filters.push(elem.id);
29+
}
30+
}
31+
if (filters.length == 0) {
32+
return resultsList.filter(); // Show all if nothing selected
33+
}
34+
resultsList.filter(function (item) {
35+
var inc = false;
36+
for (var i = 0, filt; filt = filters[i++];) {
37+
if (item.values()['filter-classes'].includes(filt)) {
38+
if (!cond_and) {
39+
return true;
40+
}
41+
inc = true;
42+
} else {
43+
if (cond_and) {
44+
return false;
45+
}
46+
}
47+
}
48+
return inc;
49+
});
50+
}
51+
52+
function resetFilters() {
53+
resultsList.filter();
54+
document.getElementById("filterForm").reset();
55+
}

pytest_mpl/summary/templates/filter.html

Lines changed: 60 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5,64 +5,70 @@ <h6>Filter results</h6>
55
</div>
66
<div class="offcanvas-body">
77
<h5>Sort tests by...</h5>
8-
<div class="btn-group m-2" role="group" aria-label="Select sorting">
9-
<input type="radio" class="btn-check sort" data-sort="status-sort" name="sort" id="sortstatus" autocomplete="off" checked>
8+
<div class="btn-group m-2 pb-2" role="group" aria-label="Select sorting">
9+
<input type="radio" class="btn-check sort" data-sort="status-sort" name="sort" id="sortstatus"
10+
autocomplete="off" checked>
1011
<label class="btn btn-outline-secondary" for="sortstatus">status</label>
11-
<input type="radio" class="btn-check sort" data-sort="test-name" name="sort" id="sortname" autocomplete="off">
12+
<input type="radio" class="btn-check sort" data-sort="test-name" name="sort" id="sortname"
13+
autocomplete="off">
1214
<label class="btn btn-outline-secondary" for="sortname">name</label>
1315
<input type="radio" class="btn-check sort" data-sort="rms-sort" name="sort" id="sortrms" autocomplete="off">
1416
<label class="btn btn-outline-secondary" for="sortrms">RMS</label>
1517
</div>
16-
<h5>Show tests which have...</h5>
17-
<div class="list-group m-2">
18-
<label class="list-group-item">
19-
<input class="form-check-input me-1" type="checkbox" value="">
20-
passed
21-
</label>
22-
<label class="list-group-item">
23-
<input class="form-check-input me-1" type="checkbox" value="">
24-
failed
25-
</label>
26-
<label class="list-group-item">
27-
<input class="form-check-input me-1" type="checkbox" value="">
28-
skipped
29-
</label>
30-
</div>
31-
<div class="list-group m-2">
32-
<label class="list-group-item">
33-
<input class="form-check-input me-1" type="checkbox" value="">
34-
matching images
35-
</label>
36-
<label class="list-group-item">
37-
<input class="form-check-input me-1" type="checkbox" value="">
38-
differing images
39-
</label>
40-
</div>
41-
<div class="list-group m-2 mpl-hash">
42-
<label class="list-group-item">
43-
<input class="form-check-input me-1" type="checkbox" value="">
44-
matching hashes
45-
</label>
46-
<label class="list-group-item">
47-
<input class="form-check-input me-1" type="checkbox" value="">
48-
differing hashes
49-
</label>
50-
</div>
51-
<div class="list-group m-2">
52-
<label class="list-group-item mpl-hash">
53-
<input class="form-check-input me-1" type="checkbox" value="">
54-
no baseline hash
55-
</label>
56-
<label class="list-group-item">
57-
<input class="form-check-input me-1" type="checkbox" value="">
58-
no baseline image
59-
</label>
60-
</div>
61-
<div class="btn-group m-2" role="group" aria-label="Select condition">
62-
<input type="radio" class="btn-check" name="condition" id="conditionand" autocomplete="off" checked>
63-
<label class="btn btn-outline-secondary" for="conditionand">AND</label>
64-
<input type="radio" class="btn-check" name="condition" id="conditionor" autocomplete="off">
65-
<label class="btn btn-outline-secondary" for="conditionor">OR</label>
66-
</div>
18+
<form id="filterForm" onsubmit="return false;">
19+
<h5>Show tests which have...</h5>
20+
<div class="list-group m-2">
21+
<label class="list-group-item list-group-item-success">
22+
<input class="form-check-input me-1 filter" type="checkbox" value="" id="overall-passed" onclick="applyFilters()">
23+
passed
24+
</label>
25+
<label class="list-group-item list-group-item-danger">
26+
<input class="form-check-input me-1 filter" type="checkbox" value="" id="overall-failed" onclick="applyFilters()">
27+
failed
28+
</label>
29+
<label class="list-group-item list-group-item-warning">
30+
<input class="form-check-input me-1 filter" type="checkbox" value="" id="overall-skipped" onclick="applyFilters()">
31+
skipped
32+
</label>
33+
</div>
34+
<div class="list-group m-2">
35+
<label class="list-group-item list-group-item-success">
36+
<input class="form-check-input me-1 filter" type="checkbox" value="" id="image-match" onclick="applyFilters()">
37+
matching images
38+
</label>
39+
<label class="list-group-item list-group-item-danger">
40+
<input class="form-check-input me-1 filter" type="checkbox" value="" id="image-diff" onclick="applyFilters()">
41+
differing images
42+
</label>
43+
</div>
44+
<div class="list-group m-2 mpl-hash">
45+
<label class="list-group-item list-group-item-success">
46+
<input class="form-check-input me-1 filter" type="checkbox" value="" id="hash-match" onclick="applyFilters()">
47+
matching hashes
48+
</label>
49+
<label class="list-group-item list-group-item-danger">
50+
<input class="form-check-input me-1 filter" type="checkbox" value="" id="hash-diff" onclick="applyFilters()">
51+
differing hashes
52+
</label>
53+
</div>
54+
<div class="list-group m-2">
55+
<label class="list-group-item mpl-hash list-group-item-warning">
56+
<input class="form-check-input me-1 filter" type="checkbox" value="" id="hash-missing" onclick="applyFilters()">
57+
no baseline hash
58+
</label>
59+
<label class="list-group-item list-group-item-warning">
60+
<input class="form-check-input me-1 filter" type="checkbox" value="" id="image-missing" onclick="applyFilters()">
61+
no baseline image
62+
</label>
63+
</div>
64+
<button type="submit" class="btn btn-primary m-2" data-bs-dismiss="offcanvas">Apply</button>
65+
<button type="submit" class="btn btn-secondary m-2" onclick="resetFilters()">Reset</button>
66+
<div class="btn-group m-2" role="group" aria-label="Select condition">
67+
<input type="radio" class="btn-check" name="condition" id="conditionand" value="and" autocomplete="off" onclick="applyFilters()" checked>
68+
<label class="btn btn-outline-secondary" for="conditionand">AND</label>
69+
<input type="radio" class="btn-check" name="condition" id="conditionor" value="or" autocomplete="off" onclick="applyFilters()">
70+
<label class="btn btn-outline-secondary" for="conditionor">OR</label>
71+
</div>
72+
</form>
6773
</div>
6874
</div>

pytest_mpl/summary/templates/result.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<span class="test-name" style="display:none">{module}.{test_name}</span>
33
<span class="status-sort" style="display:none">{status_sort}</span>
44
<span class="rms-sort" style="display:none">{rms_sort}</span>
5+
<span class="filter-classes" style="display:none">{classes}</span>
56
<div class="card">
67
<a class="btn" data-bs-toggle="offcanvas" href="#offcanvas{id}" role="button" aria-controls="offcanvas{id}">{image}</a>
78
{offcanvas}

0 commit comments

Comments
 (0)