diff --git a/packages/web_ui/src/components/InstancesPage.tsx b/packages/web_ui/src/components/InstancesPage.tsx index ec5fe7b2..ed1498a2 100644 --- a/packages/web_ui/src/components/InstancesPage.tsx +++ b/packages/web_ui/src/components/InstancesPage.tsx @@ -1,6 +1,6 @@ -import React, { useContext, useState } from "react"; +import React, { useContext, useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; -import { Button, Checkbox, Form, Input, Modal, Select, Space, Tooltip } from "antd"; +import { Button, Checkbox, Form, Input, Modal, Select, Space, Tooltip, Typography } from "antd"; import * as lib from "@clusterio/lib"; @@ -9,28 +9,45 @@ import ControlContext from "./ControlContext"; import PageHeader from "./PageHeader"; import PageLayout from "./PageLayout"; import PluginExtra from "./PluginExtra"; -import { useInstances } from "../model/instance"; +import { useHosts } from "../model/host"; +import { useInstanceConfig, useInstances } from "../model/instance"; import { useSaves } from "../model/saves"; import InstanceList from "./InstanceList"; import { notifyErrorHandler } from "../util/notify"; type SaveMode = "none" | "copy" | "save_and_copy"; +const strcmp = new Intl.Collator(undefined, { numeric: true, sensitivity: "base" }).compare; + function CreateInstanceButton(props: { instances: ReturnType[0] }) { let control = useContext(ControlContext); + let account = useAccount(); let navigate = useNavigate(); let [open, setOpen] = useState(false); let [creating, setCreating] = useState(false); let [form] = Form.useForm(); + let [hosts] = useHosts(); let [saves] = useSaves(); + const canAssign = account.hasPermission("core.instance.assign"); const cloneId: number | undefined = Form.useWatch("instanceClone", form); + const host: number | string | undefined = Form.useWatch("host", form); const saveMode: SaveMode = Form.useWatch("saveMode", form) ?? "none"; + const hostId = typeof host === "number" ? host : undefined; const source = cloneId !== undefined && cloneId >= 0 ? props.instances.get(cloneId) : undefined; const sourceRunning = source?.status === "running"; const activeSave = source ? [...saves.values()].find( save => save.instanceId === source.id && (sourceRunning ? save.loaded : save.loadByDefault) ) : undefined; + const sourceConfig = useInstanceConfig(source?.id); + const sourceSettings = sourceConfig?.["factorio.settings"] as Record | undefined; + const sourceServerName = typeof sourceSettings?.name === "string" ? sourceSettings.name : undefined; + + useEffect(() => { + if (open && sourceServerName !== undefined) { + form.setFieldValue("serverName", sourceServerName); + } + }, [open, sourceServerName]); async function createInstance() { let values = form.getFieldsValue(); @@ -38,7 +55,7 @@ function CreateInstanceButton(props: { instances: ReturnType { setOpen(false); }} destroyOnHidden > -
+ - + {canAssign && + + } + + {source && sourceSettings && + + - - Start after creation - - } + } + {source && hostId !== undefined && +