jcloud/dashboard/src2/components/server/ServerActionCell.vue
2025-04-12 17:39:38 +08:00

164 lines
4.2 KiB
Vue

<template>
<div class="flex items-center justify-between gap-1">
<div>
<h3 class="text-base font-medium">{{ props.actionLabel }}</h3>
<p class="mt-1 text-p-base text-gray-600">{{ props.description }}</p>
</div>
<Button
v-if="server?.pg"
class="whitespace-nowrap"
@click="getServerActionHandler(props.actionLabel)"
>
<p
:class="
group === 'Dangerous Actions' ? 'text-red-600' : 'text-gray-800'
"
>
{{ props.buttonLabel }}
</p>
</Button>
</div>
</template>
<script setup>
import { getCachedDocumentResource, createDocumentResource } from 'jingrow-ui';
import { toast } from 'vue-sonner';
import { confirmDialog } from '../../utils/components';
import router from '../../router';
const props = defineProps({
serverName: { type: String, required: true },
serverType: { type: String, required: true },
actionLabel: { type: String, required: true },
method: { type: String, required: true },
description: { type: String, required: true },
buttonLabel: { type: String, required: true },
group: { type: String, required: false }
});
const server = getCachedDocumentResource(props.serverType, props.serverName);
function getServerActionHandler(action) {
const actionHandlers = {
'Reboot server': onRebootServer,
'Rename server': onRenameServer,
'Drop server': onDropServer
};
if (actionHandlers[action]) {
actionHandlers[action].call(this);
}
}
function onRebootServer() {
confirmDialog({
title: '重启服务器',
message: `您确定要重启服务器 <b>${server.pg.name}</b> 吗?`,
fields: [
{
label: '请输入服务器名称以确认',
fieldname: 'confirmServerName'
}
],
primaryAction: {
label: '重启服务器'
},
onSuccess({ hide, values }) {
if (server.reboot.loading) return;
if (values.confirmServerName !== server.pg.name) {
throw new Error('服务器名称不匹配');
}
toast.promise(
server.reboot.submit(null, {
onSuccess() {
hide();
}
}),
{
loading: '正在重启...',
success: '服务器已重启',
error: '重启服务器失败'
}
);
}
});
}
function onRenameServer() {
confirmDialog({
title: '重命名服务器',
fields: [
{
label: '输入服务器的新名称',
fieldname: 'title'
}
],
primaryAction: {
label: '重命名'
},
onSuccess({ hide, values }) {
if (server.rename.loading) return;
toast.promise(
server.rename.submit(
{
title: values.title
},
{
onSuccess() {
hide();
}
}
),
{
loading: '正在更新名称...',
success: '名称已更新',
error: '更新名称失败'
}
);
}
});
}
function onDropServer() {
const databaseServer = createDocumentResource({
pagetype: 'Database Server',
name: server.pg.database_server
});
confirmDialog({
title: '删除服务器',
message: `<div class="prose text-base">您确定要删除您的服务器吗?<br><br>以下服务器将被删除<ul><li>${server.pg.title} (<b>${server.pg.name}</b>)</li><li>${databaseServer.pg.title} (<b>${server.pg.database_server}</b>)</li></ul><br>此操作无法撤销。</div>`,
fields: [
{
label: "请输入服务器名称或标题以确认",
fieldname: 'confirmServerName'
}
],
primaryAction: {
label: '删除服务器',
theme: 'red'
},
onSuccess({ hide, values }) {
if (server.dropServer.loading) return;
if (
values.confirmServerName !== server.pg.name &&
values.confirmServerName !== server.pg.database_server &&
values.confirmServerName.trim() !== server.pg.title.trim() &&
values.confirmServerName.trim() !== databaseServer.pg.title.trim()
) {
throw new Error('服务器名称不匹配');
}
toast.promise(server.dropServer.submit().then(hide), {
loading: '正在删除...',
success: () => {
router.push({ name: 'Server List' });
return '服务器已删除';
},
error: error =>
error.messages.length
? error.messages.join('\n')
: '删除服务器失败'
});
}
});
}
</script>