@@ -47,6 +47,10 @@ export interface ObjectCalendarProps {
4747 schema : ObjectGridSchema | CalendarSchema ;
4848 dataSource ?: DataSource ;
4949 className ?: string ;
50+ /** Pre-fetched records passed by a parent (e.g. ObjectView). When provided, skips internal data fetching. */
51+ data ?: any [ ] ;
52+ /** Loading state propagated from a parent. Respected only when `data` is also provided. */
53+ loading ?: boolean ;
5054 onEventClick ?: ( record : any ) => void ;
5155 onRowClick ?: ( record : any ) => void ;
5256 onDateClick ?: ( date : Date ) => void ;
@@ -142,6 +146,8 @@ export const ObjectCalendar: React.FC<ObjectCalendarProps> = ({
142146 schema,
143147 dataSource,
144148 className,
149+ data : externalData ,
150+ loading : externalLoading ,
145151 onEventClick,
146152 onRowClick,
147153 onDateClick,
@@ -151,8 +157,12 @@ export const ObjectCalendar: React.FC<ObjectCalendarProps> = ({
151157 locale,
152158 ...rest
153159} ) => {
154- const [ data , setData ] = useState < any [ ] > ( [ ] ) ;
155- const [ loading , setLoading ] = useState ( true ) ;
160+ // When the parent (e.g. ObjectView) pre-fetches data and passes it via the `data` prop,
161+ // we must not trigger a second fetch. Detect external data by checking for an array.
162+ const hasExternalData = Array . isArray ( externalData ) ;
163+
164+ const [ data , setData ] = useState < any [ ] > ( hasExternalData ? externalData ! : [ ] ) ;
165+ const [ loading , setLoading ] = useState ( hasExternalData ? ( externalLoading ?? false ) : true ) ;
156166 const [ error , setError ] = useState < Error | null > ( null ) ;
157167 const [ objectSchema , setObjectSchema ] = useState < any > ( null ) ;
158168 const [ currentDate , setCurrentDate ] = useState ( new Date ( ) ) ;
@@ -187,8 +197,24 @@ export const ObjectCalendar: React.FC<ObjectCalendarProps> = ({
187197 const objectSchemaRef = useRef < any > ( null ) ;
188198 objectSchemaRef . current = objectSchema ;
189199
200+ // Sync external data/loading changes from parent (e.g. ObjectView re-fetches after filter change)
201+ useEffect ( ( ) => {
202+ if ( hasExternalData ) {
203+ setData ( externalData ! ) ;
204+ }
205+ } , [ externalData , hasExternalData ] ) ;
206+
207+ useEffect ( ( ) => {
208+ if ( hasExternalData && externalLoading !== undefined ) {
209+ setLoading ( externalLoading ) ;
210+ }
211+ } , [ externalLoading , hasExternalData ] ) ;
212+
190213 // Fetch data based on provider
191214 useEffect ( ( ) => {
215+ // Skip internal fetch when data is managed by a parent component
216+ if ( hasExternalData ) return ;
217+
192218 let isMounted = true ;
193219 const fetchData = async ( ) => {
194220 try {
@@ -203,16 +229,6 @@ export const ObjectCalendar: React.FC<ObjectCalendarProps> = ({
203229 return ;
204230 }
205231
206- // Prioritize data passed from parent (ListView)
207- if ( ( schema as any ) . data || ( rest as any ) . data ) {
208- const passedData = ( schema as any ) . data || ( rest as any ) . data ;
209- if ( Array . isArray ( passedData ) ) {
210- setData ( passedData ) ;
211- setLoading ( false ) ;
212- return ;
213- }
214- }
215-
216232 if ( ! dataSource || typeof dataSource . find !== 'function' ) {
217233 throw new Error ( 'DataSource required for object/api providers' ) ;
218234 }
@@ -249,7 +265,7 @@ export const ObjectCalendar: React.FC<ObjectCalendarProps> = ({
249265
250266 fetchData ( ) ;
251267 return ( ) => { isMounted = false ; } ;
252- } , [ dataConfig , dataSource , hasInlineData , schema . filter , schema . sort , refreshKey ] ) ;
268+ } , [ hasExternalData , dataConfig , dataSource , hasInlineData , schema . filter , schema . sort , refreshKey ] ) ;
253269
254270 // Fetch object schema for field metadata
255271 useEffect ( ( ) => {
0 commit comments