1010 </div >
1111
1212 <div class =" d-flex justify-end ga-4 mb-8" >
13- <v-btn prepend-icon =" mdi-plus" text =" New Cluster" variant =" tonal" color =" primary" />
13+ <v-btn
14+ prepend-icon =" mdi-plus"
15+ text =" New Cluster"
16+ variant =" tonal"
17+ color =" primary"
18+ :to =" ROUTES.Dashboard.Clusters.Deploy()"
19+ />
1420 <v-btn
1521 prepend-icon =" mdi-trash-can-outline"
1622 color =" error"
1925 border
2026 class =" border-error"
2127 :style =" { '--v-border-opacity': '0.3' }"
28+ :loading =" isDeleting"
29+ :disabled =" deployments.length === 0"
30+ @click =" onDeleteAll()"
2231 />
2332 </div >
2433
5766 :loading =" isLoading"
5867 >
5968 <template #item =" { item } " >
60- <DeploymentRow :deployment =" item" />
69+ <DeploymentRow :deployment =" item" :disabled = " isDeleting " />
6170 </template >
6271 </v-data-table >
72+
73+ <v-dialog
74+ :model-value =" isRevealed"
75+ max-width =" 600"
76+ scrollable
77+ @update:model-value =" cancel()"
78+ >
79+ <v-card >
80+ <v-btn @click =" confirm()" >
81+ Ok
82+ </v-btn >
83+ <v-btn @click =" cancel()" >
84+ Cancel
85+ </v-btn >
86+ </v-card >
87+ </v-dialog >
88+
89+ <v-dialog
90+ :model-value =" addNode.isRevealed.value"
91+ max-width =" 600"
92+ scrollable
93+ @update:model-value =" addNode.cancel()"
94+ >
95+ <v-card >
96+ {{ addNode.data.value }}
97+ </v-card >
98+ </v-dialog >
99+
100+ <v-dialog
101+ :model-value =" deleteDeployment.isRevealed.value"
102+ max-width =" 600"
103+ scrollable
104+ @update:model-value =" deleteDeployment.cancel()"
105+ >
106+ <v-card >
107+ <v-btn @click =" deleteDeployment.confirm()" >
108+ Ok
109+ </v-btn >
110+ <v-btn @click =" deleteDeployment.cancel()" >
111+ Cancel
112+ </v-btn >
113+ </v-card >
114+ </v-dialog >
63115 </div >
64116</template >
65117
66118<script setup lang="ts">
119+ import type { HandlersNodeInput , ServicesClusterData } from " ~/generated/api"
120+
67121const api = useApi ()
122+ const toast = useToast ()
68123
69124const { state : deployments, isLoading } = useAsyncState (async () => {
70125 const { data } = await api .deployments .deploymentsGet ()
@@ -76,4 +131,30 @@ const sortByItems = [
76131 { title: " Created At" , value: " createdAt" },
77132 { title: " Nodes" , value: " nodes" },
78133]
134+
135+ const { isRevealed, reveal, confirm, cancel } = useDialog ()
136+ const { execute : deleteDeployments, isLoading : isDeleting } = useAsyncState (async () => {
137+ const { data } = await api .deployments .deploymentsDelete ()
138+ const id = data .data ?.task_id
139+ if (id && await api .helpers .awaitWorkflowCompletion (id )) {
140+ deployments .value = []
141+ return toast .success ({ message: " Deployments deleted successfully" })
142+ }
143+ toast .error ({ message: data .message ?? " Failed to delete deployments" })
144+ }, null , { immediate: false })
145+
146+ async function onDeleteAll() {
147+ const { isCanceled } = await reveal ()
148+ if (! isCanceled ) {
149+ deleteDeployments ()
150+ }
151+ }
152+
153+ const addNode = useDialog <ServicesClusterData , HandlersNodeInput >()
154+ const deleteDeployment = useDialog <ServicesClusterData >()
155+
156+ provide (DeploymentDialogCtxKey , {
157+ addNode : d => addNode .reveal (d ).then (d => d .data ),
158+ delete : u => deleteDeployment .reveal (u ).then (d => ! d .isCanceled ),
159+ })
79160 </script >
0 commit comments