Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit af4c653

Browse files
authored
Fix: Collapsed state between redraws (#703)
1 parent 8a4ece4 commit af4c653

File tree

8 files changed

+175
-20
lines changed

8 files changed

+175
-20
lines changed

package-lock.json

+88
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"build:css": "sass --no-source-map --no-error-css src/layout/css/style.scss src/pytest_html/resources/style.css",
55
"build:jsapp": "browserify ./src/pytest_html/scripts/index.js > ./src/pytest_html/resources/app.js",
66
"lint": "eslint src/pytest_html/scripts/ testing/",
7-
"unit": "nyc mocha testing/**/unittest.js",
7+
"unit": "nyc mocha testing/**/unittest.js --require mock-local-storage",
88
"all": "npm run lint && npm run unit && npm run build:css && npm run build:jsapp"
99
},
1010
"devDependencies": {
@@ -13,6 +13,7 @@
1313
"eslint": "^8.20.0",
1414
"eslint-config-google": "^0.14.0",
1515
"mocha": "^10.0.0",
16+
"mock-local-storage": "^1.1.24",
1617
"nyc": "^15.1.0",
1718
"sass": "^1.52.3",
1819
"sinon": "^14.0.0"

src/pytest_html/scripts/datamanager.js

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
1-
const { getCollapsedCategory } = require('./storage.js')
1+
const { getCollapsedCategory, setCollapsedIds } = require('./storage.js')
22

33
class DataManager {
44
setManager(data) {
55
const collapsedCategories = [...getCollapsedCategory(data.renderCollapsed)]
6+
const collapsedIds = []
67
const tests = Object.values(data.tests).flat().map((test, index) => {
78
const collapsed = collapsedCategories.includes(test.result.toLowerCase())
9+
const id = `test_${index}`
10+
if (collapsed) {
11+
collapsedIds.push(id)
12+
}
813
return {
914
...test,
10-
id: `test_${index}`,
15+
id,
1116
collapsed,
1217
}
1318
})
1419
const dataBlob = { ...data, tests }
1520
this.data = { ...dataBlob }
1621
this.renderData = { ...dataBlob }
22+
setCollapsedIds(collapsedIds)
1723
}
1824

1925
get allData() {
@@ -47,6 +53,10 @@ class DataManager {
4753
get environment() {
4854
return this.renderData.environment
4955
}
56+
57+
get initialSort() {
58+
return this.data.initialSort
59+
}
5060
}
5161

5262
module.exports = {

src/pytest_html/scripts/filter.js

+4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const { manager } = require('./datamanager.js')
2+
const { doSort } = require('./sort.js')
23
const storageModule = require('./storage.js')
34

45
const getFilteredSubSet = (filter) =>
@@ -20,6 +21,9 @@ const doFilter = (type, show) => {
2021
const currentFilter = storageModule.getVisible()
2122
const filteredSubset = getFilteredSubSet(currentFilter)
2223
manager.setRender(filteredSubset)
24+
25+
const sortColumn = storageModule.getSort()
26+
doSort(sortColumn, true)
2327
}
2428

2529
module.exports = {

src/pytest_html/scripts/main.js

+31-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@ const { dom, findAll } = require('./dom.js')
22
const { manager } = require('./datamanager.js')
33
const { doSort } = require('./sort.js')
44
const { doFilter } = require('./filter.js')
5-
const { getVisible, getSort, getSortDirection, possibleFilters } = require('./storage.js')
5+
const {
6+
getVisible,
7+
getCollapsedIds,
8+
setCollapsedIds,
9+
getSort,
10+
getSortDirection,
11+
possibleFilters,
12+
} = require('./storage.js')
613

714
const removeChildren = (node) => {
815
while (node.firstChild) {
@@ -22,7 +29,7 @@ const renderStatic = () => {
2229
}
2330

2431
const renderContent = (tests) => {
25-
const sortAttr = getSort(manager.allData.initialSort)
32+
const sortAttr = getSort(manager.initialSort)
2633
const sortAsc = JSON.parse(getSortDirection())
2734
const rows = tests.map(dom.getResultTBody)
2835
const table = document.getElementById('results-table')
@@ -53,7 +60,17 @@ const renderContent = (tests) => {
5360

5461
findAll('.collapsible td:not(.col-links').forEach((elem) => {
5562
elem.addEventListener('click', ({ target }) => {
56-
manager.toggleCollapsedItem(target.parentElement.dataset.id)
63+
const id = target.parentElement.dataset.id
64+
manager.toggleCollapsedItem(id)
65+
66+
const collapsedIds = getCollapsedIds()
67+
if (collapsedIds.includes(id)) {
68+
const updated = collapsedIds.filter((item) => item !== id)
69+
setCollapsedIds(updated)
70+
} else {
71+
collapsedIds.push(id)
72+
setCollapsedIds(collapsedIds)
73+
}
5774
redraw()
5875
})
5976
})
@@ -73,6 +90,14 @@ const bindEvents = () => {
7390
const { testResult } = element.dataset
7491

7592
doFilter(testResult, element.checked)
93+
const collapsedIds = getCollapsedIds()
94+
const updated = manager.renderData.tests.map((test) => {
95+
return {
96+
...test,
97+
collapsed: collapsedIds.includes(test.id),
98+
}
99+
})
100+
manager.setRender(updated)
76101
redraw()
77102
}
78103

@@ -88,10 +113,13 @@ const bindEvents = () => {
88113
})
89114
document.getElementById('show_all_details').addEventListener('click', () => {
90115
manager.allCollapsed = false
116+
setCollapsedIds([])
91117
redraw()
92118
})
93119
document.getElementById('hide_all_details').addEventListener('click', () => {
94120
manager.allCollapsed = true
121+
const allIds = manager.renderData.tests.map((test) => test.id)
122+
setCollapsedIds(allIds)
95123
redraw()
96124
})
97125
}

src/pytest_html/scripts/sort.js

+14-5
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,14 @@ const durationSort = (list, ascending) => {
4343
}
4444

4545
const doInitSort = () => {
46-
const type = storageModule.getSort(manager.allData.initialSort)
46+
const type = storageModule.getSort(manager.initialSort)
4747
const ascending = storageModule.getSortDirection()
4848
const list = manager.testSubset
4949
const initialOrder = ['Error', 'Failed', 'Rerun', 'XFailed', 'XPassed', 'Skipped', 'Passed']
50+
51+
storageModule.setSort(type)
52+
storageModule.setSortDirection(ascending)
53+
5054
if (type?.toLowerCase() === 'original') {
5155
manager.setRender(list)
5256
} else {
@@ -66,14 +70,19 @@ const doInitSort = () => {
6670
}
6771
}
6872

69-
const doSort = (type) => {
70-
const newSortType = storageModule.getSort(manager.allData.initialSort) !== type
73+
const doSort = (type, skipDirection) => {
74+
const newSortType = storageModule.getSort(manager.initialSort) !== type
7175
const currentAsc = storageModule.getSortDirection()
72-
const ascending = newSortType ? true : !currentAsc
76+
let ascending
77+
if (skipDirection) {
78+
ascending = currentAsc
79+
} else {
80+
ascending = newSortType ? false : !currentAsc
81+
}
7382
storageModule.setSort(type)
7483
storageModule.setSortDirection(ascending)
75-
const list = manager.testSubset
7684

85+
const list = manager.testSubset
7786
const sortedList = type === 'duration' ? durationSort(list, ascending) : genericSort(list, type, ascending)
7887
manager.setRender(sortedList)
7988
}

0 commit comments

Comments
 (0)