Skip to content
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

[EuiTourStep] className consistency with EuiPopover + performance/cleanups #7497

Merged
merged 7 commits into from
Feb 2, 2024

Conversation

cee-chen
Copy link
Member

@cee-chen cee-chen commented Jan 31, 2024

Summary

As always, I recommend following along by commit!

Breaking prop<->DOM changes

  • Applies EuiTourStep classNames to the anchor element instead of to the popover panel
    • This change was made to be consistent with EuiPopover behavior (consumers cannot otherwise apply styles to the anchor since we deprecated the anchorClassName prop).
    • Existing usages should be converted to panelClassName instead
  • Applies EuiTourStep's style prop to the anchor element instead of to the popover panel

Tech debt

  • Converts all Enzyme tests for EuiTourStep to RTL and switches snapshots to assertions
  • Converts several inline CSS styles to their logical property equivalents
  • Refactors code heavily for performance; adds missing memoization and breaks out several conditional inline JSX to React.memo'd subcomponents which optimizes/reduces rerenders.
    • Additionally, smaller subcomponents makes it easier to reason about individual bits of code/logic.

QA

General checklist

  • Browser QA
    • Checked in both light and dark modes
    • Checked in mobile - Note: appears to be somewhat buggy already in prod
    • Checked in Chrome, Safari, Edge, and Firefox
      - [ ] Checked for accessibility including keyboard-only and screenreader modes** - EuiTour does not appear to be inherently accessible in production
  • Docs site QA - N/A - refactor
  • Code quality checklist
  • Release checklist
    • A changelog entry exists and is marked appropriately.
    • If applicable, added the breaking change issue label (and filled out the breaking change checklist)
  • Designer checklist - N/A

- consumers who want to add a className to the popover panel should use `panelClassName` instead
- consumers who want to add styles to the popover panel should use `panelStyle` instead

+ fix/clean up extended EuiPopover props typing(s) to allow `style` prop
+ replace snapshots with explicit assertions
- split up into `memo`'d internal subcomponents (most performant option), which also has the side benefit of making code a little easier to reason about
- bah humbug
@kibanamachine
Copy link

Preview staging links for this PR:

@elasticmachine
Copy link
Collaborator

💚 Build Succeeded

Copy link

github-actions bot commented Jan 31, 2024

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:

  • If this PR contains prop/API changes:
    • Search through Kibana for <EuiComponent usages (example search)
    • In the PR description or in a PR comment, include a count or list with the number of component usages in Kibana that will need to be updated (if that amount is "none", include that information as well)
  • If this PR contains CSS changes:

@cee-chen
Copy link
Member Author

Checked all usages of <EuiTourStep> in Kibana and did not find any that were passing custom classNames or styles. 🎉

@cee-chen cee-chen marked this pull request as ready for review January 31, 2024 21:24
@cee-chen cee-chen requested a review from a team as a code owner January 31, 2024 21:24
@tkajtoch tkajtoch self-requested a review February 2, 2024 16:32
@@ -7,7 +7,6 @@
*/

import React from 'react';
import { mount } from 'enzyme';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎉

