From 82629a57c6228e10c3ff652b83a2db3ebf1b2d17 Mon Sep 17 00:00:00 2001 From: bbassie <17990055+bbassie@users.noreply.github.com> Date: Thu, 25 Jun 2026 00:40:21 +0000 Subject: [PATCH] Always persist table state; drop the persistState prop Every render site of InstanceList and UsersTable already passed persistState, so the prop and its uncontrolled fallback branch were dead config. Remove the prop and the conditionals so these tables always persist their state to the URL. No runtime behaviour change. Co-Authored-By: Claude Opus 4.8 (1M context) --- packages/web_ui/src/components/HostViewPage.tsx | 2 +- packages/web_ui/src/components/InstanceList.tsx | 11 ++++------- packages/web_ui/src/components/InstancesPage.tsx | 2 +- .../web_ui/src/components/OnlinePlayersList.tsx | 2 +- packages/web_ui/src/components/UsersPage.tsx | 2 +- packages/web_ui/src/components/UsersTable.tsx | 14 +++++--------- 6 files changed, 13 insertions(+), 20 deletions(-) diff --git a/packages/web_ui/src/components/HostViewPage.tsx b/packages/web_ui/src/components/HostViewPage.tsx index 3cc0cf6e..c55eddd8 100644 --- a/packages/web_ui/src/components/HostViewPage.tsx +++ b/packages/web_ui/src/components/HostViewPage.tsx @@ -169,7 +169,7 @@ export default function HostViewPage() { {account.hasPermission("core.instance.list") && <> Instances - + } {account.hasPermission("core.log.follow") && <> diff --git a/packages/web_ui/src/components/InstanceList.tsx b/packages/web_ui/src/components/InstanceList.tsx index 15f59d76..d9627a33 100644 --- a/packages/web_ui/src/components/InstanceList.tsx +++ b/packages/web_ui/src/components/InstanceList.tsx @@ -23,8 +23,6 @@ type InstanceListProps = { instances: ReadonlyMap>; size?: SizeType; hideAssignedHost?: boolean; - /** Persist sort/search state in the URL and show a search box (for the standalone Instances page). */ - persistState?: boolean; }; export default function InstanceList(props: InstanceListProps) { @@ -32,7 +30,6 @@ export default function InstanceList(props: InstanceListProps) { let navigate = useNavigate(); let [hosts] = useHosts(); const [systems] = useSystems(); - const persist = props.persistState ?? false; const tableState = useTableQueryState({ namespace: "instance", defaultSortKey: "name", pagination: false, }); @@ -58,7 +55,7 @@ export default function InstanceList(props: InstanceListProps) { dataIndex: "name", defaultSortOrder: "ascend", sorter: (a, b) => strcmp(a["name"], b["name"]), - ...(persist ? nameSearch : {}), + ...nameSearch, }, { title: "Assigned Host", @@ -128,15 +125,15 @@ export default function InstanceList(props: InstanceListProps) { columns.splice(1, 1); } - const finalColumns = persist ? columns.map(tableState.applyColumn) : columns; + const finalColumns = columns.map(tableState.applyColumn); return instance["id"]} - pagination={persist ? tableState.pagination : false} - onChange={persist ? tableState.onChange : undefined} + pagination={tableState.pagination} + onChange={tableState.onChange} onRow={(record, rowIndex) => ({ onClick: event => { navigate(`/instances/${record.id}/view`); diff --git a/packages/web_ui/src/components/InstancesPage.tsx b/packages/web_ui/src/components/InstancesPage.tsx index 78cb80d2..cfa24922 100644 --- a/packages/web_ui/src/components/InstancesPage.tsx +++ b/packages/web_ui/src/components/InstancesPage.tsx @@ -111,7 +111,7 @@ export default function InstancesPage() { } /> - + ; } diff --git a/packages/web_ui/src/components/OnlinePlayersList.tsx b/packages/web_ui/src/components/OnlinePlayersList.tsx index 13950da2..31e5a560 100644 --- a/packages/web_ui/src/components/OnlinePlayersList.tsx +++ b/packages/web_ui/src/components/OnlinePlayersList.tsx @@ -20,7 +20,7 @@ export default function OnlinePlayersList({ instanceId }: OnlinePlayersListProps return (

Online Players ({onlineUsers.length})

- } } /> - + ; } diff --git a/packages/web_ui/src/components/UsersTable.tsx b/packages/web_ui/src/components/UsersTable.tsx index 0cea72f9..7009a565 100644 --- a/packages/web_ui/src/components/UsersTable.tsx +++ b/packages/web_ui/src/components/UsersTable.tsx @@ -26,14 +26,12 @@ export interface UsersTableProps { pagination?: false | object; /** Ant Design size prop */ size?: "small" | "middle" | "large"; - /** Persist sort/filter/pagination state in the URL (for the standalone Users page). */ - persistState?: boolean; } const strcmp = new Intl.Collator(undefined, { numeric: true, sensitivity: "base" }).compare; export default function UsersTable( - { instanceId, onlyOnline = false, pagination, size, persistState }: UsersTableProps + { instanceId, onlyOnline = false, pagination, size }: UsersTableProps ) { const [roles, rolesSynced] = useRoles(); const [users, usersSynced] = useUsers(); @@ -181,16 +179,14 @@ export default function UsersTable( let tablePagination: false | object; if (pagination === false) { tablePagination = false; - } else if (persistState) { + } else { // Controlled current/pageSize from the URL win over the caller's display props. tablePagination = { ...displayPagination, ...callerPagination, ...(tableState.pagination || {}) }; - } else { - tablePagination = { ...displayPagination, ...(callerPagination ?? { defaultPageSize: 50 }) }; } - let tableColumns = persistState ? columns.map(tableState.applyColumn) : columns; + let tableColumns = columns.map(tableState.applyColumn); // Seed the online-only default when nothing for the Last Seen column is in the URL yet. - if (persistState && onlyOnline && !("lastSeen" in tableState.filters)) { + if (onlyOnline && !("lastSeen" in tableState.filters)) { tableColumns = tableColumns.map(column => ( column.key === "lastSeen" ? { ...column, filteredValue: ["online"] } : column )); @@ -202,7 +198,7 @@ export default function UsersTable( dataSource={data} rowKey={(user) => user.name} pagination={tablePagination} - onChange={persistState ? tableState.onChange : undefined} + onChange={tableState.onChange} size={size} scroll={{ x: "max-content" }} loading={!usersSynced || !rolesSynced}