main
vue 122 lines 3.15 KB
Raw
1 <template>
2 <div class="customer-ai-triggers flex flex-col gap-4">
3 <transition name="form-fade" mode="out-in">
4 <div v-if="showForm" class="flex flex-col gap-4">
5 <h4>Create an AI Trigger</h4>
6 <CustomerAITriggersForm :customer-code @mounted="formCTX = $event" @submitted="refreshList()">
7 <template #additionalActions="{ loading: loadingForm }">
8 <n-button :disabled="loadingForm" @click="closeForm()">Close</n-button>
9 </template>
10 </CustomerAITriggersForm>
11 </div>
12 <div v-else class="flex flex-col gap-4">
13 <n-spin :show="loading" class="min-h-48">
14 <template v-if="list.length">
15 <div class="min-h-52">
16 <CustomerAITriggersItem
17 v-for="item of list"
18 :key="item.id"
19 :ai-trigger="item"
20 embedded
21 class="item-appear item-appear-bottom item-appear-005 mb-2"
22 @updated="getAITriggers()"
23 />
24 </div>
25 </template>
26 <template v-else>
27 <n-empty v-if="!loading" class="h-48 justify-center">
28 <div class="flex flex-col items-center gap-4">
29 <p>No AI Trigger found</p>
30
31 <n-button size="small" type="primary" @click="openForm()">
32 <template #icon>
33 <Icon :name="AddIcon" :size="14" />
34 </template>
35 Create an AI Trigger
36 </n-button>
37 </div>
38 </n-empty>
39 </template>
40 </n-spin>
41 </div>
42 </transition>
43 </div>
44 </template>
45
46 <script setup lang="ts">
47 import type { AITrigger } from "@/types/incidentManagement/aiTriggers.d"
48 import { NButton, NEmpty, NSpin, useMessage } from "naive-ui"
49 import { defineAsyncComponent, onBeforeMount, ref } from "vue"
50 import Api from "@/api"
51 import Icon from "@/components/common/Icon.vue"
52
53 const { customerCode } = defineProps<{
54 customerCode: string
55 }>()
56 const CustomerAITriggersItem = defineAsyncComponent(() => import("./CustomerAITriggersItem.vue"))
57 const CustomerAITriggersForm = defineAsyncComponent(() => import("./CustomerAITriggersForm.vue"))
58
59 const AddIcon = "carbon:add-alt"
60
61 const message = useMessage()
62 const showForm = ref(false)
63 const loading = ref(false)
64 const list = ref<AITrigger[]>([])
65 const formCTX = ref<{ reset: (aiTrigger?: AITrigger) => void } | null>(null)
66
67 function getAITriggers() {
68 loading.value = true
69
70 Api.incidentManagement.aiTriggers
71 .getAITriggers(customerCode)
72 .then(res => {
73 if (res.data.success) {
74 list.value = res.data?.ai_triggers || []
75 } else {
76 message.warning(res.data?.message || "An error occurred. Please try again later.")
77 }
78 })
79 .catch(err => {
80 message.error(err.response?.data?.message || "An error occurred. Please try again later.")
81 })
82 .finally(() => {
83 loading.value = false
84 })
85 }
86
87 function openForm() {
88 showForm.value = true
89 }
90
91 function closeForm() {
92 showForm.value = false
93 }
94
95 function refreshList() {
96 closeForm()
97 getAITriggers()
98 }
99
100 onBeforeMount(() => {
101 getAITriggers()
102 })
103 </script>
104
105 <style lang="scss" scoped>
106 .customer-ai-triggers {
107 .form-fade-enter-active,
108 .form-fade-leave-active {
109 transition:
110 opacity 0.2s ease-in-out,
111 transform 0.3s ease-in-out;
112 }
113 .form-fade-enter-from {
114 opacity: 0;
115 transform: translateY(10px);
116 }
117 .form-fade-leave-to {
118 opacity: 0;
119 transform: translateY(-10px);
120 }
121 }
122 </style>