Files
security-alert-center/frontend/src/components/ReportBodyCard.vue
T
PapaTramp befaf86bf4 feat: readable report and host detail layout in web UI (0.9.8)
Field grid for event/host cards, human-readable daily report labels,
and normalized plain-text report bodies.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-11 10:25:53 +10:00

59 lines
1.9 KiB
Vue

<template>
<div class="report-card">
<div v-if="statEntries.length" class="report-stats">
<div v-for="item in statEntries" :key="item.key" class="report-stat">
<div class="report-stat-value">{{ item.value }}</div>
<div class="report-stat-label">{{ item.label }}</div>
</div>
</div>
<ul v-if="activeUserLines.length && !plainBody" class="report-active-users">
<li v-for="(line, idx) in activeUserLines" :key="idx">{{ line }}</li>
</ul>
<div v-if="htmlContent" class="report-body-html" v-html="htmlContent" />
<pre v-else-if="plainBody" class="report-body-plain">{{ plainBody }}</pre>
<p v-else-if="summary && summary !== 'Отчёт за сутки'" class="report-fallback">{{ summary }}</p>
<p v-else class="report-empty">
Полный текст отчёта не сохранён (старая версия агента). Обновите агент и дождитесь следующего
ежедневного отчёта.
</p>
</div>
</template>
<script setup lang="ts">
import { computed } from "vue";
import {
reportActiveUserLines,
normalizeReportPlainText,
reportBodyFromDetails,
reportHtmlFromDetails,
reportStatEntries,
reportStatsFromDetails,
sanitizeAgentHtml,
} from "../utils/reportDisplay";
const props = defineProps<{
type: string;
summary: string;
details: Record<string, unknown> | null;
}>();
const stats = computed(() => reportStatsFromDetails(props.details, props.type));
const statEntries = computed(() => reportStatEntries(stats.value, props.type));
const activeUserLines = computed(() => reportActiveUserLines(stats.value, props.type));
const htmlContent = computed(() => {
const raw = reportHtmlFromDetails(props.details);
return raw ? sanitizeAgentHtml(raw) : null;
});
const plainBody = computed(() => {
const raw = reportBodyFromDetails(props.details);
return raw ? normalizeReportPlainText(raw) : null;
});
</script>