-
Notifications
You must be signed in to change notification settings - Fork 862
Restore Flyout System feature in EUI #9202
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
This PR contains breaking changes. The opener of this pull request is asked to perform the following due diligence steps below, to assist EUI in our next Kibana upgrade:
|
Co-authored-by: Clint Andrew Hall <[email protected]> Co-authored-by: Weronika Olejniczak <[email protected]> Co-authored-by: Tomasz Kajtoch <[email protected]> Co-authored-by: Arturo Castillo Delgado <[email protected]> Co-authored-by: Paulina Shakirova <[email protected]>
41f8990 to
e2b53f0
Compare
…emain for other session (#9207)
…9150) Co-authored-by: Tomasz Kajtoch <[email protected]>
💚 Build SucceededHistory
|
💚 Build Succeeded
History
|
| @@ -0,0 +1 @@ | |||
| Flyout system menu bar: require tile, support custom actions | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: This was supposed to be "title", right?...
| Flyout system menu bar: require tile, support custom actions | |
| - Flyout system menu bar: require title, support custom actions |
| } | ||
| }); | ||
| }, [overlayMaskNode]); // eslint-disable-line react-hooks/exhaustive-deps | ||
| overlayMaskNode.addEventListener('animationend', handleAnimationEnd); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
critical doubt: It seems this event listener is not cleaned up anywhere, right? 🤔
|
When testing in Storybook the multi-session story I noticed this issue: Kapture.2025-11-28.at.13.34.00.mp4It has to do with our portal and a similar issue has been reported here: #9242. |
New Managed Flyout System
Re-open of #9068
This represents a significant evolution in the flyout system: a hook-based manager system with automatic context detection and support for complex flyout workflows.
Summary of API changes
session?('start' | 'never' | 'inherit', optional - defaults toinherit)Documentation: https://eui.elastic.co/pr_9202/docs/components/containers/flyout/#EuiFlyout-prop-session
onActive?(() => void, optional)Documentation: https://eui.elastic.co/pr_9202/docs/components/containers/flyout/#EuiFlyout-prop-onActive
resizable?(boolean, optional - defaults tofalse)resizableprop is dynamic which allows toggling between resizable state without whole-component rerendersThis makes the old EuiFlyoutResizable component obsolete (but it still works exactly like before). We may officially deprecate it in near future, but that's not the goal of this project. Read more
Documentation: https://eui.elastic.co/pr_9202/docs/components/containers/flyout/#resizable-flyout
onResize?minWidth?(number, optional)resizabe={true}to set a minimum width of the flyout.Documentation: https://eui.elastic.co/pr_9202/docs/components/containers/flyout/#resizable-flyout
flyoutMenuProps?(EuiFlyoutMenuProps, optional)Documentation: https://eui.elastic.co/pr_9202/docs/components/containers/flyout/#flyout-menu
hasChildBackground?refprop updateref?(React.Ref, optional)Legacy string refs are no longer supported with EuiFlyout. Use modern React refs like
useRefinstead. Read moreuseEuiFlyoutSession
EuiFlyoutSessionApi
EuiFlyoutSessionConfig
EuiFlyoutSessionRenderContext
ADDED - New Public-Facing Features
1. New Manager System
A comprehensive new "manager" system for centralized management of flyout sessions (
src/components/flyout/manager/):Core Component:
EuiFlyout: Same flyout component that developers are accustomed toSession Management Props:
sessionprop onEuiFlyoutwith three modes:'start'- Creates a new flyout session (for main flyouts)'inherit'- (default) Inherits existing session if active'never'- Opts out of session managementRequired EuiFlyoutMenu:
Managed flyouts require an
EuiFlyoutMenuat the top, which is automatically rendered when you provide the necessary props.flyoutMenuProps.title- (Required, or providearia-label) Prop that provides the title for the automatically renderedEuiFlyoutMenu. Additional properties inflyoutMenuPropsallow further customization of the menu (back button, history items, custom actions, etc.).Synchronizing local state with the visible flyout session:
Since flyout sessions can be programmatically activated, i.e the history navigation system can reactivate them, you may want to have a local state that is kept in sync with the active session. These callbacks can be used to update your local state variables:
onActivecallback - Fires when flyout becomes active/visible (new prop)onClosecallback - Fires when flyout is closed (not a new prop)The new manager system uses
use-sync-external-storeand a singleton store pattern for cross-React-root state sharing.2. New Flyout Menu Component
EuiFlyoutMenuandEuiFlyoutMenuProps: A new component for rendering a top menu bar in EuiFlyout.3.
resizableprop.EuiFlyoutResizablewas a complex wrapper that managed all resizing and state logic internally. The logic has been moved to an internal hook, which is now integrated directly into the main flyout component.EuiFlyoutnow supports aresizableboolean propEuiFlyoutResizableis still supported, but is just a wrapper forEuiFlyoutwithresizableset totrue.REMOVED - Earlier iteration of the Flyout System Feature
An earlier pre-release iteration of the Flyout System was in main but is now being removed.
1. Old Session System
The entire API of the earlier version is being removed:
EuiFlyoutSessionProvideruseEuiFlyoutSession()EuiFlyoutSessionApiEuiFlyoutSessionConfigEuiFlyoutSessionOpenChildOptionsEuiFlyoutSessionOpenMainOptionsEuiFlyoutSessionOpenGroupOptionsEuiFlyoutSessionProviderComponentPropsEuiFlyoutSessionRenderContext2. Old Child Flyout Implementation
Standalone(replaced with managed version)EuiFlyoutChildcomponentThe key difference from the old session system is that it used render props; the new manager system uses a centralized state store with hooks. The old system required explicit provider wrapping; the new system automatically detects when to use managed behavior.
Number of component usages in Kibana that will need to be updated: 0
Screenshots #
Impact to users #
BREAKING CHANGE - String Refs No Longer Supported
EuiFlyoutis aforwardRefcomponent that previously had loose typing allowing string refs. It now enforces strict typing that only accepts modern ref patterns. Specifically, this could impact you in two scenarios:EuiFlyout, you will need to pass an HTML element ref instead:styled-componentsto wrapEuiFlyout, your component implicitly becomes a string ref component. You will need to addref={null}to your component:Number of component usages in Kibana that will need to be updated: 1
fleet/sections/agent_policy/list_page/components/create_agent_policy.tsxFlyout overlay mask
z-indexvalue updateOverlay masks are now siblings of flyouts, which required a change to the mask's
z-indexvalue. Now, flyout overlay masks usez-indexvalue oflevels.flyout - 2making it more predictable. This stacking order allows child flyouts to have their ownz-indexlayer between the main flyout and the mask.QA
Remove or strikethrough items that do not apply to your PR.
PR Mergeability / Release readiness checklist
We must ensure this feature has everything it needs to be a publicly available feature in EUI before this branch is merged into
main. Please ensure the following are completed before merging this PR:General checklist
@defaultif default values are missing) and playground toggles[ ] Updated visual regression tests