feat: hide event types from SAC UI via Settings checkbox (0.20.23)

Per-type «Показывать в событиях» in severity settings; filters lists, dashboard, hosts, and problems.
This commit is contained in:
PTah
2026-06-21 20:13:40 +10:00
parent 87ac1e09b0
commit bf7c83c408
15 changed files with 313 additions and 60 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
/** Fallback до загрузки /health; при релизе держите в sync с backend/app/version.py */
export const APP_NAME = "Security Alert Center";
export const APP_VERSION = "0.20.22";
export const APP_VERSION = "0.20.23";
export const APP_VERSION_LABEL = `${APP_NAME} v.${APP_VERSION}`;
+24 -8
View File
@@ -397,6 +397,7 @@
<p class="settings-hint settings-hint-top">
Переопределение значимости для новых событий после ingest. Исходное severity агента сохраняется в
<code>details.severity_agent</code>. Пустое значение как прислал агент (см. «По умолчанию»).
Снимите «Показывать в событиях», чтобы скрыть тип из списков SAC (например <code>agent.heartbeat</code>).
</p>
<div class="settings-severity-toolbar">
<input v-model="severityFilter" type="search" placeholder="Фильтр по type…" />
@@ -411,6 +412,7 @@
<th>Тип события</th>
<th>По умолчанию</th>
<th>Effective</th>
<th>Показывать в событиях</th>
</tr>
</thead>
<tbody>
@@ -426,6 +428,12 @@
<option value="critical">critical</option>
</select>
</td>
<td class="settings-severity-show-cell">
<label>
<input v-model="row.show_in_events" type="checkbox" />
показывать
</label>
</td>
</tr>
</tbody>
</table>
@@ -678,10 +686,12 @@ interface SeverityOverrideRowApi {
event_type: string;
default_severity: string;
override_severity: string | null;
show_in_events: boolean;
}
interface SeverityOverrideRowUi extends SeverityOverrideRowApi {
selected: string;
override_show_in_events: boolean;
}
const loading = ref(true);
@@ -868,6 +878,7 @@ function mapSeverityRows(items: SeverityOverrideRowApi[]): SeverityOverrideRowUi
return items.map((row) => ({
...row,
selected: row.override_severity ?? "",
override_show_in_events: row.show_in_events,
}));
}
@@ -884,25 +895,30 @@ async function saveSeverityOverrides() {
success.value = "";
try {
const overrides: Record<string, string | null> = {};
const visibility: Record<string, boolean | null> = {};
for (const row of severityRows.value) {
const prev = row.override_severity ?? "";
const next = row.selected.trim();
if (next === prev) continue;
overrides[row.event_type] = next || null;
const prevSeverity = row.override_severity ?? "";
const nextSeverity = row.selected.trim();
if (nextSeverity !== prevSeverity) {
overrides[row.event_type] = nextSeverity || null;
}
if (row.show_in_events !== (row.override_show_in_events ?? true)) {
visibility[row.event_type] = row.show_in_events ? null : false;
}
}
if (Object.keys(overrides).length === 0) {
error.value = "Нет изменений severity для сохранения";
if (Object.keys(overrides).length === 0 && Object.keys(visibility).length === 0) {
error.value = "Нет изменений для сохранения";
return;
}
const data = await apiFetch<{ items: SeverityOverrideRowApi[] }>(
"/api/v1/settings/notifications/severity-overrides",
{
method: "PUT",
body: JSON.stringify({ overrides }),
body: JSON.stringify({ overrides, visibility }),
},
);
severityRows.value = mapSeverityRows(data.items);
success.value = "Severity по типам событий сохранён.";
success.value = "Severity и видимость событий сохранены.";
} catch (e) {
error.value = e instanceof Error ? e.message : "Ошибка сохранения severity";
} finally {