Skip to content

Commit 9f483eb

Browse files
add cluster
1 parent c7ef125 commit 9f483eb

File tree

3 files changed

+118
-6
lines changed

3 files changed

+118
-6
lines changed

frontend/kubecloud-v2/components/rows/DeploymentRow.vue

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
size="small"
2222
text="View"
2323
:to="ROUTES.Dashboard.Clusters(deployment.cluster?.name)"
24+
:disabled="disabled"
2425
/>
2526

2627
<v-btn
@@ -32,6 +33,7 @@
3233
:loading="downloading"
3334
:href="binary"
3435
:download="`${deployment.cluster?.name}-kubeconfig.yaml`"
36+
:disabled="disabled"
3537
/>
3638

3739
<v-btn
@@ -41,7 +43,8 @@
4143
size="small"
4244
text="Add Node"
4345
color="primary"
44-
@click="console.log('add node')"
46+
:disabled="disabled"
47+
@click="onAddNode()"
4548
/>
4649

4750
<v-btn
@@ -51,7 +54,8 @@
5154
size="small"
5255
text="Delete"
5356
color="error"
54-
@click="console.log('delete cluster')"
57+
:disabled="disabled"
58+
@click="onDelete()"
5559
/>
5660
</div>
5761
</td>
@@ -61,7 +65,7 @@
6165
<script setup lang="ts">
6266
import type { ServicesClusterData } from "~/generated/api"
6367
64-
const props = defineProps<{ deployment: ServicesClusterData }>()
68+
const props = defineProps<{ deployment: ServicesClusterData, disabled: boolean }>()
6569
defineEmits<{ (e: "view"): void }>()
6670
6771
const createdAt = useDateFormat(() => props.deployment.created_at, DATE_FORMAT)
@@ -83,4 +87,23 @@ const binary = computed(() => {
8387
const blob = new Blob([data], { type: "application/json" })
8488
return URL.createObjectURL(blob)
8589
})
90+
91+
const toast = useToast()
92+
const ctx = inject(DeploymentDialogCtxKey)!
93+
94+
async function onAddNode() {
95+
const result = await ctx.addNode(props.deployment)
96+
// TODO: add node
97+
if (result) {
98+
toast.success({ message: "Node added successfully" })
99+
}
100+
}
101+
102+
async function onDelete() {
103+
const result = await ctx.delete(props.deployment)
104+
// TODO: delete cluster
105+
if (result) {
106+
toast.success({ message: "Deployment deleted successfully" })
107+
}
108+
}
86109
</script>

frontend/kubecloud-v2/composables/contexts.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { HandlersCreditRequestInput, ServicesUserWithUSDBalance } from "../generated/api"
1+
import type { HandlersCreditRequestInput, HandlersNodeInput, ServicesClusterData, ServicesUserWithUSDBalance } from "../generated/api"
22

33
// Dashboard Layout Context
44
export interface DashboardLayoutCtx {
@@ -29,3 +29,11 @@ export interface UserDialogCtx {
2929
}
3030

3131
export const UserDialogCtxKey: InjectionKey<UserDialogCtx> = Symbol("UserDialogCtx")
32+
33+
// Deployment Dialog Context
34+
export interface DeploymentDialogCtx {
35+
addNode: (deployment: ServicesClusterData) => Promise<HandlersNodeInput | undefined>
36+
delete: (deployment: ServicesClusterData) => Promise<boolean>
37+
}
38+
39+
export const DeploymentDialogCtxKey: InjectionKey<DeploymentDialogCtx> = Symbol("DeploymentDialogCtx")

frontend/kubecloud-v2/pages/dashboard/clusters/index.vue

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@
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"
@@ -19,6 +25,9 @@
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

@@ -57,14 +66,60 @@
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+
67121
const api = useApi()
122+
const toast = useToast()
68123
69124
const { 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

Comments
 (0)