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

DRY out new EuiTableCellContent internal subcomponent & convert to Emotion #7641

Merged
merged 10 commits into from
Apr 3, 2024

Conversation

cee-chen
Copy link
Member

@cee-chen cee-chen commented Apr 2, 2024

Summary

NOTE: This is going into the EuiTable Emotion conversion/cleanup feature branch.

As always this is A Lot so I recommend following along by commit!

EuiTableRowCell, EuiTableHeaderCell, and EuiTableFooterCell were all manually creating and setting internal <div/span className="euiTableCellContent"> and .euiTableCellContent__text nodes.

This PR DRYs out the cell content wrapper (and its text child) to a new internal EuiTableCellContent subcomponent, and also simplifies/removes some React.cloneElement shenanigans that was very unclear was needed or not (I leaned not).

With this PR, the last of the Sass files are now fully converted/deleted! 🎉 (there will be 1 more PR after this with some extra cleanup, tests, storybooks for QA, and one or two bug fixes).

QA

General checklist

  • Browser QA
    • Checked in mobile
    • Checked in Chrome, Safari, Edge, and Firefox
      - [ ] Checked for accessibility including keyboard-only and screenreader modes
      - [ ] Checked in both light and dark modes
  • Docs site QA - N/A
  • Code quality checklist
    • Skipped unit tests for the new internal subcomponent but updated basic tables a bit. Let me know if you think I should be more gung-ho about writing tests!
  • 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

