main
vue 127 lines 2.72 KB
Raw
1 <template>
2 <n-popselect
3 v-model:value="userSelected"
4 v-model:show="ownerListVisible"
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 { SocAlert } from "@/types/soc/alert.d"
17 import type { SocUser } from "@/types/soc/user.d"
18 import { NPopselect, useMessage } from "naive-ui"
19 import { computed, onBeforeMount, ref, toRefs, watch } from "vue"
20 import Api from "@/api"
21
22 const props = defineProps<{
23 alert: SocAlert
24 users?: SocUser[]
25 }>()
26 const emit = defineEmits<{
27 (e: "updated", value: SocAlert): void
28 }>()
29
30 const { alert, users } = toRefs(props)
31
32 const loadingUsers = ref(false)
33 const message = useMessage()
34
35 const ownerListVisible = ref(false)
36 const ownerId = computed(() => alert.value.owner?.id)
37 const usersOptions = ref<
38 {
39 label: string
40 value: number
41 }[]
42 >([])
43 const userSelected = ref<number | null>(null)
44
45 function getUsers() {
46 loadingUsers.value = true
47
48 Api.soc
49 .getUsers()
50 .then(res => {
51 if (res.data.success) {
52 const usersList = res.data?.users || []
53 parseUsers(usersList)
54 } else {
55 message.warning(res.data?.message || "An error occurred. Please try again later.")
56 }
57 })
58 .catch(err => {
59 message.error(err.response?.data?.message || "An error occurred. Please try again later.")
60 })
61 .finally(() => {
62 loadingUsers.value = false
63 })
64 }
65
66 function assignUser() {
67 if (userSelected.value !== ownerId.value) {
68 loadingUsers.value = true
69
70 const method = userSelected.value ? "assignUserToAlert" : "removeUserAlertAssign"
71 const userId = userSelected.value ? userSelected.value : ownerId.value || 0
72
73 Api.soc[method](alert.value.alert_id.toString(), userId.toString())
74 .then(res => {
75 if (res.data.success) {
76 emit("updated", res.data.alert)
77 } else {
78 message.warning(res.data?.message || "An error occurred. Please try again later.")
79 }
80 })
81 .catch(err => {
82 message.error(err.response?.data?.message || "An error occurred. Please try again later.")
83 })
84 .finally(() => {
85 loadingUsers.value = false
86 })
87 }
88 }
89
90 function parseUsers(users: SocUser[]) {
91 usersOptions.value = users.map(o => ({ label: `#${o.user_id}${o.user_login}`, value: o.user_id }))
92
93 usersOptions.value.push({
94 label: "- Set default owner -",
95 value: 0
96 })
97 }
98
99 watch(
100 () => users?.value,
101 val => {
102 if (val !== undefined && val.length) {
103 parseUsers(val)
104 }
105 }
106 )
107
108 watch(userSelected, () => {
109 assignUser()
110 })
111
112 watch(ownerListVisible, val => {
113 if (val && !usersOptions.value.length) {
114 getUsers()
115 }
116 })
117
118 onBeforeMount(() => {
119 if (ownerId.value) {
120 userSelected.value = ownerId.value
121 }
122
123 if (users?.value?.length) {
124 parseUsers(users.value)
125 }
126 })
127 </script>