Skip to content

Commit

Permalink
[DataGrid] Workaround for failing jsdom tests caused by :has select…
Browse files Browse the repository at this point in the history
…ors (#14559)
  • Loading branch information
KenanYusuf authored Sep 12, 2024
1 parent 7120da2 commit 2bd21e8
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ interface GridColumnHeaderItemProps {
indexInSection: number;
sectionLength: number;
gridHasFiller: boolean;
isLastUnpinned: boolean;
isSiblingFocused: boolean;
}

type OwnerState = GridColumnHeaderItemProps & {
Expand All @@ -56,6 +58,8 @@ const useUtilityClasses = (ownerState: OwnerState) => {
showLeftBorder,
filterItemsCounter,
pinnedPosition,
isLastUnpinned,
isSiblingFocused,
} = ownerState;

const isColumnSorted = sortDirection != null;
Expand All @@ -79,6 +83,10 @@ const useUtilityClasses = (ownerState: OwnerState) => {
showLeftBorder && 'columnHeader--withLeftBorder',
pinnedPosition === 'left' && 'columnHeader--pinnedLeft',
pinnedPosition === 'right' && 'columnHeader--pinnedRight',
// TODO: Remove classes below and restore `:has` selectors when they are supported in jsdom
// See https://github.com/mui/mui-x/pull/14559
isLastUnpinned && 'columnHeader--lastUnpinned',
isSiblingFocused && 'columnHeader--siblingFocused',
],
draggableContainer: ['columnHeaderDraggableContainer'],
titleContainer: ['columnHeaderTitleContainer'],
Expand Down Expand Up @@ -326,7 +334,9 @@ GridColumnHeaderItem.propTypes = {
indexInSection: PropTypes.number.isRequired,
isDragging: PropTypes.bool.isRequired,
isLast: PropTypes.bool.isRequired,
isLastUnpinned: PropTypes.bool.isRequired,
isResizing: PropTypes.bool.isRequired,
isSiblingFocused: PropTypes.bool.isRequired,
pinnedPosition: PropTypes.oneOf(['left', 'right']),
sectionLength: PropTypes.number.isRequired,
separatorSide: PropTypes.oneOf(['left', 'right']),
Expand Down
10 changes: 3 additions & 7 deletions packages/x-data-grid/src/components/containers/GridRootStyles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -289,12 +289,10 @@ export const GridRootStyles = styled('div', {
// - the column has a left or right border
// - the next column is pinned right and has a left border
[`& .${c.columnHeader}:focus,
& .${c.columnHeader}:focus-within,
& .${c.columnHeader}:has(+ .${c.columnHeader}:focus),
& .${c.columnHeader}:has(+ .${c.columnHeader}:focus-within),
& .${c['columnHeader--withLeftBorder']},
& .${c['columnHeader--withRightBorder']},
& .${c.columnHeader}:has(+ .${c.filler} + .${c['columnHeader--withLeftBorder']}),
& .${c['columnHeader--siblingFocused']},
& .${c['virtualScroller--hasScrollX']} .${c['columnHeader--lastUnpinned']},
& .${c['virtualScroller--hasScrollX']} .${c['columnHeader--last']}
`]: {
[`& .${c.columnSeparator}`]: {
Expand Down Expand Up @@ -413,9 +411,7 @@ export const GridRootStyles = styled('div', {
'@media (hover: none)': {
[`& .${c.columnHeader}`]: columnHeaderStyles,
[`& .${c.columnHeader}:focus,
& .${c.columnHeader}:focus-within,
& .${c.columnHeader}:has(+ .${c.columnHeader}:focus),
& .${c.columnHeader}:has(+ .${c.columnHeader}:focus-within)`]: {
& .${c['columnHeader--siblingFocused']}`]: {
[`.${c['columnSeparator--resizable']}`]: {
color: (t.vars || t).palette.primary.main,
},
Expand Down
13 changes: 13 additions & 0 deletions packages/x-data-grid/src/constants/gridClasses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,17 @@ export interface GridClasses {
* Styles applied to the last column header element.
*/
'columnHeader--last': string;
/**
* Styles applied to the last unpinned column header item.
* @ignore - do not document.
*/
'columnHeader--lastUnpinned': string;
/**
* Styles applied to a column header item when its sibling with a bordering separator is focused.
* @ignore - do not document.
*/
'columnHeader--siblingFocused': string;

/**
* Styles applied to the header checkbox cell element.
*/
Expand Down Expand Up @@ -686,6 +697,8 @@ export const gridClasses = generateUtilityClasses<GridClassKey>('MuiDataGrid', [
'columnHeader--pinnedLeft',
'columnHeader--pinnedRight',
'columnHeader--last',
'columnHeader--lastUnpinned',
'columnHeader--siblingFocused',
'columnHeaderCheckbox',
'columnHeaderDraggableContainer',
'columnHeaderTitle',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,17 @@ export const useGridColumnHeaders = (props: UseGridColumnHeadersProps) => {
computedWidth: colDef.computedWidth,
});

const siblingWithBorderingSeparator =
pinnedPosition === GridPinnedColumnPosition.RIGHT
? renderedColumns[i - 1]
: renderedColumns[i + 1];
const isSiblingFocused = siblingWithBorderingSeparator
? columnHeaderFocus !== null &&
columnHeaderFocus.field === siblingWithBorderingSeparator.field
: false;
const isLastUnpinned =
columnIndex + 1 === columnPositions.length - pinnedColumns.right.length;

columns.push(
<GridColumnHeaderItem
key={colDef.field}
Expand All @@ -295,6 +306,8 @@ export const useGridColumnHeaders = (props: UseGridColumnHeadersProps) => {
indexInSection={i}
sectionLength={renderedColumns.length}
gridHasFiller={gridHasFiller}
isLastUnpinned={isLastUnpinned}
isSiblingFocused={isSiblingFocused}
{...other}
/>,
);
Expand Down

0 comments on commit 2bd21e8

Please sign in to comment.