@@ -31,7 +31,7 @@ import type {
31
31
} from '../ObjectPageTitle/index.js' ;
32
32
import { CollapsedAvatar } from './CollapsedAvatar.js' ;
33
33
import { classNames , styleData } from './ObjectPage.module.css.js' ;
34
- import { getSectionById } from './ObjectPageUtils.js' ;
34
+ import { getSectionById , getSectionElementById } from './ObjectPageUtils.js' ;
35
35
36
36
const ObjectPageCssVariables = {
37
37
headerDisplay : '--_ui5wcr_ObjectPage_header_display' ,
@@ -218,10 +218,10 @@ const ObjectPage = forwardRef<ObjectPageDomRef, ObjectPagePropTypes>((props, ref
218
218
const [ internalSelectedSectionId , setInternalSelectedSectionId ] = useState < string | undefined > (
219
219
selectedSectionId ?? firstSectionId
220
220
) ;
221
- const [ selectedSubSectionId , setSelectedSubSectionId ] = useState ( props . selectedSubSectionId ) ;
221
+ const [ selectedSubSectionId , setSelectedSubSectionId ] = useState ( undefined ) ;
222
222
const [ headerPinned , setHeaderPinned ] = useState ( headerPinnedProp ) ;
223
223
const isProgrammaticallyScrolled = useRef ( false ) ;
224
- const prevSelectedSectionId = useRef < string | undefined > ( undefined ) ;
224
+ const [ isMounted , setIsMounted ] = useState ( false ) ;
225
225
226
226
const [ componentRef , objectPageRef ] = useSyncRef ( ref ) ;
227
227
const topHeaderRef = useRef < HTMLDivElement > ( null ) ;
@@ -326,9 +326,7 @@ const ObjectPage = forwardRef<ObjectPageDomRef, ObjectPagePropTypes>((props, ref
326
326
} , [ image , classNames . headerImage , classNames . image , imageShapeCircle ] ) ;
327
327
328
328
const scrollToSectionById = ( id : string | undefined , isSubSection = false ) => {
329
- const section = objectPageRef . current ?. querySelector < HTMLElement > (
330
- `#${ isSubSection ? 'ObjectPageSubSection' : 'ObjectPageSection' } -${ CSS . escape ( id ) } `
331
- ) ;
329
+ const section = getSectionElementById ( objectPageRef . current , isSubSection , id ) ;
332
330
scrollTimeout . current = performance . now ( ) + 500 ;
333
331
if ( section ) {
334
332
const safeTopHeaderHeight = topHeaderHeight || prevTopHeaderHeight . current ;
@@ -367,45 +365,6 @@ const ObjectPage = forwardRef<ObjectPageDomRef, ObjectPagePropTypes>((props, ref
367
365
isProgrammaticallyScrolled . current = false ;
368
366
} ;
369
367
370
- const programmaticallySetSection = ( ) => {
371
- const currentId = selectedSectionId ?? firstSectionId ;
372
- if ( currentId !== prevSelectedSectionId . current ) {
373
- debouncedOnSectionChange . cancel ( ) ;
374
- isProgrammaticallyScrolled . current = true ;
375
- setInternalSelectedSectionId ( currentId ) ;
376
- prevSelectedSectionId . current = currentId ;
377
- const sectionNodes = objectPageRef . current ?. querySelectorAll ( 'section[data-component-name="ObjectPageSection"]' ) ;
378
- const currentIndex = childrenArray . findIndex ( ( objectPageSection ) => {
379
- return isValidElement ( objectPageSection ) && objectPageSection . props ?. id === currentId ;
380
- } ) ;
381
- fireOnSelectedChangedEvent ( { } , currentIndex , currentId , sectionNodes [ 0 ] ) ;
382
- }
383
- } ;
384
-
385
- // change selected section when prop is changed (external change)
386
- const [ timeStamp , setTimeStamp ] = useState ( 0 ) ;
387
- const requestAnimationFrameRef = useRef < undefined | number > ( undefined ) ;
388
- useEffect ( ( ) => {
389
- if ( selectedSectionId ) {
390
- if ( mode === ObjectPageMode . Default ) {
391
- // wait for DOM draw, otherwise initial scroll won't work as intended
392
- if ( timeStamp < 750 && timeStamp !== undefined ) {
393
- requestAnimationFrameRef . current = requestAnimationFrame ( ( internalTimestamp ) => {
394
- setTimeStamp ( internalTimestamp ) ;
395
- } ) ;
396
- } else {
397
- setTimeStamp ( undefined ) ;
398
- programmaticallySetSection ( ) ;
399
- }
400
- } else {
401
- programmaticallySetSection ( ) ;
402
- }
403
- }
404
- return ( ) => {
405
- cancelAnimationFrame ( requestAnimationFrameRef . current ) ;
406
- } ;
407
- } , [ timeStamp , selectedSectionId , firstSectionId , debouncedOnSectionChange ] ) ;
408
-
409
368
// section was selected by clicking on the tab bar buttons
410
369
const handleOnSectionSelected = ( targetEvent , newSelectionSectionId , index , section ) => {
411
370
isProgrammaticallyScrolled . current = true ;
@@ -421,12 +380,24 @@ const ObjectPage = forwardRef<ObjectPageDomRef, ObjectPagePropTypes>((props, ref
421
380
fireOnSelectedChangedEvent ( targetEvent , index , newSelectionSectionId , section ) ;
422
381
} ;
423
382
383
+ useEffect ( ( ) => {
384
+ if ( selectedSectionId ) {
385
+ const selectedSection = getSectionElementById ( objectPageRef . current , false , selectedSectionId ) ;
386
+ if ( selectedSection ) {
387
+ const selectedSectionIndex = Array . from (
388
+ selectedSection . parentElement . querySelectorAll ( ':scope > [data-component-name="ObjectPageSection"]' )
389
+ ) . indexOf ( selectedSection ) ;
390
+ handleOnSectionSelected ( { } , selectedSectionId , selectedSectionIndex , selectedSection ) ;
391
+ }
392
+ }
393
+ } , [ selectedSectionId ] ) ;
394
+
424
395
// do internal scrolling
425
396
useEffect ( ( ) => {
426
397
if ( mode === ObjectPageMode . Default && isProgrammaticallyScrolled . current === true && ! selectedSubSectionId ) {
427
398
scrollToSection ( internalSelectedSectionId ) ;
428
399
}
429
- } , [ internalSelectedSectionId , mode , isProgrammaticallyScrolled , scrollToSection , selectedSubSectionId ] ) ;
400
+ } , [ internalSelectedSectionId , mode , selectedSubSectionId ] ) ;
430
401
431
402
// Scrolling for Sub Section Selection
432
403
useEffect ( ( ) => {
@@ -457,11 +428,15 @@ const ObjectPage = forwardRef<ObjectPageDomRef, ObjectPagePropTypes>((props, ref
457
428
} , [ headerPinned , topHeaderHeight ] ) ;
458
429
459
430
useEffect ( ( ) => {
431
+ if ( ! isMounted ) {
432
+ setIsMounted ( true ) ;
433
+ return ;
434
+ }
460
435
setSelectedSubSectionId ( props . selectedSubSectionId ) ;
461
436
if ( props . selectedSubSectionId ) {
462
437
isProgrammaticallyScrolled . current = true ;
463
438
if ( mode === ObjectPageMode . IconTabBar ) {
464
- let sectionId ;
439
+ let sectionId : string ;
465
440
childrenArray . forEach ( ( section ) => {
466
441
if ( isValidElement ( section ) && section . props && section . props . children ) {
467
442
safeGetChildrenArray ( section . props . children ) . forEach ( ( subSection ) => {
@@ -480,7 +455,7 @@ const ObjectPage = forwardRef<ObjectPageDomRef, ObjectPagePropTypes>((props, ref
480
455
}
481
456
}
482
457
}
483
- } , [ props . selectedSubSectionId , childrenArray , mode ] ) ;
458
+ } , [ props . selectedSubSectionId , isMounted ] ) ;
484
459
485
460
const tabContainerContainerRef = useRef ( null ) ;
486
461
useEffect ( ( ) => {
0 commit comments