Newer
Older
gn-synapse / frontend / src / views / MyEventsView.vue
<!-- Личный раздел: события, которые правила маршрутизации отправили в канал
     user с адресатом этим пользователем (payload.user_id == sub). Настройка
     «что сюда попадает» — в правилах (админка). -->
<script setup>
import { onMounted, ref } from "vue";
import { GnBadge, GnLoader, GnPageHeader, GnStatusCard, GnTable } from "gnexus-ui-kit/vue";
import { useToast } from "gnexus-ui-kit/vue";
import { api } from "../api.js";
import { fmtTime, priorityVariant, th, truncate } from "../ui.js";

const toast = useToast();

const rows = ref([]);
const loading = ref(true);
const error = ref("");

const PRIORITY_TIP = "Приоритет события из конверта: low, normal, high, critical";

async function load() {
  loading.value = true;
  error.value = "";
  try {
    rows.value = await api.myEvents({ limit: 200 });
  } catch (ex) {
    error.value = ex.message;
    toast.error(ex.message);
  } finally {
    loading.value = false;
  }
}

onMounted(load);
</script>

<template>
  <main class="container page">
    <GnPageHeader
      kicker="Synapse"
      title="Мои события"
      subtitle="События, направленные лично вам правилами маршрутизации: что случилось и что об этом сказали"
    />

    <GnLoader v-if="loading" circle label="Загрузка…" />
    <GnStatusCard v-else-if="error" variant="error" icon="ph-warning-circle" :text="error" />
    <template v-else>
      <GnTable
        :rows="rows"
        empty-text="Пока нет событий, направленных лично вам: они появляются, когда правило маршрутизации отправляет событие в канал user"
        :columns="[
          { key: 'delivered_at', label: 'Время' },
          { key: 'event', label: 'Событие' },
          { key: 'priority', label: th('Приоритет', PRIORITY_TIP) },
          { key: 'rendered_message', label: 'Сообщение' },
        ]"
      >
        <template #cell-delivered_at="{ row }">{{ fmtTime(row.delivered_at || row.created_at) }}</template>
        <template #cell-event="{ row }">
          {{ row.source_name }}.{{ row.subject }}.{{ row.action }}
        </template>
        <template #cell-priority="{ value }">
          <GnBadge :variant="priorityVariant(value)" outline>{{ value }}</GnBadge>
        </template>
        <template #cell-rendered_message="{ value }">
          <span :title="value || ''">{{ truncate(value, 80) || "—" }}</span>
        </template>
      </GnTable>
    </template>
  </main>
</template>

<style scoped>
.page {
  max-width: 1440px;
  margin-inline: auto;
  padding-block: var(--gn-space-6);
  display: flex;
  flex-direction: column;
  gap: var(--gn-space-4);
}
.event-sep {
  opacity: 0.4;
  font-size: 0.85em;
}
</style>