Skip to content

Commit dc012b4

Browse files
balogh.adam@icloud.comclaude
andcommitted
sort tee nodes by status and add show disabled toggle
Sort nodes: active first, then enabled, then disabled. Add checkbox to toggle visibility of disabled nodes, defaulting to hidden when non-disabled nodes exist. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 6bcf0fa commit dc012b4

2 files changed

Lines changed: 76 additions & 23 deletions

File tree

ui/opengradient/teeRegistry/TEENodesTable.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,12 @@ const NodeRow = ({ node, typeNameMap, isLoading, onNodeClick }: {
191191
);
192192
};
193193

194+
function statusOrder(node: TEENodeWithStatus): number {
195+
if (node.isActive) return 0;
196+
if (node.enabled) return 1;
197+
return 2;
198+
}
199+
194200
const TEENodesTable = ({ nodes, types, isLoading, onNodeClick }: Props) => {
195201
const typeNameMap = React.useMemo(() => {
196202
const map: Record<number, string> = {};
@@ -200,6 +206,10 @@ const TEENodesTable = ({ nodes, types, isLoading, onNodeClick }: Props) => {
200206
return map;
201207
}, [ types ]);
202208

209+
const sortedNodes = React.useMemo(() =>
210+
[ ...nodes ].sort((a, b) => statusOrder(a) - statusOrder(b)),
211+
[ nodes ]);
212+
203213
return (
204214
<TableRoot>
205215
<TableHeaderSticky top={ 0 }>
@@ -214,7 +224,7 @@ const TEENodesTable = ({ nodes, types, isLoading, onNodeClick }: Props) => {
214224
</TableRow>
215225
</TableHeaderSticky>
216226
<TableBody>
217-
{ nodes.map((node) => (
227+
{ sortedNodes.map((node) => (
218228
<NodeRow
219229
key={ node.teeId }
220230
node={ node }

ui/pages/opengradient/TEERegistry.tsx

Lines changed: 65 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { route } from 'nextjs-routes';
66

77
import { getTEERegistryOverview, TEE_REGISTRY_QUERY_KEY, TEE_REGISTRY_ADDRESS } from 'lib/opengradient/contracts/teeRegistry';
88
import type { TEERegistryStats, TEETypeSummary, TEENodeWithStatus } from 'lib/opengradient/contracts/teeRegistry';
9+
import { Checkbox } from 'toolkit/chakra/checkbox';
910
import { Heading } from 'toolkit/chakra/heading';
1011
import { Link, LinkBox } from 'toolkit/chakra/link';
1112
import { Skeleton } from 'toolkit/chakra/skeleton';
@@ -54,6 +55,32 @@ const TEERegistry = () => {
5455
return Object.values(nbt).flat();
5556
}, [ query.data?.nodesByType, selectedType ]);
5657

58+
const hasNonDisabledNodes = React.useMemo(
59+
() => allNodes.some((n) => n.isActive || n.enabled),
60+
[ allNodes ],
61+
);
62+
63+
const [ showDisabled, setShowDisabled ] = React.useState<boolean | null>(null);
64+
65+
// Reset when allNodes changes (e.g. type filter changed)
66+
React.useEffect(() => {
67+
setShowDisabled(null);
68+
}, [ selectedType ]);
69+
70+
const resolvedShowDisabled = showDisabled ?? !hasNonDisabledNodes;
71+
72+
const filteredNodes = React.useMemo(
73+
() => resolvedShowDisabled ? allNodes : allNodes.filter((n) => n.isActive || n.enabled),
74+
[ allNodes, resolvedShowDisabled ],
75+
);
76+
77+
const handleToggleShowDisabled = React.useCallback(() => {
78+
setShowDisabled((prev) => {
79+
const current = prev ?? !hasNonDisabledNodes;
80+
return !current;
81+
});
82+
}, [ hasNonDisabledNodes ]);
83+
5784
const handleTypeClick = React.useCallback((typeId: number) => {
5885
setSelectedType((prev) => prev === typeId ? null : typeId);
5986
}, []);
@@ -440,35 +467,51 @@ const TEERegistry = () => {
440467

441468
{ /* Nodes Table */ }
442469
<Box>
443-
<Flex alignItems="center" gap={ 2 } mb={ 4 }>
444-
<Text
445-
fontSize="11px"
446-
fontWeight={ 500 }
447-
letterSpacing="0.1em"
448-
textTransform="uppercase"
449-
color={{ _light: 'rgba(0, 0, 0, 0.4)', _dark: 'rgba(255, 255, 255, 0.4)' }}
450-
fontFamily="system-ui, -apple-system, sans-serif"
451-
>
452-
{ selectedType !== null ?
453-
`${ types.find((t) => t.typeId === selectedType)?.name ?? '' } Nodes` :
454-
'All Nodes' }
455-
</Text>
456-
<Text
457-
fontSize="11px"
458-
fontWeight={ 400 }
459-
color={{ _light: 'rgba(0, 0, 0, 0.3)', _dark: 'rgba(255, 255, 255, 0.3)' }}
460-
fontFamily="system-ui, -apple-system, sans-serif"
470+
<Flex alignItems="center" justifyContent="space-between" mb={ 4 }>
471+
<Flex alignItems="center" gap={ 2 }>
472+
<Text
473+
fontSize="11px"
474+
fontWeight={ 500 }
475+
letterSpacing="0.1em"
476+
textTransform="uppercase"
477+
color={{ _light: 'rgba(0, 0, 0, 0.4)', _dark: 'rgba(255, 255, 255, 0.4)' }}
478+
fontFamily="system-ui, -apple-system, sans-serif"
479+
>
480+
{ selectedType !== null ?
481+
`${ types.find((t) => t.typeId === selectedType)?.name ?? '' } Nodes` :
482+
'All Nodes' }
483+
</Text>
484+
<Text
485+
fontSize="11px"
486+
fontWeight={ 400 }
487+
color={{ _light: 'rgba(0, 0, 0, 0.3)', _dark: 'rgba(255, 255, 255, 0.3)' }}
488+
fontFamily="system-ui, -apple-system, sans-serif"
489+
>
490+
{ filteredNodes.length > 0 ? `(${ filteredNodes.length })` : '' }
491+
</Text>
492+
</Flex>
493+
<Checkbox
494+
size="sm"
495+
checked={ resolvedShowDisabled }
496+
onCheckedChange={ handleToggleShowDisabled }
461497
>
462-
{ allNodes.length > 0 ? `(${ allNodes.length })` : '' }
463-
</Text>
498+
<Text
499+
fontSize="11px"
500+
fontWeight={ 400 }
501+
color={{ _light: 'rgba(0, 0, 0, 0.4)', _dark: 'rgba(255, 255, 255, 0.4)' }}
502+
fontFamily="system-ui, -apple-system, sans-serif"
503+
>
504+
Show disabled
505+
</Text>
506+
</Checkbox>
464507
</Flex>
465508
<TEENodesTable
466-
nodes={ allNodes }
509+
nodes={ filteredNodes }
467510
types={ types }
468511
isLoading={ query.isPlaceholderData }
469512
onNodeClick={ handleNodeClick }
470513
/>
471-
{ !query.isPlaceholderData && allNodes.length === 0 && (
514+
{ !query.isPlaceholderData && filteredNodes.length === 0 && (
472515
<Flex
473516
justifyContent="center"
474517
alignItems="center"

0 commit comments

Comments
 (0)