@@ -9,13 +9,15 @@ import { reactQueryKeys } from '@/clients/reactQueryConfig';
99import { fetchLayer , syncLayer } from '@/clients/layers/client' ;
1010import LayerStatus from '@/components/status/LayerStatus' ;
1111import Button from '@/components/core/Button' ;
12- import type { Layer } from '@/clients/layers/types' ;
12+ import type { Layer , StateGraphNode } from '@/clients/layers/types' ;
13+ import SlidingPane from '@/modals/SlidingPane' ;
1314
1415const Layer : React . FC = ( ) => {
1516 const { theme } = useContext ( ThemeContext ) ;
1617 const { namespace = '' , name = '' } = useParams ( ) ;
1718 const navigate = useNavigate ( ) ;
18-
19+ const [ showResourcePane , setShowResourcePane ] = useState ( false ) ;
20+ const [ selectedResourceData , setSelectedResourceData ] = useState < StateGraphNode | null > ( null ) ;
1921 const [ isManualSyncPending , setIsManualSyncPending ] = useState < boolean > ( false ) ;
2022 const [ isRefreshing , setIsRefreshing ] = useState < boolean > ( false ) ;
2123
@@ -67,6 +69,46 @@ const Layer: React.FC = () => {
6769
6870 return (
6971 < div className = "flex flex-col flex-1 h-screen min-w-0" >
72+ < SlidingPane
73+ isOpen = { showResourcePane }
74+ onClose = { ( ) => setShowResourcePane ( false ) }
75+ variant = { theme }
76+ >
77+ < div className = "p-6" >
78+ < h2 className = "text-2xl font-semibold mb-2" > { selectedResourceData ?. name } </ h2 >
79+ < h3 className = "text-sm mb-2 uppercase" > { selectedResourceData ?. type } </ h3 >
80+ < p className = "text-sm mb-2" > Provider: < span className = "font-medium" > { selectedResourceData ?. provider } </ span > </ p >
81+ < p className = "text-sm mb-2" > Instance count: < span className = "font-medium" > { selectedResourceData ?. instances_count } </ span > </ p >
82+ { selectedResourceData ?. module !== undefined && < p className = "text-sm mb-2" > Module: < span className = "font-medium" > { selectedResourceData ?. module || '(root)' } </ span > </ p > }
83+ < p className = "text-sm mb-2" > Address: < span className = "font-medium" > { selectedResourceData ?. addr } </ span > </ p >
84+ < h3 className = "text-lg font-semibold mt-4 mb-2" > Instance{ ( selectedResourceData ?. instances_count ?? 0 ) > 1 ? 's' : '' } details</ h3 >
85+ < ul className = "list-disc list-inside" >
86+ { selectedResourceData ?. instances ?. map ( ( inst ) => (
87+ < li key = { inst . addr } className = "mb-2" >
88+ < p className = "text-sm" > Address: < span className = "font-medium" > { inst . addr } </ span > </ p >
89+ { inst . created_at && < p className = "text-sm" > Created at: < span className = "font-medium" > { new Date ( inst . created_at ) . toLocaleString ( ) } </ span > </ p > }
90+ { inst . dependencies && inst . dependencies . length > 0 && (
91+ < p className = "text-sm" > Dependencies: < span className = "font-medium" > { inst . dependencies . join ( ', ' ) } </ span > </ p >
92+ ) }
93+ { inst . attributes && (
94+ < details className = "mt-1" >
95+ < summary className = "cursor-pointer text-sm text-primary-500" > View attributes</ summary >
96+ < pre className = "bg-nuances-white p-2 rounded mt-1 overflow-auto text-xs text-nuances-black" >
97+ { JSON . stringify ( inst . attributes , null ,
98+
99+ 2 ) }
100+ </ pre >
101+ </ details >
102+ ) }
103+ </ li >
104+ ) ) }
105+ </ ul >
106+ < h3 className = "text-lg font-semibold mt-4 mb-2" > Raw data</ h3 >
107+ < pre className = "bg-nuances-white p-4 rounded-lg overflow-auto text-sm text-nuances-black" >
108+ { JSON . stringify ( selectedResourceData , null , 2 ) }
109+ </ pre >
110+ </ div >
111+ </ SlidingPane >
70112 < div
71113 className = { `
72114 p-6
@@ -110,6 +152,10 @@ const Layer: React.FC = () => {
110152 namespace = { namespace }
111153 name = { name }
112154 variant = { theme === 'light' ? 'light' : 'dark' }
155+ onNodeClick = { ( n ) => { setShowResourcePane ( true )
156+ setSelectedResourceData ( n ) ;
157+ console . log ( 'Clicked node' , n ) ;
158+ } }
113159 />
114160 </ div >
115161 </ div >
0 commit comments