const customFooterAction = useMemo(() => {
if (!footerAction) return null;

return Array.isArray(footerAction) ? (
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think using a regular if statement would be cleaner here, but I have no strong preference!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a huge sucker for early returns 😅 I like that they mean the rest of the code has one less set of indentations!

);
}

const [anchorNode, setAnchorNode] = useState<HTMLElement | null>(null);
const [popoverPosition, setPopoverPosition] = useState<EuiPopoverPosition>();

const onPositionChange = (position: EuiPopoverPosition) => {
const onPositionChange = useCallback((position: EuiPopoverPosition) => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎉

Copy link
Member

@tkajtoch tkajtoch left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! The changes look and work great 🎉

Feel free to ignore my comment about the if statement if you prefer to leave it as is!

@cee-chen
Copy link
Member Author

cee-chen commented Feb 2, 2024

Thanks a million Tomasz! Hope my comment about the early return makes sense, you'll definitely see me continue to do that in code if I can get away with it :shifty_eyes:

@cee-chen cee-chen merged commit ff19255 into elastic:main Feb 2, 2024
10 checks passed
@cee-chen cee-chen deleted the tour-step/className branch February 2, 2024 17:16
jbudz added a commit to elastic/kibana that referenced this pull request Feb 8, 2024
`v92.2.1` ⏩ `v93.0.0`

---

## [`v93.0.0`](https://github.com/elastic/eui/releases/v93.0.0)

**Bug fixes**

- Fixed `EuiTextTruncate` component to clean up timer from side effect
on unmount ([#7495](elastic/eui#7495))

**Breaking changes**

- Removed deprecated `anchorClassName` prop from `EuiPopover`. Use
`className` instead ([#7488](elastic/eui#7488))
- Removed deprecated `buttonRef` prop from `EuiPopover`. Use
`popoverRef` instead ([#7488](elastic/eui#7488))
- Removed deprecated `toolTipTitle` and `toolTipPosition` props from
`EuiContextMenuItem`. Use `toolTipProps.title` and
`toolTipProps.position` instead
([#7489](elastic/eui#7489))
- Removed deprecated internal `setSelection` ref method from
`EuiInMemoryTable` and `EuiBasicTable`. Use the new controlled
`selection.selected` prop API instead.
([#7491](elastic/eui#7491))
- `EuiTourStep`'s `className` and `style` props now apply to the
anchoring element instead of to the popover panel, to match `EuiPopover`
behavior. ([#7497](elastic/eui#7497))
- Convert your existing usages to `panelClassName` and `panelStyle`
respectively instead.

**Performance**

- Improved the amount of recomputed styles being generated by `EuiCode`
and `EuiCodeBlock` ([#7486](elastic/eui#7486))

**CSS-in-JS conversions**

- Converted `EuiSearchBar` to Emotion
([#7490](elastic/eui#7490))
- Converted `EuiEmptyPrompt` to Emotion
([#7494](elastic/eui#7494))
- Added `euiBorderColor` and `useEuiBorderColorCSS` style utilities
([#7494](elastic/eui#7494))

---------

Co-authored-by: Jon <jon@elastic.co>
CoenWarmer pushed a commit to CoenWarmer/kibana that referenced this pull request Feb 15, 2024
`v92.2.1` ⏩ `v93.0.0`

---

## [`v93.0.0`](https://github.com/elastic/eui/releases/v93.0.0)

**Bug fixes**

- Fixed `EuiTextTruncate` component to clean up timer from side effect
on unmount ([elastic#7495](elastic/eui#7495))

**Breaking changes**

- Removed deprecated `anchorClassName` prop from `EuiPopover`. Use
`className` instead ([elastic#7488](elastic/eui#7488))
- Removed deprecated `buttonRef` prop from `EuiPopover`. Use
`popoverRef` instead ([elastic#7488](elastic/eui#7488))
- Removed deprecated `toolTipTitle` and `toolTipPosition` props from
`EuiContextMenuItem`. Use `toolTipProps.title` and
`toolTipProps.position` instead
([elastic#7489](elastic/eui#7489))
- Removed deprecated internal `setSelection` ref method from
`EuiInMemoryTable` and `EuiBasicTable`. Use the new controlled
`selection.selected` prop API instead.
([elastic#7491](elastic/eui#7491))
- `EuiTourStep`'s `className` and `style` props now apply to the
anchoring element instead of to the popover panel, to match `EuiPopover`
behavior. ([elastic#7497](elastic/eui#7497))
- Convert your existing usages to `panelClassName` and `panelStyle`
respectively instead.

**Performance**

- Improved the amount of recomputed styles being generated by `EuiCode`
and `EuiCodeBlock` ([elastic#7486](elastic/eui#7486))

**CSS-in-JS conversions**

- Converted `EuiSearchBar` to Emotion
([elastic#7490](elastic/eui#7490))
- Converted `EuiEmptyPrompt` to Emotion
([elastic#7494](elastic/eui#7494))
- Added `euiBorderColor` and `useEuiBorderColorCSS` style utilities
([elastic#7494](elastic/eui#7494))

---------

Co-authored-by: Jon <jon@elastic.co>
fkanout pushed a commit to fkanout/kibana that referenced this pull request Mar 4, 2024
`v92.2.1` ⏩ `v93.0.0`

---

## [`v93.0.0`](https://github.com/elastic/eui/releases/v93.0.0)

**Bug fixes**

- Fixed `EuiTextTruncate` component to clean up timer from side effect
on unmount ([elastic#7495](elastic/eui#7495))

**Breaking changes**

- Removed deprecated `anchorClassName` prop from `EuiPopover`. Use
`className` instead ([elastic#7488](elastic/eui#7488))
- Removed deprecated `buttonRef` prop from `EuiPopover`. Use
`popoverRef` instead ([elastic#7488](elastic/eui#7488))
- Removed deprecated `toolTipTitle` and `toolTipPosition` props from
`EuiContextMenuItem`. Use `toolTipProps.title` and
`toolTipProps.position` instead
([elastic#7489](elastic/eui#7489))
- Removed deprecated internal `setSelection` ref method from
`EuiInMemoryTable` and `EuiBasicTable`. Use the new controlled
`selection.selected` prop API instead.
([elastic#7491](elastic/eui#7491))
- `EuiTourStep`'s `className` and `style` props now apply to the
anchoring element instead of to the popover panel, to match `EuiPopover`
behavior. ([elastic#7497](elastic/eui#7497))
- Convert your existing usages to `panelClassName` and `panelStyle`
respectively instead.

**Performance**

- Improved the amount of recomputed styles being generated by `EuiCode`
and `EuiCodeBlock` ([elastic#7486](elastic/eui#7486))

**CSS-in-JS conversions**

- Converted `EuiSearchBar` to Emotion
([elastic#7490](elastic/eui#7490))
- Converted `EuiEmptyPrompt` to Emotion
([elastic#7494](elastic/eui#7494))
- Added `euiBorderColor` and `useEuiBorderColorCSS` style utilities
([elastic#7494](elastic/eui#7494))

---------

Co-authored-by: Jon <jon@elastic.co>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants