@@ -7,12 +7,14 @@ import {
77 Button ,
88 PopoverDomRef ,
99 ButtonDomRef ,
10+ LinkDomRef ,
1011} from '@ui5/webcomponents-react' ;
1112import { AnalyticalTableColumnDefinition } from '@ui5/webcomponents-react/wrappers' ;
1213import PopoverPlacement from '@ui5/webcomponents/dist/types/PopoverPlacement.js' ;
1314import '@ui5/webcomponents-icons/dist/copy' ;
1415import { JSX , useRef , useState } from 'react' ;
1516import type { ButtonClickEventDetail } from '@ui5/webcomponents/dist/Button.js' ;
17+ import type { LinkClickEventDetail } from '@ui5/webcomponents/dist/Link.js' ;
1618import {
1719 ControlPlaneStatusType ,
1820 ReadyStatus ,
@@ -30,17 +32,28 @@ type MCPHealthPopoverButtonProps = {
3032 projectName : string ;
3133 workspaceName : string ;
3234 mcpName : string ;
35+ large ?: boolean ;
3336} ;
3437
35- const MCPHealthPopoverButton = ( { mcpStatus, projectName, workspaceName, mcpName } : MCPHealthPopoverButtonProps ) => {
38+ const MCPHealthPopoverButton = ( {
39+ mcpStatus,
40+ projectName,
41+ workspaceName,
42+ mcpName,
43+ large = false ,
44+ } : MCPHealthPopoverButtonProps ) => {
3645 const popoverRef = useRef < PopoverDomRef > ( null ) ;
46+ const buttonRef = useRef < ButtonDomRef > ( null ) ;
3747 const [ open , setOpen ] = useState ( false ) ;
3848 const { githubIssuesSupportTicket } = useLink ( ) ;
3949 const { t } = useTranslation ( ) ;
4050
41- const handleOpenerClick = ( event : Ui5CustomEvent < ButtonDomRef , ButtonClickEventDetail > ) => {
51+ const handleOpenerClick = (
52+ event : Ui5CustomEvent < ButtonDomRef , ButtonClickEventDetail > | Ui5CustomEvent < LinkDomRef , LinkClickEventDetail > ,
53+ ) => {
4254 if ( popoverRef . current ) {
43- ( popoverRef . current as unknown as { opener : EventTarget | null } ) . opener = event . target ;
55+ // Prefer explicit button ref as opener (works reliably); fall back to event.target
56+ ( popoverRef . current as unknown as { opener : EventTarget | null } ) . opener = buttonRef . current ?? event . target ;
4457 setOpen ( ( prev ) => ! prev ) ;
4558 }
4659 } ;
@@ -141,11 +154,13 @@ const MCPHealthPopoverButton = ({ mcpStatus, projectName, workspaceName, mcpName
141154 return (
142155 < div className = "component-title-row" >
143156 < AnimatedHoverTextButton
157+ ref = { buttonRef }
144158 icon = { getIconForOverallStatus ( mcpStatus ?. status ) }
145159 text = { mcpStatus ?. status ?? '' }
160+ large = { large }
146161 onClick = { handleOpenerClick }
147162 />
148- < Popover ref = { popoverRef } open = { open } placement = { PopoverPlacement . Bottom } >
163+ < Popover ref = { popoverRef } open = { open } placement = { PopoverPlacement . Bottom } onClose = { ( ) => setOpen ( false ) } >
149164 < StatusTable
150165 status = { mcpStatus }
151166 tableColumns = { statusTableColumns }
@@ -184,11 +199,11 @@ const StatusTable = ({ status, tableColumns, githubIssuesLink }: StatusTableProp
184199const getIconForOverallStatus = ( status : ReadyStatus | undefined ) : JSX . Element => {
185200 switch ( status ) {
186201 case ReadyStatus . Ready :
187- return < Icon style = { { color : 'green ' } } name = "sap-icon://sys-enter" /> ;
202+ return < Icon style = { { color : 'var(--sapPositiveColor) ' } } name = "sap-icon://sys-enter" /> ;
188203 case ReadyStatus . NotReady :
189- return < Icon style = { { color : 'red ' } } name = "sap-icon://pending" /> ;
204+ return < Icon style = { { color : 'var(--sapNegativeColor) ' } } name = "sap-icon://pending" /> ;
190205 case ReadyStatus . InDeletion :
191- return < Icon style = { { color : 'orange ' } } name = "sap-icon://delete" /> ;
206+ return < Icon style = { { color : 'var(--sapCriticalColor) ' } } name = "sap-icon://delete" /> ;
192207 default :
193208 return < > </ > ;
194209 }
0 commit comments