@@ -26,8 +26,9 @@ export interface ObjectTableProps {
2626
2727 /**
2828 * ObjectQL data source
29+ * Optional when inline data is provided in schema
2930 */
30- dataSource : ObjectQLDataSource ;
31+ dataSource ? : ObjectQLDataSource ;
3132
3233 /**
3334 * Additional CSS class
@@ -90,10 +91,24 @@ export const ObjectTable: React.FC<ObjectTableProps> = ({
9091 const [ columns , setColumns ] = useState < TableColumn [ ] > ( [ ] ) ;
9192 const [ selectedRows , setSelectedRows ] = useState < any [ ] > ( [ ] ) ;
9293
93- // Fetch object schema from ObjectQL
94+ // Check if using inline data
95+ const hasInlineData = Boolean ( schema . data ) ;
96+
97+ // Initialize with inline data if provided
98+ useEffect ( ( ) => {
99+ if ( hasInlineData && schema . data ) {
100+ setData ( schema . data ) ;
101+ setLoading ( false ) ;
102+ }
103+ } , [ hasInlineData , schema . data ] ) ;
104+
105+ // Fetch object schema from ObjectQL (skip if using inline data)
94106 useEffect ( ( ) => {
95107 const fetchObjectSchema = async ( ) => {
96108 try {
109+ if ( ! dataSource ) {
110+ throw new Error ( 'DataSource is required when using ObjectQL schema fetching (inline data not provided)' ) ;
111+ }
97112 const schemaData = await dataSource . getObjectSchema ( schema . objectName ) ;
98113 setObjectSchema ( schemaData ) ;
99114 } catch ( err ) {
@@ -102,13 +117,43 @@ export const ObjectTable: React.FC<ObjectTableProps> = ({
102117 }
103118 } ;
104119
105- if ( schema . objectName && dataSource ) {
120+ // Skip fetching schema if we have inline data and custom columns
121+ if ( hasInlineData && schema . columns ) {
122+ // Use a minimal schema for inline data with type safety
123+ setObjectSchema ( {
124+ name : schema . objectName ,
125+ fields : { } as Record < string , any > ,
126+ } ) ;
127+ } else if ( schema . objectName && ! hasInlineData && dataSource ) {
106128 fetchObjectSchema ( ) ;
107129 }
108- } , [ schema . objectName , dataSource ] ) ;
130+ } , [ schema . objectName , schema . columns , dataSource , hasInlineData ] ) ;
109131
110- // Generate columns from object schema
132+ // Generate columns from object schema or inline data
111133 useEffect ( ( ) => {
134+ // For inline data with custom columns, use the custom columns directly
135+ if ( hasInlineData && schema . columns ) {
136+ setColumns ( schema . columns ) ;
137+ return ;
138+ }
139+
140+ // For inline data without custom columns, auto-generate from first data row
141+ if ( hasInlineData && schema . data && schema . data . length > 0 ) {
142+ const generatedColumns : TableColumn [ ] = [ ] ;
143+ const firstRow = schema . data [ 0 ] ;
144+ const fieldsToShow = schema . fields || Object . keys ( firstRow ) ;
145+
146+ fieldsToShow . forEach ( ( fieldName ) => {
147+ generatedColumns . push ( {
148+ header : fieldName . charAt ( 0 ) . toUpperCase ( ) + fieldName . slice ( 1 ) . replace ( / _ / g, ' ' ) ,
149+ accessorKey : fieldName ,
150+ } ) ;
151+ } ) ;
152+
153+ setColumns ( generatedColumns ) ;
154+ return ;
155+ }
156+
112157 if ( ! objectSchema ) return ;
113158
114159 const generatedColumns : TableColumn [ ] = [ ] ;
@@ -215,11 +260,19 @@ export const ObjectTable: React.FC<ObjectTableProps> = ({
215260 }
216261
217262 setColumns ( generatedColumns ) ;
218- } , [ objectSchema , schema . fields , schema . columns , schema . operations , onEdit , onDelete ] ) ;
263+ } , [ objectSchema , schema . fields , schema . columns , schema . operations , schema . data , hasInlineData , onEdit , onDelete ] ) ;
219264
220- // Fetch data from ObjectQL
265+ // Fetch data from ObjectQL (skip if using inline data)
221266 const fetchData = useCallback ( async ( ) => {
267+ // Don't fetch if using inline data
268+ if ( hasInlineData ) return ;
269+
222270 if ( ! schema . objectName ) return ;
271+ if ( ! dataSource ) {
272+ setError ( new Error ( 'DataSource is required for remote data fetching (inline data not provided)' ) ) ;
273+ setLoading ( false ) ;
274+ return ;
275+ }
223276
224277 setLoading ( true ) ;
225278 setError ( null ) ;
@@ -248,7 +301,7 @@ export const ObjectTable: React.FC<ObjectTableProps> = ({
248301 } finally {
249302 setLoading ( false ) ;
250303 }
251- } , [ schema , dataSource ] ) ;
304+ } , [ schema , dataSource , hasInlineData ] ) ;
252305
253306 useEffect ( ( ) => {
254307 if ( columns . length > 0 ) {
@@ -287,18 +340,22 @@ export const ObjectTable: React.FC<ObjectTableProps> = ({
287340 ( item . _id || item . id ) !== recordId
288341 ) ) ;
289342
290- // Call backend delete
291- await dataSource . delete ( schema . objectName , recordId ) ;
343+ // Call backend delete only if we have a dataSource
344+ if ( ! hasInlineData && dataSource ) {
345+ await dataSource . delete ( schema . objectName , recordId ) ;
346+ }
292347
293348 // Notify parent
294349 onDelete ( record ) ;
295350 } catch ( err ) {
296351 console . error ( 'Failed to delete record:' , err ) ;
297352 // Revert optimistic update on error
298- await fetchData ( ) ;
353+ if ( ! hasInlineData ) {
354+ await fetchData ( ) ;
355+ }
299356 alert ( 'Failed to delete record. Please try again.' ) ;
300357 }
301- } , [ schema . objectName , dataSource , onDelete , fetchData ] ) ;
358+ } , [ schema . objectName , dataSource , hasInlineData , onDelete , fetchData ] ) ;
302359
303360 // Handle bulk delete action
304361 const handleBulkDelete = useCallback ( async ( records : any [ ] ) => {
@@ -319,8 +376,10 @@ export const ObjectTable: React.FC<ObjectTableProps> = ({
319376 ! recordIds . includes ( item . _id || item . id )
320377 ) ) ;
321378
322- // Call backend bulk delete
323- await dataSource . bulk ( schema . objectName , 'delete' , records ) ;
379+ // Call backend bulk delete only if we have a dataSource
380+ if ( ! hasInlineData && dataSource ) {
381+ await dataSource . bulk ( schema . objectName , 'delete' , records ) ;
382+ }
324383
325384 // Notify parent
326385 onBulkDelete ( records ) ;
@@ -330,10 +389,12 @@ export const ObjectTable: React.FC<ObjectTableProps> = ({
330389 } catch ( err ) {
331390 console . error ( 'Failed to delete records:' , err ) ;
332391 // Revert optimistic update on error
333- await fetchData ( ) ;
392+ if ( ! hasInlineData ) {
393+ await fetchData ( ) ;
394+ }
334395 alert ( 'Failed to delete records. Please try again.' ) ;
335396 }
336- } , [ schema . objectName , dataSource , onBulkDelete , fetchData ] ) ;
397+ } , [ schema . objectName , dataSource , hasInlineData , onBulkDelete , fetchData ] ) ;
337398
338399 // Handle row selection
339400 const handleRowSelect = useCallback ( ( rows : any [ ] ) => {
0 commit comments