@@ -39,13 +39,68 @@ export const ListView: React.FC<ListViewProps> = ({
3939 const [ sortField ] = React . useState ( schema . sort ?. [ 0 ] ?. field || '' ) ;
4040 const [ sortOrder , setSortOrder ] = React . useState < 'asc' | 'desc' > ( schema . sort ?. [ 0 ] ?. order || 'asc' ) ;
4141 const [ showFilters , setShowFilters ] = React . useState ( false ) ;
42+
43+ // Data State
44+ const dataSource = props . dataSource ;
45+ const [ data , setData ] = React . useState < any [ ] > ( [ ] ) ;
46+ const [ loading , setLoading ] = React . useState ( false ) ;
4247
4348 const storageKey = React . useMemo ( ( ) => {
4449 return schema . id
4550 ? `listview-${ schema . objectName } -${ schema . id } -view`
4651 : `listview-${ schema . objectName } -view` ;
4752 } , [ schema . objectName , schema . id ] ) ;
4853
54+ // Fetch data effect
55+ React . useEffect ( ( ) => {
56+ let isMounted = true ;
57+
58+ const fetchData = async ( ) => {
59+ if ( ! dataSource || ! schema . objectName ) return ;
60+
61+ setLoading ( true ) ;
62+ try {
63+ // Construct filter
64+ let filter : any = schema . filters || [ ] ;
65+ // TODO: Merge with searchTerm and user filters
66+ // For now, we rely on the backend/driver to handle $filter
67+
68+ // Convert sort to query format
69+ // ObjectQL uses simple object: { field: 'asc' }
70+ const sort : any = sortField ? { [ sortField ] : sortOrder } : undefined ;
71+
72+ const results = await dataSource . find ( schema . objectName , {
73+ $filter : filter ,
74+ $orderby : sort ,
75+ $top : 100 // Default pagination limit
76+ } ) ;
77+
78+ let items : any [ ] = [ ] ;
79+ if ( Array . isArray ( results ) ) {
80+ items = results ;
81+ } else if ( results && typeof results === 'object' ) {
82+ if ( Array . isArray ( ( results as any ) . data ) ) {
83+ items = ( results as any ) . data ;
84+ } else if ( Array . isArray ( ( results as any ) . value ) ) {
85+ items = ( results as any ) . value ;
86+ }
87+ }
88+
89+ if ( isMounted ) {
90+ setData ( items ) ;
91+ }
92+ } catch ( err ) {
93+ console . error ( "ListView data fetch error:" , err ) ;
94+ } finally {
95+ if ( isMounted ) setLoading ( false ) ;
96+ }
97+ } ;
98+
99+ fetchData ( ) ;
100+
101+ return ( ) => { isMounted = false ; } ;
102+ } , [ schema . objectName , dataSource , schema . filters , sortField , sortOrder ] ) ; // Re-fetch on filter/sort change
103+
49104 // Load saved view preference
50105 React . useEffect ( ( ) => {
51106 try {
@@ -201,6 +256,11 @@ export const ListView: React.FC<ListViewProps> = ({
201256 < div className = "relative flex-1 max-w-md" >
202257 < Search className = "absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
203258 < Input
259+ schema = { viewComponentSchema }
260+ { ...props }
261+ data = { data } // Pass data to children to avoid double-fetch
262+ loading = { loading }
263+
204264 placeholder = { `Search ${ schema . objectName } ...` }
205265 value = { searchTerm }
206266 onChange = { ( e ) => handleSearchChange ( e . target . value ) }
0 commit comments