main
vue 180 lines 4.68 KB
Raw
1 <template>
2 <div>
3 <CardEntity hoverable>
4 <template #header>{{ alert.name }}</template>
5 <template #default>{{ alert.value }}</template>
6 <template #footerMain>
7 <Badge :type="isEnabled ? 'active' : 'muted'">
8 <template #iconRight>
9 <Icon :name="isEnabled ? EnabledIcon : DisabledIcon" :size="13" />
10 </template>
11 <template #label>
12 <span class="whitespace-nowrap">
13 {{ isEnabled ? "Enabled" : "Not Enabled" }}
14 </span>
15 </template>
16 </Badge>
17 </template>
18 <template #footerExtra>
19 <n-button
20 v-if="!isEnabled"
21 :loading="loadingProvision"
22 type="success"
23 size="small"
24 secondary
25 @click="openFormDialog()"
26 >
27 <template #icon>
28 <Icon :name="EnableIcon" />
29 </template>
30 Enable
31 </n-button>
32 </template>
33 </CardEntity>
34
35 <n-modal
36 v-model:show="showFormDialog"
37 :title="alert.name"
38 preset="card"
39 segmented
40 :mask-closable="false"
41 :close-on-esc="false"
42 :style="{ maxWidth: 'min(500px, 90vw)', minHeight: 'min(350px, 90vh)', overflow: 'hidden' }"
43 >
44 <n-spin :show="loadingProvision">
45 <n-form ref="formRef" :model="formModel" :rules="formRules">
46 <n-form-item path="searchWithinLast" label="Search Within Last (time in seconds)">
47 <n-input-number
48 v-model:value="formModel.searchWithinLast"
49 :min="1"
50 placeholder="Input time in seconds"
51 clearable
52 class="w-full"
53 @keydown.enter.prevent
54 />
55 </n-form-item>
56 <n-form-item path="executeEvery" label="Execute Every (time in seconds)">
57 <n-input-number
58 v-model:value="formModel.executeEvery"
59 :min="1"
60 placeholder="Input time in seconds"
61 clearable
62 class="w-full"
63 @keydown.enter.prevent
64 />
65 </n-form-item>
66 </n-form>
67 </n-spin>
68 <template #footer>
69 <div class="flex justify-end gap-3">
70 <n-button @click="closeFormDialog()">Close</n-button>
71 <n-button :loading="loadingProvision" type="success" @click="validateForm">Enable</n-button>
72 </div>
73 </template>
74 </n-modal>
75 </div>
76 </template>
77
78 <script setup lang="ts">
79 // TODO-FE: refactor
80 import type { FormRules, FormValidationError } from "naive-ui"
81 import type { ProvisionsMonitoringAlertParams } from "@/api/endpoints/monitoringAlerts"
82 import type { AvailableMonitoringAlert } from "@/types/monitoringAlerts.d"
83 import { NButton, NForm, NFormItem, NInputNumber, NModal, NSpin, useMessage } from "naive-ui"
84 import { ref } from "vue"
85 import Api from "@/api"
86 import Badge from "@/components/common/Badge.vue"
87 import CardEntity from "@/components/common/cards/CardEntity.vue"
88 import Icon from "@/components/common/Icon.vue"
89
90 const { alert, isEnabled } = defineProps<{ alert: AvailableMonitoringAlert; isEnabled: boolean }>()
91
92 const emit = defineEmits<{
93 (e: "provisioned"): void
94 }>()
95
96 const DisabledIcon = "carbon:subtract"
97 const EnabledIcon = "ph:check-bold"
98 const EnableIcon = "carbon:play"
99
100 const loadingProvision = ref(false)
101 const showFormDialog = ref(false)
102 const message = useMessage()
103
104 const formRef = ref()
105 const formModel = ref<{ searchWithinLast: null | number; executeEvery: null | number }>(getClearFormModel())
106 const formRules: FormRules = {
107 searchWithinLast: [
108 {
109 required: true
110 }
111 ],
112 executeEvery: [
113 {
114 required: true
115 }
116 ]
117 }
118
119 function getClearFormModel() {
120 return {
121 searchWithinLast: null,
122 executeEvery: null
123 }
124 }
125
126 function resetFormModel() {
127 formModel.value = getClearFormModel()
128 }
129
130 function openFormDialog() {
131 resetFormModel()
132 showFormDialog.value = true
133 }
134
135 function closeFormDialog() {
136 resetFormModel()
137 showFormDialog.value = false
138 }
139
140 function validateForm(e: MouseEvent) {
141 e.preventDefault()
142 formRef.value?.validate((errors: Array<FormValidationError> | undefined) => {
143 if (!errors) {
144 provisionsMonitoringAlert()
145 } else {
146 for (const err of errors) {
147 message.error(err[0]?.message ?? "Invalid fields")
148 }
149 }
150 })
151 }
152
153 function provisionsMonitoringAlert() {
154 if (formModel.value.searchWithinLast && formModel.value.executeEvery) {
155 loadingProvision.value = true
156
157 const params: ProvisionsMonitoringAlertParams = {
158 searchWithinLast: formModel.value.searchWithinLast,
159 executeEvery: formModel.value.executeEvery
160 }
161
162 Api.monitoringAlerts
163 .provisionsMonitoringAlert(alert.name, params)
164 .then(res => {
165 if (res.data.success) {
166 message.success(res.data?.message || `Monitoring alert ${alert.name} provisioned successfully`)
167 emit("provisioned")
168 } else {
169 message.warning(res.data?.message || "An error occurred. Please try again later.")
170 }
171 })
172 .catch(err => {
173 message.error(err.response?.data?.message || "An error occurred. Please try again later.")
174 })
175 .finally(() => {
176 loadingProvision.value = false
177 })
178 }
179 }
180 </script>