@cee-chen cee-chen changed the title DRY out new EuiTableCellContent internal subcomponent & convert cell content styles to Emotion DRY out new EuiTableCellContent internal subcomponent & convert to Emotion Apr 2, 2024
@cee-chen cee-chen force-pushed the emotion/table-7 branch 2 times, most recently from 7a01683 to 4b89eaf Compare April 2, 2024 05:13
cee-chen added 10 commits April 2, 2024 10:42
+ convert its more basic styles to Emotion
…ent` component

🔥 Remove bizarre `validElement`/`cloneElement` check & behavior - totally unnecessary as far as I can tell, and not a best practice we want to perpetuate

⚠️ Removed classNames:
- `.euiTableCellContent--overflowingContent`
- `.euiTableCellContent--truncateText`
- look at all that repeated CSS we can DRY out now!
- more complex than footer cells due to sort mixed text/sort icon

- add `null` option to `textTruncate` to allow header cells to not set either wrapping or truncate (it sets its own truncation on its own custom `<span>` element)

- reduce specificity of last nested `.euiTableCellContent`
- remove unnecessary selector on `text-decoration: underline` - with flex gap this works great on the entire button without having to target the text specifically

- changes wrapping `<span>` element to a `<div>`, which is fine/more consistent with other cells
- caused by new Emotion wrappers. RTL assertions are more precise in any case
- Fix 1: `flex-direction: column` and `padding: 0` was being applied to custom action cells when they should not have been

- Fix 2: table rows with only custom actions were still showing an empty right column border/padding on mobile. We needed the `actions="custom"` logic on table rows as well as row cells

+ Add a few test assertions to try and capture regressions in the future
@cee-chen cee-chen marked this pull request as ready for review April 2, 2024 18:10
@cee-chen cee-chen requested a review from a team as a code owner April 2, 2024 18:10
@kibanamachine
Copy link

Preview staging links for this PR:

@elasticmachine
Copy link
Collaborator

💚 Build Succeeded

History

Copy link
Contributor

@mgadewoll mgadewoll left a comment

Choose a reason for hiding this comment

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

Overall it looks good to me! Nice cleanups and code optimizations! 🎉

One thing that I noticed when QAing: It looks like the responsive table now is always shown in mobile layout here - that's not expected, I think?

@cee-chen
Copy link
Member Author

cee-chen commented Apr 3, 2024

One thing that I noticed when QAing: It looks like the responsive table now is always shown in mobile layout here - that's not expected, I think?

It is expected / it's a change I made as part of #7625. Since consumers can now completely customize the breakpoint at which tables collapse into mobile cards (including having them never show via false or always show via true), I figured it would make the most sense to immediately show what that mobile view looked like at all breakpoints.

@mgadewoll
Copy link
Contributor

mgadewoll commented Apr 3, 2024

One thing that I noticed when QAing: It looks like the responsive table now is always shown in mobile layout here - that's not expected, I think?

It is expected / it's a change I made as part of #7625. Since consumers can now completely customize the breakpoint at which tables collapse into mobile cards (including having them never show via false or always show via true), I figured it would make the most sense to immediately show what that mobile view looked like at all breakpoints.

Ok, yeah I understand it now. It felt a bit unexpected because the text for responsive tables states:

Tables will be mobile-responsive by default, breaking down each row into its own card section and individually displaying each table header above the cell contents. The default breakpoint at which the table will responsively shift into cards is the m window size, which can be customized with the responsiveBreakpoint prop (e.g., responsiveBreakpoint="s").

But then when responsive is enabled the responsive table does not change layout at any breakpoint but always stays in mobile layout. 😅

@cee-chen
Copy link
Member Author

cee-chen commented Apr 3, 2024

Ah good call, thanks. I'll do another pass on the table docs copy before the final feature branch! There's definitely some stuff in there that no longer applies or could be clarified.

Copy link
Contributor

@mgadewoll mgadewoll left a comment

Choose a reason for hiding this comment

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

🚢 🐈‍⬛ Thanks for the additional clarifications! The changes look good to me!

@cee-chen cee-chen merged commit 7725261 into elastic:tableflip Apr 3, 2024
6 checks passed
@cee-chen cee-chen deleted the emotion/table-7 branch April 3, 2024 15:51
mistic pushed a commit to elastic/kibana that referenced this pull request Apr 18, 2024
`v93.6.0` ⏩ `v94.1.0`

> [!important]
> 👋 Hello everyone - this is a special release containing `EuiTable`'s
conversion to Emotion, several long-overdue cleanups and breaking
changes, and one or two fun new features. First, let's address the big
questions:

### Q: I'm listed as a codeowner, how much should I manually QA/review?

Answer: It depends on what exactly in your code changed, but _in
general_ I would strongly suggest at least pulling this branch down and
doing a quick visual smoke test of all tables (_note: **not**
datagrids_) in your apps/plugins. You should not expect to see any major
visual regressions.

If your table contained any kind of custom styling or behavior (e.g.
custom CSS, etc.) I **strongly** recommend taking more time to QA
thoroughly to ensure your table still looks and behaves as expected.
Teams with very manual or specific updates will be flagged below in
comment threads.

### Q: When do I need to review by?

This PR will be merged **after** 8.14FF. Because this upgrade touches so
many files and teams, we're aiming for asking for an admin merge by EOD
4/18 regardless of full approval status.

As always, you're welcome to ping us after merge if you find any issues
later ([see our
FAQ](https://github.com/elastic/eui/blob/main/wiki/eui-team-processes/upgrading-kibana.md#faq-for-kibana-teams)),
as you will have until 8.15FF to catch any bugs.

### Q: What breaking changes were made, and why?

Here's a quick shortlist of all the changes made that affected the
majority of the commits in this PR:

#### <u>Removed several top-level table props</u>
- The `responsive` prop has been removed in favor of the new
`responsiveBreakpoint` prop (same `false` behavior as before)
- The following props were removed from basic and in-memory tables:
  - `hasActions`, `isSelectable`, and `isExpandable`
- These props were not used for functionality and were only used for
styling tables in mobile/responsive views, which is not a best practice
pattern we wanted for our APIs. Mobile tables are now styled correctly
without needing consumers to pass these extra props.
  - `textOnly`
- This prop was unused and had no meaningful impact on tables or table
content.

#### Removed hidden mobile vs. desktop DOM

Previously, EUI would set classes that applied `display: none` CSS for
content that was hidden for mobile vs. desktop. This is no longer the
case, and content that only displays for mobile or only displays for
desktop will no longer render to the DOM at all if the table is not in
that responsive state.

This is both more performant when rendering large quantities of
cells/content, and simpler to write test assertions for when comparing
what the user actually sees vs. what the DOM ‘sees’.
(c3eeb08441e4b6efe6505e7cddaa87b540ddb259,
78cefcd954a7b46eaccd05e431b5e24dc86071a3)

#### Removed direct usages of table `className`s

EuiTable `classNames` no longer have any styles attached to them, so
some instances where Kibana usages were applying the `className` for
styles have been replaced with direct component usage or removed
entirely (86ce80b).

#### Custom table cell styles

Any custom CSS for table cells was previously being applied to the inner
`div.euiTableCellContent` wrapper. As of this latest release, the
`className` and `css` props will now be applied directly to the outer
`td.euiTableRowCell` element. If you were targeting custom styles table
cells, please re-QA your styles to ensure everything still looks as
expected.

---

<details open><summary>Full changelog (click to collapse)</summary>

##
[`v94.1.0-backport.0`](https://github.com/elastic/eui/releases/v94.1.0-backport.0)

**This is a backport release only intended for use by Kibana.**

**Bug fixes**

- Fixed a visual text alignment regression in `EuiTableRowCell`s with
the `row` header scope
([#7681](elastic/eui#7681))

**Accessibility**

- Improved `EuiBasicTable` and `EuiInMemoryTable`'s selection checkboxes
to have unique aria-labels per row
([#7672](elastic/eui#7672))

## [`v94.1.0`](https://github.com/elastic/eui/releases/v94.1.0)

- Updated `EuiTableHeaderCell` to show a subdued `sortable` icon for
columns that are not currently sorted but can be
([#7656](elastic/eui#7656))
- Updated `EuiBasicTable` and `EuiInMemoryTable`'s
`columns[].actions[]`'s to pass back click events to `onClick` callbacks
as the second callback
([#7667](elastic/eui#7667))

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

- Updated `EuiTable`, `EuiBasicTable`, and `EuiInMemoryTable` with a new
`responsiveBreakpoint` prop, which allows customizing the point at which
the table collapses into a mobile-friendly view with cards
([#7625](elastic/eui#7625))
- Updated `EuiProvider`'s `componentDefaults` prop to allow configuring
`EuiTable.responsiveBreakpoint`
([#7625](elastic/eui#7625))

**Bug fixes**

- `EuiBasicTable` & `EuiInMemoryTable` `isPrimary` actions are now
correctly shown on mobile views
([#7640](elastic/eui#7640))
- Table `mobileOptions`:
([#7642](elastic/eui#7642))
- `mobileOptions.align` is now respected instead of all cells being
forced to left alignment
- `textTruncate` and `textOnly` are now respected even if a `render`
function is not passed

**Breaking changes**

- Removed unused `EuiTableHeaderButton` component
([#7621](elastic/eui#7621))
- Removed the `responsive` prop from `EuiTable`, `EuiBasicTable`, and
`EuiInMemoryTable`. Use the new `responsiveBreakpoint` prop instead
([#7625](elastic/eui#7625))
- The following props are no longer needed by `EuiBasicTable` or
`EuiInMemoryTable` for responsive table behavior to work correctly, and
can be removed: ([#7632](elastic/eui#7632))
  - `isSelectable`
  - `isExpandable`
  - `hasActions`
- Removed the `showOnHover` prop from `EuiTableRowCell` /
`EuiBasicTable`/`EuiInMemoryTable`'s `columns` API. Use the new actions
`columns[].actions[].showOnHover` API instead.
([#7640](elastic/eui#7640))
- Removed top-level `textOnly` prop from `EuiBasicTable` and
`EuiInMemoryTable`. Use `columns[].textOnly` instead.
([#7642](elastic/eui#7642))

**DOM changes**

- `EuiTable` mobile headers no longer render in the DOM when not visible
(previously rendered with `display: none`). This may affect DOM testing
assertions. ([#7625](elastic/eui#7625))
- `EuiTableRowCell` now applies passed `className`s to the parent `<td>`
element, instead of to the inner cell content `<div>`.
([#7631](elastic/eui#7631))
- `EuiTableRow`s rendered by basic and memory tables now only render a
`.euiTableRow-isSelectable` className if the selection checkbox is not
disabled ([#7632](elastic/eui#7632))
- `EuiTableRowCell`s with `textOnly` set to `false` will no longer
attempt to apply the `.euiTableCellContent__text` className to child
elements. ([#7641](elastic/eui#7641))
- `EuiTableRowCell` no longer renders mobile headers to the DOM unless
the current table is displaying its responsive view.
([#7642](elastic/eui#7642))
- `EuiTableHeaderCell` and `EuiTableRowCell` will no longer render in
the DOM at all on mobile if their columns' `mobileOptions.show` is set
to `false`. ([#7642](elastic/eui#7642))
- `EuiTableHeaderCell` and `EuiTableRowCell` will no longer render in
the DOM at all on desktop if their columns' `mobileOptions.only` is set
to `true`. ([#7642](elastic/eui#7642))

**CSS-in-JS conversions**

- Converted `EuiTable`, `EuiTableRow`, `EuiTableRowCell`, and all other
table subcomponents to Emotion
([#7654](elastic/eui#7654))
- Removed the following `EuiTable` Sass variables:
([#7654](elastic/eui#7654))
  - `$euiTableCellContentPadding`
  - `$euiTableCellContentPaddingCompressed`
  - `$euiTableCellCheckboxWidth`
  - `$euiTableHoverColor`
  - `$euiTableSelectedColor`
  - `$euiTableHoverSelectedColor`
  - `$euiTableActionsBorderColor`
  - `$euiTableHoverClickableColor`
  - `$euiTableFocusClickableColor`
- Removed the following `EuiTable` Sass mixins:
([#7654](elastic/eui#7654))
  - `euiTableActionsBackgroundMobile`
  - `euiTableCellCheckbox`
  - `euiTableCell`
</details>
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