@@ -6,6 +6,7 @@ import { route } from 'nextjs-routes';
66
77import { getTEERegistryOverview , TEE_REGISTRY_QUERY_KEY , TEE_REGISTRY_ADDRESS } from 'lib/opengradient/contracts/teeRegistry' ;
88import type { TEERegistryStats , TEETypeSummary , TEENodeWithStatus } from 'lib/opengradient/contracts/teeRegistry' ;
9+ import { Checkbox } from 'toolkit/chakra/checkbox' ;
910import { Heading } from 'toolkit/chakra/heading' ;
1011import { Link , LinkBox } from 'toolkit/chakra/link' ;
1112import { 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