Show online player count on the instance list (#1196)

Counts users per instance from the shared users subscription, the same
data the instance page's online players list reads, so the table adds
no per-row requests. The column is sortable and hidden without
core.user.subscribe.

Fixes #1193

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
BastiaanandClaude Opus 5.5 authored and GitHub committed 2026-11-11 17:42:16 +00:00
1 parent ae707f7768
commit 381d1d8573
1 file changed
+24
@@ -7,6 +7,7 @@ import type { ColumnType } from "antd/es/table/interface";
import { useAccount } from "../model/account";
import { useSystems } from "../model/system";
import { useHosts } from "../model/host";
import { useUsers } from "../model/user";
import { useDefaultModPack, useModPacks } from "../model/mod_pack";
import { RestartRequired } from "./system_metrics";
import InstanceStatusTag from "./InstanceStatusTag";
@@ -33,6 +34,17 @@ export default function InstanceList(props: InstanceListProps) {
const [systems] = useSystems();
const [modPacks] = useModPacks();
const defaultModPack = useDefaultModPack();
const [users] = useUsers();
const canUsers = account.hasPermission("core.user.subscribe");
const onlineCounts = React.useMemo(() => {
const counts = new Map<number, number>();
for (const user of users.values()) {
for (const instanceId of user.instances ?? []) {
counts.set(instanceId, (counts.get(instanceId) ?? 0) + 1);
}
}
return counts;
}, [users]);
const tableState = useTableQueryState<lib.InstanceDetails>({
namespace: "instance", defaultSortKey: "name",
});
@@ -146,6 +158,18 @@ export default function InstanceList(props: InstanceListProps) {
},
];
if (canUsers) {
const playerCount = (instance: lib.InstanceDetails) => onlineCounts.get(instance.id) ?? 0;
columns.push({
title: "Players",
key: "players",
render: (_, instance) => playerCount(instance),
sorter: (a, b) => playerCount(a) - playerCount(b),
sortOrder: tableState.sortOrder("players"),
responsive: ["md"],
});
}
if (account.hasAnyPermission(...InstanceControlButtonPermissions)) {
columns.push({
key: "action",