From b11e0646b3893d8a25682f99d2521a0b02deaaac Mon Sep 17 00:00:00 2001 From: Oscar Thomson Date: Wed, 8 Jul 2026 14:29:50 +0000 Subject: [PATCH 1/2] Changed team settings menu so that pools show the clusters that are in them --- frontend/app/components/TeamsSettingsPage.jsx | 323 ++++++++++-------- 1 file changed, 175 insertions(+), 148 deletions(-) diff --git a/frontend/app/components/TeamsSettingsPage.jsx b/frontend/app/components/TeamsSettingsPage.jsx index 36427ac..c90bb4b 100644 --- a/frontend/app/components/TeamsSettingsPage.jsx +++ b/frontend/app/components/TeamsSettingsPage.jsx @@ -7,7 +7,7 @@ import { Listbox, ListboxButton, ListboxOptions, ListboxOption } from '@headless import { FaLayerGroup, FaUser, FaUsers } from 'react-icons/fa'; import { IoIosSettings } from 'react-icons/io'; -function timeNumberToInput(value) { +function timeNumberToInput (value) { const numericValue = Number(value); if (Number.isNaN(numericValue)) return ''; @@ -28,13 +28,7 @@ function timeNumberToInput(value) { return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`; } -function timeInputToInt(value) { - const [hours, minutes] = value.split(':').map(Number); - - return hours + minutes / 60; -} - -export default function TeamSettingsPage() { +export default function TeamSettingsPage () { const searchParams = useSearchParams(); const teamId = searchParams.get('id'); @@ -63,22 +57,9 @@ export default function TeamSettingsPage() { const [allPools, setAllPools] = useState([]); - const loadAllPools = useCallback(async () => { - try { - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/pool`); - const data = await res.json(); - - setAllPools(data.body ?? []); - } catch (err) { - console.error('Failed to fetch pools:', err); - setAllPools([]); - } - }, []); - useEffect(() => { loadTeam(); - loadAllPools(); - }, [loadAllPools, loadTeam]); + }, [loadTeam]); const [selectedUserId, setSelectedUserId] = useState(''); const [selectedPoolId, setSelectedPoolId] = useState(''); @@ -105,7 +86,7 @@ export default function TeamSettingsPage() { }, [getTeamUsers]); useEffect(() => { - async function getUsers() { + async function getUsers () { const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/people/team/not/${teamId}`); const data = await res.json(); setUsers(data.body); @@ -132,7 +113,21 @@ export default function TeamSettingsPage() { const getTeamPools = useCallback(async () => { const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/pool/team/${teamId}`); const data = await res.json(); - setTeamPools(data.body); + const pools = data.body ?? []; + + const enrichedPools = await Promise.all( + pools.map(async pool => { + const clusterRes = await fetch( + `${process.env.NEXT_PUBLIC_API_URL}/hpc/pool/${pool.id}` + ); + const clusterData = await clusterRes.json(); + return { + ...pool, + clusters: clusterData.body ?? [] + }; + }) + ); + setTeamPools(enrichedPools); }, [teamId]); useEffect(() => { @@ -141,11 +136,11 @@ export default function TeamSettingsPage() { if (!team) { return ( -
-
-

Team not found

+
+
+

Team not found

-

No team exists with ID: {teamId}

+

No team exists with ID: {teamId}

); @@ -157,7 +152,7 @@ export default function TeamSettingsPage() { return; } - const userToAdd = users.find((user) => user.id === selectedUserId); + const userToAdd = users.find(user => user.id === selectedUserId); const userTeamId = userToAdd.teamId; const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/people/team/${userTeamId}`); @@ -190,7 +185,7 @@ export default function TeamSettingsPage() { throw new Error(data.message || 'Failed to add user to team.'); } - setUsers((previousUsers) => previousUsers.filter((user) => user.id !== selectedUserId)); + setUsers(previousUsers => previousUsers.filter(user => user.id !== selectedUserId)); setSelectedUserId(''); getTeamUsers(); @@ -227,7 +222,7 @@ export default function TeamSettingsPage() { throw new Error(data.message || 'Failed to add user to team.'); } - setPools((previousPools) => previousPools.filter((pool) => pool.id !== selectedPoolId)); + setPools(previousPools => previousPools.filter(pool => pool.id !== selectedPoolId)); setSelectedPoolId(''); getTeamPools(); @@ -241,12 +236,12 @@ export default function TeamSettingsPage() { } }; - const openRemovePoolConfirmation = (poolId) => { - const poolToRemove = teamPools.find((pool) => pool.id === poolId); + const openRemovePoolConfirmation = poolId => { + const poolToRemove = teamPools.find(pool => pool.id === poolId); setPendingRemovalPool(poolToRemove || { id: poolId, name: 'this pool' }); }; - async function confirmRemovePool() { + async function confirmRemovePool () { if (!pendingRemovalPool) { return; } @@ -271,13 +266,13 @@ export default function TeamSettingsPage() { throw new Error(data.message || 'Failed to remove pool from team.'); } - const removedPool = teamPools.find((pool) => pool.id === pendingRemovalPool.id); + const removedPool = teamPools.find(pool => pool.id === pendingRemovalPool.id); if (removedPool) { - setPools((previousPools) => [...previousPools, removedPool]); + setPools(previousPools => [...previousPools, removedPool]); } - setTeamPools((previousPools) => - previousPools.filter((pool) => pool.id !== pendingRemovalPool.id) + setTeamPools(previousPools => + previousPools.filter(pool => pool.id !== pendingRemovalPool.id) ); setPendingRemovalPool(null); showStatus('Pool removed from team.'); @@ -327,7 +322,7 @@ export default function TeamSettingsPage() { throw new Error(data.message || 'Failed to update settings'); } - setTeam((prev) => ({ + setTeam(prev => ({ ...prev, clusters_per_day: clustersPerDay })); @@ -345,38 +340,38 @@ export default function TeamSettingsPage() { if (loadingTeams) { return ( -
-

Loading team...

+
+

Loading team...

); } if (!team) { return ( -
-

Team not found: {teamId}

+
+

Team not found: {teamId}

); } return ( -
-
- -
-
-
-
-