feat: RDG 302/303 display path labels and RDS session break (0.3.1)

Show RDS access via RDG-Comp or Haproxy-RDG-Comp, enable qwinsta/logoff on any RDG event with internal_ip.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-22 19:52:22 +10:00
parent 4eb41608ea
commit 24ca87a47a
19 changed files with 468 additions and 32 deletions
+9 -3
View File
@@ -7,18 +7,23 @@
<p v-else-if="loading">Загрузка</p>
<template v-else-if="event">
<h1>{{ event.title }}</h1>
<p v-if="event.rdg_access_path" class="event-rdg-access-banner">
<RdgAccessBadge :event="event" />
<span class="muted">Вход на рабочий ПК через RD Gateway.</span>
</p>
<p v-if="hasRdgFlapUi(event)" class="event-rdg-flap-banner">
<RdgFlapBadge :event="event" :detail-link-query="backToEventsQuery" />
<span class="muted">302303 за несколько секунд возможна зависшая сессия на ПК пользователя.</span>
</p>
<p v-if="rdgFlapQwinstaEventId(event)" class="event-rdg-actions">
<p v-if="rdgQwinstaEventId(event)" class="event-rdg-actions">
<button
type="button"
class="secondary"
:disabled="qwinstaLoadingId === event.id"
title="qwinsta и завершение сеанса на рабочем ПК"
@click="runQwinsta(event)"
>
qwinsta (RDG flap)
Обрыв RDS
</button>
</p>
<RdgQwinstaModal
@@ -93,11 +98,12 @@
import { computed, onMounted, ref, watch } from "vue";
import { useRoute } from "vue-router";
import { apiFetch, type EventDetail } from "../api";
import RdgAccessBadge from "../components/RdgAccessBadge.vue";
import RdgFlapBadge from "../components/RdgFlapBadge.vue";
import RdgQwinstaModal from "../components/RdgQwinstaModal.vue";
import ReportBodyCard from "../components/ReportBodyCard.vue";
import { useRdgQwinsta } from "../composables/useRdgQwinsta";
import { hasRdgFlapUi, rdgFlapQwinstaEventId } from "../utils/rdgFlap";
import { hasRdgFlapUi, rdgQwinstaEventId } from "../utils/rdgFlap";
import { eventsBackQueryFromDetail } from "../utils/eventsListQuery";
import { dailyReportTypeLabel, isDailyReportType } from "../utils/reportDisplay";