@@ -63,6 +63,7 @@ export function ServerDeploymentWorkflow({ open, kind, plugins, endpoints, initi
if ( step === 0 ) return Boolean ( form . pluginId && ( saveAsDraft || form . runEndpointId ) ) ;
if ( step === 2 ) {
if ( kind === "create" && ! form . name . trim ( ) ) return false ;
if ( form . deploymentMode === "existing-server" && ! form . serverRoot . trim ( ) && ! deployment ? . serverRootConfigured ) return false ;
if ( form . deploymentMode === "custom-command" && ! form . startCommand . trim ( ) && ! deployment ? . startCommandConfigured ) return false ;
return pluginFields . filter ( ( field ) = > field . required ) . every ( ( field ) = > Boolean ( form . createInputs [ field . key ] ? . trim ( ) ) ) ;
}
@@ -94,8 +95,10 @@ export function ServerDeploymentWorkflow({ open, kind, plugins, endpoints, initi
{ step === 2 && < div className = "deployment-workflow-body" > < div className = "form-grid" >
{ kind === "create" && < label > 服 务 器 名 称 < input name = "name" value = { form . name } onChange = { updateForm } placeholder = "Example Survival #3" required / > < / label > }
{ kind === "create" && < label > 运 行 预 设 ( 可 选 ) < select name = "profileKey" value = { form . profileKey } onChange = { updateForm } > < option value = "" > 使 用 插 件 默 认 预 设 < / option > { profileOptions . map ( ( profile ) = > < option key = { profile . key } value = { profile . key } > { profile . key } · { profile . mode } < / option > ) } < / select > < small className = "field-help" > 仅 在 插 件 提 供 多 个 兼 容 启 动 预 设 时 选 择 。 < / small > < / label > }
< label > 服 务 器 目 录 < input name = "serverRoot" value = { form . serverRoot } onChange = { updateForm } placeholder = { deployment ? . serverRootConfigured ? "留空保持已配置目录" : "完整绝对路径" } autoComplete = "off" / > < small className = "field-help" > { form . deploymentMode === "existing-server" ? "已有服务器所在目录。" : "服务器文件、数据与配置的主目录。" } < / small > < / label >
{ pluginFields . map ( ( field ) = > (
{ form . deploymentMode === "guided-install" && < label > 安 装 目 录 ( 可 选 ) < input name = "serverRoot" value = { form . serverRoot } onChange = { updateForm } placeholder = { deployment ? . serverRootConfigured ? "留空保持已配置安装 目录" : "由插件默认位置安装,或填写 完整绝对路径" } autoComplete = "off" / > < small className = "field-help" > 新 建 服 务 器 的 安 装 目 标 ; 留 空 时 由 插 件 和 Run 选 择 默 认 位 置 。 < / small > < / label > }
{ form . deploymentMode === "existing-server" && < label > 已 有 服 务 器 目 录 < input name = "serverRoot" value = { form . serverRoot } onChange = { updateForm } placeholder = { deployment ? . serverRootConfigured ? "留空保持已接管目录" : "完整绝对路径" } autoComplete = "off" required = { ! deployment ? . serverRootConfigured } / > < small className = "field-help" > Run 会 先 预 检 目 录 、 插 件 与 端 口 ; 不 会 重 装 或 覆 盖 现 有 游 戏 配 置 。 < / small > < / label > }
{ form . deploymentMode === "custom-command" && < label > 服 务 器 目 录 < input name = "serverRoot" value = { form . serverRoot } onChange = { updateForm } placeholder = { deployment ? . serverRootConfigured ? "留空保持已配置目录" : "完整绝对路径" } autoComplete = "off" / > < small className = "field-help" > 服 务 器 文 件 、 数 据 与 配 置 的 主 目 录 。 < / small > < / label > }
{ form . deploymentMode === "guided-install" && pluginFields . map ( ( field ) = > (
< label key = { field . key } > { field . label } { field . required ? "(必填)" : "" } { field . type === "select" ? (
< select value = { form . createInputs [ field . key ] ? ? "" } onChange = { ( event ) = > updateCreateInput ( field . key , event . target . value ) } required = { field . required } > { ! field . required && < option value = "" > 未 设 置 < / option > } { field . options ? . map ( ( option ) = > < option key = { option } value = { option } > { option } < / option > ) } < / select >
) : (
@@ -103,10 +106,11 @@ export function ServerDeploymentWorkflow({ open, kind, plugins, endpoints, initi
) } < / label >
) ) }
< / div >
{ form . deploymentMode === "existing-server" && < div className = "form-guidance" > < strong > 接 管 只 做 预 检 与 绑 定 < / strong > < span > 不 会 执 行 安 装 命 令 , 也 不 会 把 本 页 的 默 认 游 戏 参 数 写 进 已 有 服 务 器 。 < / span > < / div > }
{ form . deploymentMode === "custom-command" && < details className = "provider-advanced-settings" open > < summary > 高 级 启 动 设 置 < / summary > < p className = "field-help" > 只 有 自 定 义 启 动 器 需 要 这 些 设 置 。 执 行 目 录 留 空 时 , 节 点 以 服 务 器 目 录 执 行 。 < / p > < div className = "form-grid" > < label > 启 动 命 令 < input name = "startCommand" value = { form . startCommand } onChange = { updateForm } placeholder = { deployment ? . startCommandConfigured ? "留空保持已配置启动命令" : "必填,例如 ./start-server" } autoComplete = "off" required = { ! deployment ? . startCommandConfigured } / > < / label > < label > 命 令 解 释 器 < select name = "shell" value = { form . shell } onChange = { updateForm } > < option value = "" > 直 接 argv ( 推 荐 ) < / option > < option value = "posix-sh" > POSIX sh < / option > < option value = "powershell" > PowerShell < / option > < option value = "cmd" > Windows cmd < / option > < / select > < / label > < label > 执 行 目 录 ( 可 选 ) < input name = "workingDirectory" value = { form . workingDirectory } onChange = { updateForm } placeholder = { deployment ? . workingDirectoryConfigured ? "留空保持已配置执行目录" : "默认使用服务器目录" } autoComplete = "off" / > < / label > < label > 安 装 命 令 ( 可 选 ) < input name = "installCommand" value = { form . installCommand } onChange = { updateForm } autoComplete = "off" placeholder = "留空保持原值或不使用" / > < / label > < label > 停 止 命 令 ( 可 选 ) < input name = "stopCommand" value = { form . stopCommand } onChange = { updateForm } autoComplete = "off" / > < / label > < label > 状 态 命 令 ( 可 选 ) < input name = "statusCommand" value = { form . statusCommand } onChange = { updateForm } autoComplete = "off" / > < / label > < / div > < / details > }
{ kind === "create" && bindingFields . length > 0 && < details className = "provider-advanced-settings" > < summary > 运 行 连 接 设 置 < / summary > < p className = "field-help" > 用 于 插 件 声 明 的 逻 辑 连 接 , 不 是 服 务 器 目 录 或 游 戏 配 置 。 < / p > < div className = "form-grid" > { bindingFields . map ( ( field ) = > < label key = { field . key } > { field . key } { field . required ? "(必填)" : "" } < input type = { field . sensitive ? "password" : "text" } autoComplete = "off" value = { form . bindings [ field . key ] ? ? "" } onChange = { ( event ) = > updateBinding ( field . key , event . target . value ) } placeholder = { field . sensitive ? "托管凭据引用" : "安全逻辑值" } required = { field . required } / > < / label > ) } < / div > < / details > }
< / div > }
{ step === 3 && < div className = "deployment-workflow-body" > < div className = "deployment-review" > < div > < span > 插 件 类 型 < / span > < strong > { pluginLabel ( selectedPlugin , form . pluginId ) } < / strong > < / div > < div > < span > 目 标 < / span > < strong > { saveAsDraft ? "保存为未绑定草稿" : endpointLabel ( endpoints . find ( ( endpoint ) = > endpoint . id === form . runEndpointId ) , form . runEndpointId ) } < / strong > < / div > < div > < span > 部 署 方 式 < / span > < strong > { form . deploymentMode === "guided-install" ? "新建并安装" : form . deploymentMode === "existing-server" ? "接管已有服务器" : "自定义启动方式" } < / strong > < / div > < div > < span > 服 务 器 目 录 < / span > < strong > { protectedState ( form . serverRoot , Boolean ( deployment ? . serverRootConfigured ) ) } < / strong > < / div > { form . deploymentMode === "custom-command" && < > < div > < span > 启 动 命 令 < / span > < strong > { protectedState ( form . startCommand , Boolean ( deployment ? . startCommandConfigured ) ) } < / strong > < / div > < div > < span > 执 行 目 录 < / span > < strong > { protectedState ( form . workingDirectory , Boolean ( deployment ? . workingDirectoryConfigured ) ) } < / strong > < / div > < / > } < div > < span > 游 戏 配 置 < / span > < strong > { Object . keys ( form . createInputs ) . length ? ` ${ Object . keys ( form . createInputs ) . length } 项已准备 ` : "使用插件默认值" } < / strong > < / div > < / div > < div className = "form-guidance" > < strong > { saveAsDraft ? "本次只保存定义" : activeServer ? "本次只保存部署设置" : "确认后将创建并派发部署" } < / strong > < span > { saveAsDraft ? "后续从服务器详情选择节点并部署。" : activeServer ? "保存后可在详情中明确发起部署;路径和命令不会显示原文。" : "Run 会在领取任务后执行本机预检,再进行安装、配置与启动。" } < / span > < / div > < / div > }
{ step === 3 && < div className = "deployment-workflow-body" > < div className = "deployment-review" > < div > < span > 插 件 类 型 < / span > < strong > { pluginLabel ( selectedPlugin , form . pluginId ) } < / strong > < / div > < div > < span > 目 标 < / span > < strong > { saveAsDraft ? "保存为未绑定草稿" : endpointLabel ( endpoints . find ( ( endpoint ) = > endpoint . id === form . runEndpointId ) , form . runEndpointId ) } < / strong > < / div > < div > < span > 部 署 方 式 < / span > < strong > { form . deploymentMode === "guided-install" ? "新建并安装" : form . deploymentMode === "existing-server" ? "接管已有服务器" : "自定义启动方式" } < / strong > < / div > < div > < span > { form . deploymentMode === "guided-install" ? "安装目录" : form . deploymentMode === "existing-server" ? "已有服务器目录" : "服务器目录" } < / span > < strong > { protectedState ( form . serverRoot , Boolean ( deployment ? . serverRootConfigured ) ) } < / strong > < / div > { form . deploymentMode === "custom-command" && < > < div > < span > 启 动 命 令 < / span > < strong > { protectedState ( form . startCommand , Boolean ( deployment ? . startCommandConfigured ) ) } < / strong > < / div > < div > < span > 执 行 目 录 < / span > < strong > { protectedState ( form . workingDirectory , Boolean ( deployment ? . workingDirectoryConfigured ) ) } < / strong > < / div > < / > } { form . deploymentMode === "guided-install" && < div > < span > 游 戏 配 置 < / span > < strong > { Object . keys ( form . createInputs ) . length ? ` ${ Object . keys ( form . createInputs ) . length } 项已准备 ` : "使用插件默认值" } < / strong > < / div > } < / div > < div className = "form-guidance" > < strong > { saveAsDraft ? "本次只保存定义" : activeServer ? "本次只保存部署设置" : "确认后将创建并派发部署" } < / strong > < span > { saveAsDraft ? "后续从服务器详情选择节点并部署。" : form . deploymentMode === "existing-server" ? "Run 将先预检现有目录;不会重装或覆盖已有游戏配置。" : activeServer ? "保存后可在详情中明确发起部署;路径和命令不会显示原文。" : "Run 会在领取任务后执行本机预检,再进行安装、配置与启动。" } < / span > < / div > < / div > }
< div className = "confirm-actions" > < button type = "button" disabled = { busy } onClick = { ( ) = > step === 0 ? onClose ( ) : setStep ( ( current ) = > current - 1 ) } > { step === 0 ? "取消" : "上一步" } < / button > { step < workflowSteps . length - 1 ? < button type = "submit" className = "confirm-primary" disabled = { busy || ! canContinue ( ) } > < CircleDashed size = { 16 } / > < span > 下 一 步 < / span > < / button > : < button type = "submit" className = "confirm-primary" disabled = { busy } > < Rocket size = { 16 } / > < span > { busy ? "保存中…" : actionLabel } < / span > < / button > } < / div >
< / form >
< / ManagementDialog > ;