1
0
mirror of https://github.com/TwiN/gatus.git synced 2026-02-16 06:21:10 +00:00

fix(ui): Handle refresh properly on SuiteDetails.vue (#1324)

This commit is contained in:
TwiN
2025-10-12 14:27:43 -04:00
committed by GitHub
parent e37024dfc6
commit 8920bdd301
3 changed files with 23 additions and 11 deletions

View File

@@ -14,7 +14,7 @@
<p class="text-muted-foreground mt-2"> <p class="text-muted-foreground mt-2">
<span v-if="suite?.group">{{ suite.group }} </span> <span v-if="suite?.group">{{ suite.group }} </span>
<span v-if="latestResult"> <span v-if="latestResult">
{{ selectedResult && selectedResult !== sortedResults[0] ? 'Ran' : 'Last run' }} {{ formatRelativeTime(latestResult.timestamp) }} {{ selectedResult && selectedResult.timestamp !== sortedResults[0]?.timestamp ? 'Ran' : 'Last run' }} {{ formatRelativeTime(latestResult.timestamp) }}
</span> </span>
</p> </p>
</div> </div>
@@ -41,7 +41,7 @@
<!-- Latest Execution --> <!-- Latest Execution -->
<Card v-if="latestResult"> <Card v-if="latestResult">
<CardHeader> <CardHeader>
<CardTitle>Latest Execution</CardTitle> <CardTitle>{{ selectedResult?.timestamp === sortedResults[0]?.timestamp ? 'Latest Execution' : `Execution at ${formatTimestamp(selectedResult.timestamp)}` }}</CardTitle>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<div class="space-y-4"> <div class="space-y-4">
@@ -107,7 +107,7 @@
:key="index" :key="index"
class="flex items-center justify-between p-3 border rounded-lg hover:bg-accent/50 transition-colors cursor-pointer" class="flex items-center justify-between p-3 border rounded-lg hover:bg-accent/50 transition-colors cursor-pointer"
@click="selectedResult = result" @click="selectedResult = result"
:class="{ 'bg-accent': selectedResult === result }" :class="{ 'bg-accent': selectedResult && selectedResult.timestamp === result.timestamp }"
> >
<div class="flex items-center gap-3"> <div class="flex items-center gap-3">
<StatusBadge :status="result.success ? 'healthy' : 'unhealthy'" size="sm" /> <StatusBadge :status="result.success ? 'healthy' : 'unhealthy'" size="sm" />
@@ -184,20 +184,30 @@ const latestResult = computed(() => {
// Methods // Methods
const fetchData = async () => { const fetchData = async () => {
loading.value = true // Don't show loading state on refresh to prevent UI flicker
const isInitialLoad = !suite.value
if (isInitialLoad) {
loading.value = true
}
try { try {
const response = await fetch(`${SERVER_URL}/api/v1/suites/${route.params.key}/statuses`, { const response = await fetch(`${SERVER_URL}/api/v1/suites/${route.params.key}/statuses`, {
credentials: 'include' credentials: 'include'
}) })
if (response.status === 200) { if (response.status === 200) {
const data = await response.json() const data = await response.json()
const oldSuite = suite.value
suite.value = data suite.value = data
if (data.results && data.results.length > 0 && !selectedResult.value) { if (data.results && data.results.length > 0) {
// Sort results by timestamp to get the most recent one // Sort results by timestamp to get the most recent one
const sorted = [...data.results].sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)) const sorted = [...data.results].sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp))
selectedResult.value = sorted[0] // Update selectedResult if: no result selected, or currently viewing the latest result
const wasViewingLatest = !selectedResult.value ||
(oldSuite?.results && selectedResult.value.timestamp === [...oldSuite.results].sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp))[0]?.timestamp)
if (wasViewingLatest) {
selectedResult.value = sorted[0]
}
} }
} else if (response.status === 404) { } else if (response.status === 404) {
suite.value = null suite.value = null
@@ -207,7 +217,9 @@ const fetchData = async () => {
} catch (error) { } catch (error) {
console.error('[SuiteDetails][fetchData] Error:', error) console.error('[SuiteDetails][fetchData] Error:', error)
} finally { } finally {
loading.value = false if (isInitialLoad) {
loading.value = false
}
} }
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long