-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
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
[DataGridPro] Fix column resize with pinned rows #10229
[DataGridPro] Fix column resize with pinned rows #10229
Conversation
Netlify deploy previewNetlify deploy preview: https://deploy-preview-10229--material-ui-x.netlify.app/ Updated pagesNo updates. These are the results for the performance tests:
|
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.
Works great 🎉
if (cell) { | ||
cells.push(cell); | ||
} | ||
api.virtualScrollerRef?.current?.childNodes.forEach((child) => { |
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.
A small opportunity: We could possibly avoid one loop by targeting rows directly from the virtualScroller
.
diff --git a/packages/grid/x-data-grid-pro/src/utils/domUtils.ts b/packages/grid/x-data-grid-pro/src/utils/domUtils.ts
index 42046bf72..b21304b32 100644
--- a/packages/grid/x-data-grid-pro/src/utils/domUtils.ts
+++ b/packages/grid/x-data-grid-pro/src/utils/domUtils.ts
@@ -28,9 +28,9 @@ export function findGridCellElementsFromCol(col: HTMLElement, api: GridPrivateAp
const colIndex = Number(ariaColIndex) - 1;
const cells: Element[] = [];
- api.virtualScrollerRef?.current?.childNodes.forEach((child) => {
- const renderedRowElements = (child as HTMLElement).querySelectorAll(
- `:scope > div > .${gridClasses.row}`, // Use > to ignore rows from detail panels
+ if (api.virtualScrollerRef?.current) {
+ const renderedRowElements = api.virtualScrollerRef.current.querySelectorAll(
+ `div > .${gridClasses.row}`, // Use > to ignore rows from detail panels
);
renderedRowElements.forEach((rowElement) => {
@@ -50,7 +50,7 @@ export function findGridCellElementsFromCol(col: HTMLElement, api: GridPrivateAp
cells.push(cell);
}
});
- });
+ }
return cells;
}
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.
This will break #9670 (the very same PR that caused this regression 😅)
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.
Ah, correct 🤦 I missed backtracking the original problem.
Just out of curiosity I tried updating the selector from div > .${gridClasses.row}
to :scope > div > div > .${gridClasses.row}
and it seems to work without breaking #9670.
Its a CSS-only solution, still I am not sure if it's the most elegant of the solutions, since the selector has become a bit longer than usual and also depends on a strict DOM hierarchy. 😆
Feel free to go with whatever you feel better.
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.
Also, comment // Use > to ignore rows from detail panels
could probably become // Use > to ignore rows from nested data grids
as the grid could also be nested in a cell other than a detail panel.
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.
Alright, that works, thanks!
Fixes #10206
Before: https://codesandbox.io/s/ancient-haze-26rlql
After: https://codesandbox.io/s/small-waterfall-n36zd2