feature: Improve dashboard functionality

This commit is contained in:
voltsrage
2026-06-23 20:19:32 +08:00
parent dd0fd88731
commit 79b6d9d85e
60 changed files with 2857 additions and 164 deletions
+74 -4
View File
@@ -1,15 +1,42 @@
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import * as alertsApi from '@/api/alerts'
import { detectNewCriticalAlerts } from '@/composables/criticalAlertDetect'
export const useAlertStore = defineStore('alerts', () => {
const alerts = ref([])
const loading = ref(false)
const statusFilter = ref(null)
const lastSeenAlertIds = ref([])
const bannerAlerts = ref([])
const pollSeeded = ref(false)
const openAlerts = computed(() => alerts.value.filter(a => a.status === 'Open'))
const criticalAlerts = computed(() => alerts.value.filter(a => a.severity === 'Critical'))
function mergeBannerAlerts(newAlerts) {
const existingIds = new Set(bannerAlerts.value.map(alert => alert.id))
const merged = [...bannerAlerts.value]
for (const alert of newAlerts) {
if (!existingIds.has(alert.id)) merged.push(alert)
}
bannerAlerts.value = merged
}
function applyPollResults(items) {
const { newAlerts, nextSeenIds, seeded } = detectNewCriticalAlerts(
items,
lastSeenAlertIds.value,
pollSeeded.value,
)
lastSeenAlertIds.value = nextSeenIds
pollSeeded.value = seeded
if (newAlerts.length > 0) {
mergeBannerAlerts(newAlerts)
}
return newAlerts
}
async function loadAlerts(encounterId, status) {
loading.value = true
try {
@@ -35,17 +62,60 @@ export const useAlertStore = defineStore('alerts', () => {
}
}
async function pollOpenAlerts() {
try {
const items = await alertsApi.fetchAllOpenAlerts()
alerts.value = items
return applyPollResults(items)
} catch (e) {
console.error('Failed to poll alerts', e)
return []
}
}
function dismissBannerAlert(alertId) {
bannerAlerts.value = bannerAlerts.value.filter(alert => alert.id !== alertId)
}
function dismissAllBannerAlerts() {
bannerAlerts.value = []
}
async function acknowledge(alertId, note) {
await alertsApi.acknowledgeAlert(alertId, note)
const updated = await alertsApi.acknowledgeAlert(alertId, note || undefined)
const alert = alerts.value.find(a => a.id === alertId)
if (alert) alert.status = 'Acknowledged'
if (alert) {
alert.status = updated.status ?? 'Acknowledged'
alert.acknowledgedBy = updated.acknowledgedBy ?? alert.acknowledgedBy
alert.acknowledgedAt = updated.acknowledgedAt ?? alert.acknowledgedAt
}
dismissBannerAlert(alertId)
return updated
}
async function resolve(alertId) {
await alertsApi.resolveAlert(alertId)
const alert = alerts.value.find(a => a.id === alertId)
if (alert) alert.status = 'Resolved'
dismissBannerAlert(alertId)
}
return { alerts, loading, statusFilter, openAlerts, criticalAlerts, loadAlerts, loadGlobalAlerts, acknowledge, resolve }
})
return {
alerts,
loading,
statusFilter,
lastSeenAlertIds,
bannerAlerts,
pollSeeded,
openAlerts,
criticalAlerts,
loadAlerts,
loadGlobalAlerts,
pollOpenAlerts,
dismissBannerAlert,
dismissAllBannerAlerts,
acknowledge,
resolve,
applyPollResults,
}
})