@@ -3,10 +3,9 @@ import { CalmArchitectureSchema, CalmNodeSchema, CalmRelationshipSchema } from '
33import { useDropzone } from 'react-dropzone' ;
44import { ReactFlowVisualizer } from '../reactflow/ReactFlowVisualizer.js' ;
55import { PatternVisualizer } from '../reactflow/PatternVisualizer.js' ;
6- import { Sidebar } from '../sidebar/Sidebar.js' ;
76import { MetadataPanel } from '../reactflow/MetadataPanel.js' ;
87import { toSidebarNodeData , toSidebarEdgeData } from '../reactflow/utils/patternClickHandlers.js' ;
9- import type { DrawerProps , SelectedItem , Flow , Control } from '../../contracts/contracts.js' ;
8+ import type { DrawerProps , Flow , Control } from '../../contracts/contracts.js' ;
109
1110/**
1211 * Detect whether JSON data is a CALM pattern (JSON Schema) or an architecture instance.
@@ -26,11 +25,10 @@ function extractId(item: CalmNodeSchema | CalmRelationshipSchema): string {
2625 return item ?. [ 'unique-id' ] || '' ;
2726}
2827
29- export function Drawer ( { data } : DrawerProps ) {
28+ export function Drawer ( { data, onItemSelect } : DrawerProps ) {
3029 const [ calmInstance , setCALMInstance ] = useState < CalmArchitectureSchema | undefined > ( undefined ) ;
3130 const [ patternInstance , setPatternInstance ] = useState < Record < string , unknown > | undefined > ( undefined ) ;
3231 const [ fileInstance , setFileInstance ] = useState < Record < string , unknown > | undefined > ( undefined ) ;
33- const [ selectedItem , setSelectedItem ] = useState < SelectedItem > ( null ) ;
3432 // Default to collapsed as per user request
3533 const [ isMetadataCollapsed , setIsMetadataCollapsed ] = useState ( true ) ;
3634 // Height of the metadata panel when expanded (in pixels)
@@ -114,25 +112,25 @@ export function Drawer({ data }: DrawerProps) {
114112 const hasContent = ! ! ( calmInstance || patternInstance ) ;
115113
116114 const closeSidebar = useCallback ( ( ) => {
117- setSelectedItem ( null ) ;
118- } , [ ] ) ;
115+ onItemSelect ?. ( null ) ;
116+ } , [ onItemSelect ] ) ;
119117
120118 // Pattern-specific click handlers
121119 const handlePatternNodeClick = useCallback ( ( nodeData : Record < string , unknown > ) => {
122- setSelectedItem ( { data : toSidebarNodeData ( nodeData ) } ) ;
123- } , [ ] ) ;
120+ onItemSelect ?. ( { data : toSidebarNodeData ( nodeData ) } ) ;
121+ } , [ onItemSelect ] ) ;
124122
125123 const handlePatternEdgeClick = useCallback ( ( edgeData : Record < string , unknown > ) => {
126- setSelectedItem ( { data : toSidebarEdgeData ( edgeData ) } ) ;
127- } , [ ] ) ;
124+ onItemSelect ?. ( { data : toSidebarEdgeData ( edgeData ) } ) ;
125+ } , [ onItemSelect ] ) ;
128126
129127 const handleNodeClick = useCallback ( ( nodeData : CalmNodeSchema ) => {
130- setSelectedItem ( { data : toSidebarNodeData ( nodeData as Record < string , unknown > ) } ) ;
131- } , [ ] ) ;
128+ onItemSelect ?. ( { data : toSidebarNodeData ( nodeData as Record < string , unknown > ) } ) ;
129+ } , [ onItemSelect ] ) ;
132130
133131 const handleEdgeClick = useCallback ( ( edgeData : CalmRelationshipSchema ) => {
134- setSelectedItem ( { data : toSidebarEdgeData ( edgeData as Record < string , unknown > ) } ) ;
135- } , [ ] ) ;
132+ onItemSelect ?. ( { data : toSidebarEdgeData ( edgeData as Record < string , unknown > ) } ) ;
133+ } , [ onItemSelect ] ) ;
136134
137135 // Handle transition click from flows panel - highlight the relationship
138136 const handleTransitionClick = useCallback (
@@ -157,77 +155,65 @@ export function Drawer({ data }: DrawerProps) {
157155 ) ;
158156
159157 return (
160- < div { ...getRootProps ( ) } className = "flex-1 flex overflow-hidden h-full" >
158+ < div { ...getRootProps ( ) } className = "flex-1 flex flex-col overflow-hidden h-full" >
161159 { ! hasContent && < input { ...getInputProps ( ) } /> }
162- < div className = { `drawer drawer-end ${ selectedItem ? 'drawer-open' : '' } w-full h-full` } >
163- < input
164- type = "checkbox"
165- aria-label = "drawer-toggle"
166- className = "drawer-toggle"
167- checked = { ! ! selectedItem }
168- onChange = { closeSidebar }
169- />
170- < div className = "drawer-content h-full flex flex-col" >
171- { hasContent ? (
172- < >
173- < div
174- style = { {
175- flex : 1 ,
176- minHeight : 0 ,
177- ...( hasMetadata && ! isMetadataCollapsed ? { height : `calc(100% - ${ metadataPanelHeight } px)` } : { } ) ,
178- } }
179- >
180- { patternInstance ? (
181- < PatternVisualizer
182- patternData = { patternInstance }
183- onNodeClick = { handlePatternNodeClick }
184- onEdgeClick = { handlePatternEdgeClick }
185- onBackgroundClick = { closeSidebar }
186- />
187- ) : calmInstance ? (
188- < ReactFlowVisualizer
189- calmData = { calmInstance }
190- onNodeClick = { handleNodeClick }
191- onEdgeClick = { handleEdgeClick }
192- onBackgroundClick = { closeSidebar }
193- />
194- ) : null }
195- </ div >
196- { hasMetadata && ! patternInstance && (
197- < div
198- style = { {
199- height : isMetadataCollapsed ? '48px' : `${ metadataPanelHeight } px` ,
200- flexShrink : 0 ,
201- } }
202- >
203- < MetadataPanel
204- flows = { flows }
205- controls = { controls }
206- onTransitionClick = { handleTransitionClick }
207- onNodeClick = { handleControlNodeClick }
208- isCollapsed = { isMetadataCollapsed }
209- onToggleCollapse = { ( ) => setIsMetadataCollapsed ( ! isMetadataCollapsed ) }
210- height = { metadataPanelHeight }
211- onHeightChange = { setMetadataPanelHeight }
212- />
213- </ div >
214- ) }
215- </ >
216- ) : (
217- < div className = "flex justify-center items-center h-full w-full" >
218- { isDragActive ? (
219- < p > Drop your file here ...</ p >
220- ) : (
221- < p >
222- { 'Drag and drop your file here or ' }
223- < span className = "border-b border-dotted border-black pb-1" > Browse</ span >
224- </ p >
225- ) }
160+ { hasContent ? (
161+ < >
162+ < div
163+ style = { {
164+ flex : 1 ,
165+ minHeight : 0 ,
166+ ...( hasMetadata && ! isMetadataCollapsed ? { height : `calc(100% - ${ metadataPanelHeight } px)` } : { } ) ,
167+ } }
168+ >
169+ { patternInstance ? (
170+ < PatternVisualizer
171+ patternData = { patternInstance }
172+ onNodeClick = { handlePatternNodeClick }
173+ onEdgeClick = { handlePatternEdgeClick }
174+ onBackgroundClick = { closeSidebar }
175+ />
176+ ) : calmInstance ? (
177+ < ReactFlowVisualizer
178+ calmData = { calmInstance }
179+ onNodeClick = { handleNodeClick }
180+ onEdgeClick = { handleEdgeClick }
181+ onBackgroundClick = { closeSidebar }
182+ />
183+ ) : null }
184+ </ div >
185+ { hasMetadata && ! patternInstance && (
186+ < div
187+ style = { {
188+ height : isMetadataCollapsed ? '48px' : `${ metadataPanelHeight } px` ,
189+ flexShrink : 0 ,
190+ } }
191+ >
192+ < MetadataPanel
193+ flows = { flows }
194+ controls = { controls }
195+ onTransitionClick = { handleTransitionClick }
196+ onNodeClick = { handleControlNodeClick }
197+ isCollapsed = { isMetadataCollapsed }
198+ onToggleCollapse = { ( ) => setIsMetadataCollapsed ( ! isMetadataCollapsed ) }
199+ height = { metadataPanelHeight }
200+ onHeightChange = { setMetadataPanelHeight }
201+ />
226202 </ div >
227203 ) }
204+ </ >
205+ ) : (
206+ < div className = "flex justify-center items-center h-full w-full" >
207+ { isDragActive ? (
208+ < p > Drop your file here ...</ p >
209+ ) : (
210+ < p >
211+ { 'Drag and drop your file here or ' }
212+ < span className = "border-b border-dotted border-black pb-1" > Browse</ span >
213+ </ p >
214+ ) }
228215 </ div >
229- { selectedItem && < Sidebar selectedData = { selectedItem . data } closeSidebar = { closeSidebar } /> }
230- </ div >
216+ ) }
231217 </ div >
232218 ) ;
233219}
0 commit comments