diff --git a/packages/web_ui/src/components/InstanceList.tsx b/packages/web_ui/src/components/InstanceList.tsx index b3239b7b..c1aa76d0 100644 --- a/packages/web_ui/src/components/InstanceList.tsx +++ b/packages/web_ui/src/components/InstanceList.tsx @@ -1,6 +1,6 @@ import React from "react"; import { useNavigate } from "react-router-dom"; -import { message, Button, Space, Table } from "antd"; +import { message, Button, Space, Table, Typography } from "antd"; import CopyOutlined from "@ant-design/icons/CopyOutlined"; import type { SizeType } from "antd/es/config-provider/SizeContext"; import type { ColumnsType } from "antd/es/table"; @@ -10,6 +10,7 @@ import { useHosts } from "../model/host"; import InstanceStatusTag from "./InstanceStatusTag"; import StartStopInstanceButton from "./StartStopInstanceButton"; import { InstanceDetails } from "@clusterio/lib"; +import Link from "./Link"; const strcmp = new Intl.Collator(undefined, { numeric: true, sensitivity: "base" }).compare; @@ -55,7 +56,12 @@ export default function InstanceList(props: InstanceListProps) { { title: "Assigned Host", key: "assignedHost", - render: (_, instance) => hostName(instance.assignedHost), + render: (_, instance) => e.stopPropagation()} + > + {hostName(instance.assignedHost)} + , sorter: (a, b) => strcmp(hostName(a.assignedHost), hostName(b.assignedHost)), responsive: ["sm"], }, @@ -68,10 +74,10 @@ export default function InstanceList(props: InstanceListProps) { {publicAddress} - } + ) + && + + } ; } @@ -180,7 +184,7 @@ export default function InstanceViewPage() { return Instance with id {instanceId} was not found on the controller.} type="warning" @@ -198,8 +202,8 @@ export default function InstanceViewPage() { return } + title={instance.name ?? ""} + extra={} /> diff --git a/packages/web_ui/src/components/Link.tsx b/packages/web_ui/src/components/Link.tsx new file mode 100644 index 00000000..224e651d --- /dev/null +++ b/packages/web_ui/src/components/Link.tsx @@ -0,0 +1,47 @@ +import React from "react"; +import { Typography } from "antd"; +import { + LinkProps, + useHref, + useLinkClickHandler, +} from "react-router-dom"; +import { BaseType } from "antd/es/typography/Base"; + +const Link = React.forwardRef( + ( + { + onClick, + replace = false, + state, + target, + to, + type, + ...rest + }: LinkProps, + ref + ) => { + let href = useHref(to); + let handleClick = useLinkClickHandler(to, { + replace, + state, + target, + }) as (event: React.MouseEvent) => void; + + return ( + { + onClick?.(event as React.MouseEvent); + if (!event.defaultPrevented) { + handleClick(event); + } + }} + ref={ref as React.RefObject | null} + target={target} + type={type as BaseType} + /> + ); + } +); +export default Link; diff --git a/packages/web_ui/src/components/PageLayout.tsx b/packages/web_ui/src/components/PageLayout.tsx index 8a9ce1e7..8361827b 100644 --- a/packages/web_ui/src/components/PageLayout.tsx +++ b/packages/web_ui/src/components/PageLayout.tsx @@ -1,6 +1,6 @@ import React from "react"; -import { Link } from "react-router-dom"; import { Layout, Breadcrumb } from "antd"; +import Link from "./Link"; const { Content } = Layout; diff --git a/packages/web_ui/src/components/UsersPage.tsx b/packages/web_ui/src/components/UsersPage.tsx index 4ab13fac..83c605aa 100644 --- a/packages/web_ui/src/components/UsersPage.tsx +++ b/packages/web_ui/src/components/UsersPage.tsx @@ -12,6 +12,7 @@ import PageHeader from "./PageHeader"; import PageLayout from "./PageLayout"; import PluginExtra from "./PluginExtra"; import { formatFirstSeen, formatLastSeen, sortFirstSeen, sortLastSeen, useUsers } from "../model/user"; +import Link from "./Link"; const strcmp = new Intl.Collator(undefined, { numeric: true, sensitivity: "base" }).compare; @@ -49,7 +50,7 @@ function CreateUserButton() { >
- +
@@ -97,7 +98,9 @@ export default function UsersPage() { title: "Roles", key: "roles", render: (_, user) => ( - [...user.roleIds].map(id => {(roles.get(id) || { name: id }).name}) + [...user.roleIds].map(id => e.stopPropagation()}> + {(roles.get(id) || { name: id }).name} + ) ), }, { diff --git a/packages/web_ui/src/index.ts b/packages/web_ui/src/index.ts index 03e4e6cd..601e092c 100644 --- a/packages/web_ui/src/index.ts +++ b/packages/web_ui/src/index.ts @@ -28,3 +28,5 @@ export { default as PageHeader } from "./components/PageHeader"; export { default as PageLayout } from "./components/PageLayout"; export { default as SavesList } from "./components/SavesList"; export { default as SectionHeader } from "./components/SectionHeader"; + +export { default as Link } from "./components/Link";