main
vue 171 lines 4.73 KB
Raw
1 <template>
2 <div>
3 <CardEntity hoverable :highlighted="stream.is_default">
4 <template #headerMain>
5 <div class="flex items-center gap-2">
6 <Icon :name="UserIcon" :size="14" />
7 {{ stream.creator_user_id }}
8 </div>
9 </template>
10 <template #headerExtra>{{ formatDate(stream.created_at, dFormats.datetimesec) }}</template>
11 <template #default>
12 <div class="flex flex-col gap-1">
13 {{ stream.title }}
14
15 <p v-if="stream.description && stream.description !== stream.title">
16 {{ stream.description }}
17 </p>
18 </div>
19 </template>
20 <template #footerMain>
21 <div class="flex flex-wrap items-center gap-3">
22 <Badge :type="stream.disabled ? 'muted' : 'active'">
23 <template #iconRight>
24 <Icon :name="stream.disabled ? DisabledIcon : EnabledIcon" :size="14" />
25 </template>
26 <template #label>Enabled</template>
27 </Badge>
28 <Badge :type="stream.is_default ? 'active' : 'muted'">
29 <template #iconRight>
30 <Icon :name="stream.is_default ? EnabledIcon : DisabledIcon" :size="14" />
31 </template>
32 <template #label>Default</template>
33 </Badge>
34 <Badge :type="stream.is_editable ? 'active' : 'muted'">
35 <template #iconRight>
36 <Icon :name="stream.is_editable ? EnabledIcon : DisabledIcon" :size="14" />
37 </template>
38 <template #label>Editable</template>
39 </Badge>
40 </div>
41 </template>
42 <template #footerExtra>
43 <div class="flex flex-wrap items-center justify-end gap-3">
44 <n-button size="small" @click.stop="showDetails = true">
45 <template #icon>
46 <Icon :name="InfoIcon" />
47 </template>
48 Details
49 </n-button>
50 <n-button
51 v-if="stream.is_editable && !stream.disabled"
52 :loading
53 type="warning"
54 secondary
55 size="small"
56 @click="stop()"
57 >
58 <template #icon>
59 <Icon :name="StopIcon" />
60 </template>
61 Stop stream
62 </n-button>
63 <n-button
64 v-if="stream.is_editable && stream.disabled"
65 :loading
66 type="success"
67 secondary
68 size="small"
69 @click="start()"
70 >
71 <template #icon>
72 <Icon :name="StartIcon" />
73 </template>
74 Start stream
75 </n-button>
76 </div>
77 </template>
78 </CardEntity>
79
80 <n-modal
81 v-model:show="showDetails"
82 preset="card"
83 :style="{ maxWidth: 'min(600px, 90vw)', overflow: 'hidden' }"
84 :title="stream.title"
85 :bordered="false"
86 segmented
87 >
88 <div class="mb-2">
89 Matching type :
90 <code>{{ stream.matching_type }}</code>
91 </div>
92 <div class="mb-2">
93 Remove matches from default stream :
94 <code>{{ stream.remove_matches_from_default_stream }}</code>
95 </div>
96 <div class="mb-1">Rules :</div>
97 <SimpleJsonViewer class="vuesjv-override" :model-value="stream.rules" :initial-expanded-depth="2" />
98 </n-modal>
99 </div>
100 </template>
101
102 <script setup lang="ts">
103 import type { Stream } from "@/types/graylog/stream.d"
104 import { NButton, NModal, useMessage } from "naive-ui"
105 import { ref, toRefs } from "vue"
106 import { SimpleJsonViewer } from "vue-sjv"
107 import Api from "@/api"
108 import Badge from "@/components/common/Badge.vue"
109 import CardEntity from "@/components/common/cards/CardEntity.vue"
110 import Icon from "@/components/common/Icon.vue"
111 import { useSettingsStore } from "@/stores/settings"
112 import { formatDate } from "@/utils/format"
113 import "@/assets/scss/overrides/vuesjv-override.scss"
114
115 const props = defineProps<{ stream: Stream }>()
116 const { stream } = toRefs(props)
117
118 const UserIcon = "carbon:user"
119 const InfoIcon = "carbon:information"
120 const DisabledIcon = "carbon:subtract"
121 const EnabledIcon = "ph:check-bold"
122 const StopIcon = "carbon:stop"
123 const StartIcon = "carbon:play"
124
125 const message = useMessage()
126 const loading = ref(false)
127 const showDetails = ref(false)
128 const dFormats = useSettingsStore().dateFormat
129
130 function stop() {
131 loading.value = true
132
133 Api.graylog
134 .stopStream(stream.value.id)
135 .then(res => {
136 if (res.data.success) {
137 stream.value.disabled = true
138 message.success(res.data?.message || "Stream stopped.")
139 } else {
140 message.warning(res.data?.message || "An error occurred. Please try again later.")
141 }
142 })
143 .catch(err => {
144 message.error(err.response?.data?.message || "An error occurred. Please try again later.")
145 })
146 .finally(() => {
147 loading.value = false
148 })
149 }
150
151 function start() {
152 loading.value = true
153
154 Api.graylog
155 .startStream(stream.value.id)
156 .then(res => {
157 if (res.data.success) {
158 stream.value.disabled = false
159 message.success(res.data?.message || "Stream started.")
160 } else {
161 message.warning(res.data?.message || "An error occurred. Please try again later.")
162 }
163 })
164 .catch(err => {
165 message.error(err.response?.data?.message || "An error occurred. Please try again later.")
166 })
167 .finally(() => {
168 loading.value = false
169 })
170 }
171 </script>