main
vue 116 lines 2.59 KB
Raw
1 <template>
2 <n-popselect
3 v-model:value="userSelected"
4 v-model:show="usersListVisible"
5 :options="usersOptions"
6 :disabled="loadingUsers"
7 size="medium"
8 scrollable
9 to="body"
10 >
11 <slot :loading="loadingUsers" />
12 </n-popselect>
13 </template>
14
15 <script setup lang="ts">
16 import type { Ref } from "vue"
17 import type { Alert } from "@/types/incidentManagement/alerts.d"
18 import { NPopselect, useMessage } from "naive-ui"
19 import { computed, inject, onBeforeMount, ref, toRefs, watch } from "vue"
20 import Api from "@/api"
21
22 const props = defineProps<{
23 alert: Alert
24 }>()
25 const emit = defineEmits<{
26 (e: "updated", value: Alert): void
27 }>()
28
29 const { alert } = toRefs(props)
30
31 const loadingUsers = ref(false)
32 const users = inject<Ref<string[]>>("assignable-users", ref([]))
33 const message = useMessage()
34 const usersListVisible = ref(false)
35 const assignedTo = computed(() => alert.value.assigned_to)
36 const usersOptions = ref<
37 {
38 label: string
39 value: string
40 }[]
41 >([])
42 const userSelected = ref<string | null>(null)
43
44 function getUsers() {
45 loadingUsers.value = true
46
47 Api.incidentManagement.alerts
48 .getAvailableUsers()
49 .then(res => {
50 if (res.data.success) {
51 const usersList = res.data?.available_users || []
52 parseUsers(usersList)
53 } else {
54 message.warning(res.data?.message || "An error occurred. Please try again later.")
55 }
56 })
57 .catch(err => {
58 message.error(err.response?.data?.message || "An error occurred. Please try again later.")
59 })
60 .finally(() => {
61 loadingUsers.value = false
62 })
63 }
64
65 function assignUser() {
66 if (userSelected.value && userSelected.value !== assignedTo.value) {
67 loadingUsers.value = true
68
69 Api.incidentManagement.alerts
70 .updateAlertAssignedUser(alert.value.id, userSelected.value)
71 .then(res => {
72 if (res.data.success) {
73 emit("updated", { ...alert.value, assigned_to: userSelected.value })
74 } else {
75 message.warning(res.data?.message || "An error occurred. Please try again later.")
76 }
77 })
78 .catch(err => {
79 message.error(err.response?.data?.message || "An error occurred. Please try again later.")
80 })
81 .finally(() => {
82 loadingUsers.value = false
83 })
84 }
85 }
86
87 function parseUsers(users: string[]) {
88 usersOptions.value = users.map(o => ({ label: o, value: o }))
89 }
90
91 watch(users, val => {
92 if (val !== undefined && val.length) {
93 parseUsers(val)
94 }
95 })
96
97 watch(userSelected, () => {
98 assignUser()
99 })
100
101 watch(usersListVisible, val => {
102 if (val && !usersOptions.value.length) {
103 getUsers()
104 }
105 })
106
107 onBeforeMount(() => {
108 if (assignedTo.value) {
109 userSelected.value = assignedTo.value
110 }
111
112 if (users.value.length) {
113 parseUsers(users.value)
114 }
115 })
116 </script>