fix(frontend): tooltips anchored on a React Fragment never open
Description
Seven Tooltip call sites pass a React Fragment as the tooltip's single child. MUI's Tooltip forwards its ref to that child and gates the tooltip on having resolved a DOM node from it, so a Fragment child means the tooltip never opens. These seven tooltips are silently dead.
In @mui/material 6.5.0, Tooltip builds the child ref with:
const handleRef = useForkRef(getReactElementRef(children), setChildNode, ref);and then gates the popper on the resolved node:
open: childNode ? open : false,A Fragment cannot hold a ref, so setChildNode is never called, childNode stays undefined, and open is forced to false regardless of hover state.
Affected call sites:
| File | Line | Column / place |
|---|---|---|
opencti-platform/opencti-front/src/components/dataGrid/dataTableUtils.tsx |
226 | color |
| 490 | file_size |
|
| 803 | number_observed |
|
| 871 | operatingSystem |
|
| 1409 | x_opencti_color |
|
opencti-platform/opencti-front/src/private/components/common/stix_core_relationships/StixCoreRelationshipOverview.tsx |
4531 | source entity name |
| 4589 | target entity name |
Environment
- OS: Fedora 44 (Linux 7.2.5)
- Version: 7.260917.0
- Other environment details:
@mui/material6.5.0,react/react-dom19.2.8, Chromium via Playwright
Reproducible steps
- Go to Observations > Artifacts.
- Hover the value shown in the File size column.
Expected output
A tooltip appears, as it does for the neighbouring columns rendered through defaultRender (for example Value or Platform creation date), which anchor the tooltip on a Stack.
Actual output
No tooltip appears. Measured on a running platform by hovering the value and counting [role="tooltip"] nodes:
| Column | Anchor element | Tooltips found |
|---|---|---|
observable_value (via defaultRender) |
Stack |
1 |
created_at (via defaultRender) |
Stack |
1 |
file_size (Fragment child) |
div cell, no anchor |
0 |
Replacing the Fragment with a real element restores it, at an unchanged React version: the anchor becomes a span and one tooltip is found.
Additional information
This also blocks the React 19.3.0 upgrade (#18247). React 19.3.0 introduces Fragment Refs, so a ref attached to a <Fragment /> is no longer ignored — it is invoked with a FragmentInstance. That object has neither getAttribute nor removeAttribute, so Tooltip throws TypeError: childNode.getAttribute is not a function from a passive effect, which remounts the subtree in a loop. On #18247 this made tests_e2e/artifact/createArtifact.spec.ts time out, because the artifacts list renders the file_size column.
Side observation, not covered by this report: the file_size column passes file?.metaData?.mimetype as its tooltip title, so once anchored it shows the mime type rather than the size.
Source: OpenCTI-Platform/opencti