Skip to content

Commit eb43828

Browse files
authored
show video in imageviewer (pytest-dev#14)
* show video in imageviewer
1 parent 6e6ba32 commit eb43828

File tree

7 files changed

+124
-134
lines changed

7 files changed

+124
-134
lines changed

src/layout/css/style.scss

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -140,63 +140,50 @@ $extra-media-width: 320px;
140140
}
141141
}
142142

143-
div.image {
143+
div.media {
144144
border: $border-width solid #e6e6e6;
145145
float: right;
146146
height: $extra-height;
147147
margin: 0 $spacing;
148148
overflow: hidden;
149149
width: $extra-media-width;
150-
151-
img {
152-
// width: $extra-media-width;
153-
}
154150
}
155151

156-
.image-container {
157-
display: flex;
152+
.media-container {
153+
display: grid;
154+
grid-template-columns: 25px auto 25px;
158155
align-items: center;
159156
flex: 1 1;
160157
overflow: hidden;
161158
height: 200px;
162159
}
163-
.image-container__nav--right,
164-
.image-container__nav--left {
165-
flex: 0 0 25px;
160+
.media-container__nav--right,
161+
.media-container__nav--left {
166162
text-align: center;
167163
cursor: pointer;
168164
}
169165

170-
.image-container__frame {
171-
flex: 1 1;
166+
.media-container__viewport {
172167
cursor: pointer;
173168
text-align: center;
169+
height: inherit;
170+
img,
171+
video {
172+
object-fit: cover;
173+
width: 100%;
174+
max-height: 100%;
175+
}
174176
}
175177

176-
.image-name,
177-
.image-overview {
178+
.media__name,
179+
.media__counter {
178180
display: flex;
179181
flex-direction: row;
180182
justify-content: space-around;
181183
flex: 0 0 25px;
182184
align-items: center;
183185
}
184186

185-
div.video {
186-
border: $border-width solid #e6e6e6;
187-
float: right;
188-
height: $extra-height;
189-
margin-left: $spacing;
190-
overflow: hidden;
191-
width: $extra-media-width;
192-
193-
video {
194-
overflow: hidden;
195-
width: $extra-media-width;
196-
height: $extra-height;
197-
}
198-
}
199-
200187
.collapsed {
201188
display: none;
202189
}

src/pytest_html/resources/index.jinja2

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,6 @@
3131
<template id="template_a">
3232
<a target="_blank"></a>
3333
</template>
34-
<template id="template_img">
35-
<a target="_blank">
36-
<img />
37-
</a>
38-
</template>
3934
<template id="template_results-table__tbody">
4035
<tbody class="results-table-row">
4136
<tr>
@@ -46,14 +41,19 @@
4641
</tr>
4742
<tr class="extras-row">
4843
<td class="extra" colspan="4">
49-
<div class="image">
50-
<div class="image-container">
51-
<div class="image-container__nav--left"><</div>
52-
<div class="image-container__frame"></div>
53-
<div class="image-container__nav--right">></div>
44+
<div class="media">
45+
<div class="media-container">
46+
<div class="media-container__nav--left"><</div>
47+
<div class="media-container__viewport">
48+
<img src="" />
49+
<video controls>
50+
<source src="" type="video/mp4">
51+
</video>
52+
</div>
53+
<div class="media-container__nav--right">></div>
5454
</div>
55-
<div class="image-name"></div>
56-
<div class="image-overview"></div>
55+
<div class="media__name"></div>
56+
<div class="media__counter"></div>
5757
</div>
5858
<div class="log"></div>
5959
</td>

src/pytest_html/resources/style.css

Lines changed: 17 additions & 24 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/pytest_html/scripts/dom.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const { formatDuration } = require('./utils.js')
2-
const imgViewer = require('./imgViewer.js')
2+
const mediaViewer = require('./mediaViewer.js')
33
const templateEnvRow = document.querySelector('#template_environment_row')
44
const templateResult = document.querySelector('#template_results-table__tbody')
55
const aTag = document.querySelector('#template_a')
@@ -77,7 +77,7 @@ const dom = {
7777
} else {
7878
resultBody.querySelector('.extras-row').classList.add('hidden')
7979
}
80-
const images = []
80+
const media = []
8181
extras?.forEach(({ name, format_type, content }) => {
8282
const extraLink = aTag.content.cloneNode(true)
8383
const extraLinkItem = extraLink.querySelector('a')
@@ -87,11 +87,11 @@ const dom = {
8787
extraLinkItem.innerText = name
8888
resultBody.querySelector('.col-links').appendChild(extraLinkItem)
8989

90-
if (format_type === 'image') {
91-
images.push({ path: content, name })
90+
if (['image', 'video'].includes(format_type)) {
91+
media.push({ path: content, name, format_type })
9292
}
9393
})
94-
imgViewer.setupImgViewer(resultBody, images)
94+
mediaViewer.setUp(resultBody, media)
9595

9696
// Add custom html from the pytest_html_results_table_row hook
9797
resultsTableRow && insertAdditionalHTML(resultsTableRow, resultBody, 'td')

src/pytest_html/scripts/imgviewer.js

Lines changed: 0 additions & 59 deletions
This file was deleted.
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
class MediaViewer {
2+
constructor(assets) {
3+
this.assets = assets
4+
this.index = 0
5+
}
6+
nextActive() {
7+
this.index = this.index === this.assets.length - 1 ? 0 : this.index + 1
8+
return [this.activeFile, this.index]
9+
}
10+
prevActive() {
11+
this.index = this.index === 0 ? this.assets.length - 1 : this.index -1
12+
return [this.activeFile, this.index]
13+
}
14+
15+
get currentIndex() {
16+
return this.index
17+
}
18+
get activeFile() {
19+
return this.assets[this.index]
20+
}
21+
}
22+
23+
24+
const setUp = (resultBody, assets) => {
25+
if (!assets.length) {
26+
resultBody.querySelector('.media').classList.add('hidden')
27+
return
28+
}
29+
30+
const mediaViewer = new MediaViewer(assets)
31+
const leftArrow = resultBody.querySelector('.media-container__nav--left')
32+
const rightArrow = resultBody.querySelector('.media-container__nav--right')
33+
const mediaName = resultBody.querySelector('.media__name')
34+
const counter = resultBody.querySelector('.media__counter')
35+
const imageEl = resultBody.querySelector('img')
36+
const sourceEl = resultBody.querySelector('source')
37+
const videoEl = resultBody.querySelector('video')
38+
39+
const setImg = (media, index) => {
40+
if (media?.format_type === 'image') {
41+
imageEl.src = media.path
42+
43+
imageEl.classList.remove('hidden')
44+
videoEl.classList.add('hidden')
45+
} else if (media?.format_type === 'video') {
46+
sourceEl.src = media.path
47+
48+
videoEl.classList.remove('hidden')
49+
imageEl.classList.add('hidden')
50+
}
51+
52+
mediaName.innerText = media?.name
53+
counter.innerText = `${index + 1} / ${assets.length}`
54+
}
55+
setImg(mediaViewer.activeFile, mediaViewer.currentIndex)
56+
57+
const moveLeft = () => {
58+
const [media, index] = mediaViewer.prevActive()
59+
setImg(media, index)
60+
}
61+
const doRight = () => {
62+
const [media, index] = mediaViewer.nextActive()
63+
setImg(media, index)
64+
}
65+
const openImg = () => {
66+
window.open(mediaViewer.activeFile.path, '_blank')
67+
}
68+
69+
leftArrow.addEventListener('click', moveLeft)
70+
rightArrow.addEventListener('click', doRight)
71+
imageEl.addEventListener('click', openImg)
72+
}
73+
74+
exports.setUp = setUp

src/pytest_html/scripts/test_data.js

Lines changed: 0 additions & 5 deletions
This file was deleted.

0 commit comments

Comments
 (0)