Remediate the 2026-09-03 feature-test findings
This commit is contained in:
@@ -47,6 +47,15 @@
|
||||
<img :src="withBase(slide.url)" :alt="slide.filename" class="thumb"
|
||||
@mouseenter="previewSlide = slide" @mouseleave="previewSlide = null" />
|
||||
<span class="fname" :title="slide.filename">{{ slide.filename }}</span>
|
||||
<!-- Per-slide hold time. The API and the feed have always carried
|
||||
`seconds`, and the manager offered no way to set it, so the one
|
||||
documented per-slide control was API-only. 0 means "use the
|
||||
default interval", which is what the feed already does. -->
|
||||
<label class="seconds" title="Seconds to hold this slide (0 = default)">
|
||||
<input type="number" min="0" max="600" :value="slide.seconds"
|
||||
@change="setSeconds(slide, $event.target.value)" />
|
||||
<span class="seconds-unit">s</span>
|
||||
</label>
|
||||
<div class="move">
|
||||
<button class="btn btn-sm btn-secondary" :disabled="idx === 0" @click="move(idx, -1)" title="Move up">↑</button>
|
||||
<button class="btn btn-sm btn-secondary" :disabled="idx === slides.length - 1" @click="move(idx, 1)" title="Move down">↓</button>
|
||||
@@ -73,6 +82,8 @@
|
||||
import { ref, computed, onMounted } from 'vue'
|
||||
import { slidesApi } from '@/api'
|
||||
import { withBase } from '@/utils/basePath'
|
||||
import { useToast } from '@/composables/toast'
|
||||
import { apiError } from '@/utils/apiError'
|
||||
|
||||
// Slide currently hovered, shown enlarged. Null when the cursor is elsewhere.
|
||||
const previewSlide = ref(null)
|
||||
@@ -133,6 +144,7 @@ const surfaces = [
|
||||
{ key: 'shopfloor', label: 'Shopfloor Screensaver' }
|
||||
]
|
||||
const surface = ref('lobby')
|
||||
const toast = useToast()
|
||||
const slides = ref([])
|
||||
const selected = ref([])
|
||||
const loading = ref(true)
|
||||
@@ -176,6 +188,22 @@ async function onUpload(event) {
|
||||
}
|
||||
}
|
||||
|
||||
async function setSeconds(slide, raw) {
|
||||
const seconds = Math.max(0, Math.min(600, Number(raw) || 0))
|
||||
if (seconds === slide.seconds) return
|
||||
try {
|
||||
await slidesApi.update(surface.value, slide.slideid, { seconds })
|
||||
slide.seconds = seconds
|
||||
toast.success(seconds
|
||||
? `${slide.filename} holds for ${seconds}s`
|
||||
: `${slide.filename} uses the default interval`)
|
||||
} catch (err) {
|
||||
console.error('Error setting slide seconds:', err)
|
||||
toast.error(apiError(err, 'Could not set the hold time'))
|
||||
await load()
|
||||
}
|
||||
}
|
||||
|
||||
async function move(idx, delta) {
|
||||
const target = idx + delta
|
||||
if (target < 0 || target >= slides.value.length) return
|
||||
@@ -197,6 +225,17 @@ onMounted(load)
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.seconds {
|
||||
align-items: center;
|
||||
display: inline-flex;
|
||||
gap: 0.25rem;
|
||||
}
|
||||
.seconds input {
|
||||
width: 4.5rem;
|
||||
}
|
||||
.seconds-unit {
|
||||
color: var(--text-light);
|
||||
}
|
||||
.tabs {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
|
||||
Reference in New Issue
Block a user