Skip to content

Commit cd28210

Browse files
authored
Feature: Untemplate table header (#713)
1 parent bd0c530 commit cd28210

File tree

3 files changed

+54
-44
lines changed

3 files changed

+54
-44
lines changed

src/pytest_html/resources/index.jinja2

+9-10
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,6 @@
2626
<td></td>
2727
</tr>
2828
</template>
29-
<template id="template_results-table__head">
30-
<thead id="results-table-head">
31-
<tr>
32-
{%- for th in table_head %}
33-
{{ th|safe }}
34-
{%- endfor %}
35-
</tr>
36-
</thead>
37-
</template>
3829
<template id="template_results-table__body--empty">
3930
<tbody class="results-table-row">
4031
<tr id="not-found-message">
@@ -107,7 +98,15 @@
10798
{%- endfor %}
10899
</div>
109100
</div>
110-
<table id="results-table"></table>
101+
<table id="results-table">
102+
<thead id="results-table-head">
103+
<tr>
104+
{%- for th in table_head %}
105+
{{ th|safe }}
106+
{%- endfor %}
107+
</tr>
108+
</thead>
109+
</table>
111110
</body>
112111
<footer>
113112
<div id="data-container" data-jsonblob="{{ test_data }}"></div>

src/pytest_html/scripts/dom.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,8 @@ const dom = {
3737
return envRow
3838
},
3939
getResultTBody: ({ testId, id, log, duration, extras, resultsTableRow, tableHtml, result, collapsed }) => {
40-
const resultLower = result.toLowerCase()
4140
const resultBody = templateResult.content.cloneNode(true)
42-
resultBody.querySelector('tbody').classList.add(resultLower)
41+
resultBody.querySelector('tbody').classList.add(result.toLowerCase())
4342
resultBody.querySelector('tbody').id = testId
4443
resultBody.querySelector('.collapsible').dataset.id = id
4544

src/pytest_html/scripts/main.js

+44-32
Original file line numberDiff line numberDiff line change
@@ -28,49 +28,51 @@ const renderStatic = () => {
2828
renderEnvironmentTable()
2929
}
3030

31+
const addItemToggleListener = (elem) => {
32+
elem.addEventListener('click', ({ target }) => {
33+
const id = target.parentElement.dataset.id
34+
manager.toggleCollapsedItem(id)
35+
36+
const collapsedIds = getCollapsedIds()
37+
if (collapsedIds.includes(id)) {
38+
const updated = collapsedIds.filter((item) => item !== id)
39+
setCollapsedIds(updated)
40+
} else {
41+
collapsedIds.push(id)
42+
setCollapsedIds(collapsedIds)
43+
}
44+
redraw()
45+
})
46+
}
47+
3148
const renderContent = (tests) => {
3249
const sortAttr = getSort(manager.initialSort)
3350
const sortAsc = JSON.parse(getSortDirection())
3451
const rows = tests.map(dom.getResultTBody)
3552
const table = document.getElementById('results-table')
36-
const tableHeader = document.getElementById('template_results-table__head').content.cloneNode(true)
53+
const tableHeader = document.getElementById('results-table-head')
54+
55+
const newTable = document.createElement('table')
56+
newTable.id = 'results-table'
3757

38-
removeChildren(table)
58+
// remove all sorting classes and set the relevant
59+
findAll('.sortable', tableHeader).forEach((elem) => elem.classList.remove('asc', 'desc'))
60+
tableHeader.querySelector(`.sortable[data-column-type="${sortAttr}"]`).classList.add(sortAsc ? 'desc' : 'asc')
61+
newTable.appendChild(tableHeader)
3962

40-
tableHeader.querySelector(`.sortable[data-column-type="${sortAttr}"]`)?.classList.add(sortAsc ? 'desc' : 'asc')
41-
table.appendChild(tableHeader)
4263
if (!rows.length) {
4364
const emptyTable = document.getElementById('template_results-table__body--empty').content.cloneNode(true)
44-
table.appendChild(emptyTable)
45-
}
46-
47-
rows.forEach((row) => !!row && table.appendChild(row))
48-
49-
findAll('.sortable').forEach((elem) => {
50-
elem.addEventListener('click', (evt) => {
51-
const { target: element } = evt
52-
const { columnType } = element.dataset
53-
doSort(columnType)
54-
redraw()
55-
})
56-
})
57-
58-
findAll('.collapsible td:not(.col-links').forEach((elem) => {
59-
elem.addEventListener('click', ({ target }) => {
60-
const id = target.parentElement.dataset.id
61-
manager.toggleCollapsedItem(id)
62-
63-
const collapsedIds = getCollapsedIds()
64-
if (collapsedIds.includes(id)) {
65-
const updated = collapsedIds.filter((item) => item !== id)
66-
setCollapsedIds(updated)
67-
} else {
68-
collapsedIds.push(id)
69-
setCollapsedIds(collapsedIds)
65+
newTable.appendChild(emptyTable)
66+
} else {
67+
rows.forEach((row) => {
68+
if (!!row) {
69+
findAll('.collapsible td:not(.col-links', row).forEach(addItemToggleListener)
70+
newTable.appendChild(row)
7071
}
71-
redraw()
7272
})
73-
})
73+
}
74+
75+
table.replaceWith(newTable)
7476
}
7577

7678
const renderDerived = () => {
@@ -108,6 +110,16 @@ const bindEvents = () => {
108110
findAll('input[name="filter_checkbox"]').forEach((elem) => {
109111
elem.addEventListener('click', filterColumn)
110112
})
113+
114+
findAll('.sortable').forEach((elem) => {
115+
elem.addEventListener('click', (evt) => {
116+
const { target: element } = evt
117+
const { columnType } = element.dataset
118+
doSort(columnType)
119+
redraw()
120+
})
121+
})
122+
111123
document.getElementById('show_all_details').addEventListener('click', () => {
112124
manager.allCollapsed = false
113125
setCollapsedIds([])

0 commit comments

Comments
 (0)