@@ -24,6 +24,8 @@ import {
2424 ChevronLeft ,
2525 ChevronRight ,
2626 ArrowUpDown ,
27+ ChevronDown ,
28+ ChevronUp ,
2729} from 'lucide-react' ;
2830import type { DataSource , FieldMetadata } from '@object-ui/types' ;
2931import { getCellRenderer } from '@object-ui/fields' ;
@@ -55,6 +57,10 @@ export interface RelatedListProps {
5557 sortable ?: boolean ;
5658 /** Enable text filtering */
5759 filterable ?: boolean ;
60+ /** Whether the card is collapsible */
61+ collapsible ?: boolean ;
62+ /** Whether the card starts collapsed (requires collapsible=true) */
63+ defaultCollapsed ?: boolean ;
5864}
5965
6066export const RelatedList : React . FC < RelatedListProps > = ( {
@@ -74,6 +80,8 @@ export const RelatedList: React.FC<RelatedListProps> = ({
7480 pageSize,
7581 sortable = false ,
7682 filterable = false ,
83+ collapsible = false ,
84+ defaultCollapsed = false ,
7785} ) => {
7886 const [ relatedData , setRelatedData ] = React . useState ( data ) ;
7987 const [ loading , setLoading ] = React . useState ( false ) ;
@@ -82,6 +90,7 @@ export const RelatedList: React.FC<RelatedListProps> = ({
8290 const [ sortDirection , setSortDirection ] = React . useState < 'asc' | 'desc' > ( 'asc' ) ;
8391 const [ filterText , setFilterText ] = React . useState ( '' ) ;
8492 const [ objectSchema , setObjectSchema ] = React . useState < any > ( null ) ;
93+ const [ collapsed , setCollapsed ] = React . useState ( defaultCollapsed ) ;
8594 const { t } = useDetailTranslation ( ) ;
8695 const { fieldLabel : resolveFieldLabel } = useSafeFieldLabel ( ) ;
8796
@@ -253,31 +262,36 @@ export const RelatedList: React.FC<RelatedListProps> = ({
253262
254263 return (
255264 < Card className = { className } >
256- < CardHeader >
265+ < CardHeader className = { collapsible ? 'cursor-pointer select-none' : undefined } onClick = { collapsible ? ( ) => setCollapsed ( ( c ) => ! c ) : undefined } >
257266 < CardTitle className = "flex items-center justify-between" >
258267 < div className = "flex items-center gap-2" >
268+ { collapsible && (
269+ collapsed
270+ ? < ChevronRight className = "h-4 w-4 text-muted-foreground" />
271+ : < ChevronDown className = "h-4 w-4 text-muted-foreground" />
272+ ) }
259273 < span > { title } </ span >
260274 < span className = "text-sm font-normal text-muted-foreground" >
261275 { recordCountText }
262276 </ span >
263277 </ div >
264278 < div className = "flex items-center gap-1" >
265279 { onNew && (
266- < Button variant = "ghost" size = "sm" onClick = { onNew } className = "gap-1 h-7 text-xs" >
280+ < Button variant = "ghost" size = "sm" onClick = { ( e ) => { e . stopPropagation ( ) ; onNew ( ) ; } } className = "gap-1 h-7 text-xs" >
267281 < Plus className = "h-3.5 w-3.5" />
268282 { t ( 'detail.new' ) }
269283 </ Button >
270284 ) }
271285 { onViewAll && (
272- < Button variant = "ghost" size = "sm" onClick = { onViewAll } className = "gap-1 h-7 text-xs" >
286+ < Button variant = "ghost" size = "sm" onClick = { ( e ) => { e . stopPropagation ( ) ; onViewAll ( ) ; } } className = "gap-1 h-7 text-xs" >
273287 { t ( 'detail.viewAll' ) }
274288 < ExternalLink className = "h-3 w-3" />
275289 </ Button >
276290 ) }
277291 </ div >
278292 </ CardTitle >
279293 </ CardHeader >
280- < CardContent >
294+ { ! collapsed && < CardContent >
281295 { /* Filter bar */ }
282296 { filterable && relatedData . length > 0 && (
283297 < div className = "mb-3" >
@@ -394,7 +408,7 @@ export const RelatedList: React.FC<RelatedListProps> = ({
394408 </ Button >
395409 </ div >
396410 ) }
397- </ CardContent >
411+ </ CardContent > }
398412 </ Card >
399413 ) ;
400414} ;
0 commit comments