-
Notifications
You must be signed in to change notification settings - Fork 8.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
[Dashboard] [Collapsable Panels] Switch to using props #200793
[Dashboard] [Collapsable Panels] Switch to using props #200793
Conversation
8ac8d36
to
53684fc
Compare
examples/grid_example/public/app.tsx
Outdated
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.
I modified this example to more similarly match how the Dashboard integration will work by adding a mock dashboard API. We use the panels$
+ rows$
behaviour subjects as our "source of truth" for the layout engine, so that we always stay in sync.
const panelContents = useMemo(() => { | ||
return renderPanelContents(panelId); | ||
}, [panelId, renderPanelContents]); |
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.
By adding the layout
prop, this was causing a chain reaction where renderPanelContents
was being called whenever the layout
changed - by memoizing this component, this removes that unnecessary re-render.
Pinging @elastic/kibana-presentation (Team:Presentation) |
…om:heenawter/kibana into kbn-grid-layout_switch-to-props_2024-11-19
💛 Build succeeded, but was flaky
Failed CI StepsMetrics [docs]Public APIs missing comments
Public APIs missing exports
Unknown metric groupsAPI count
ESLint disabled line counts
Total ESLint disabled count
History
cc @Heenawter |
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.
lgtm! I agree that this will make dashboard integration easier.
code review and tested the examples.
Starting backport for target branches: 8.x |
Closes elastic#200090 ## Summary This PR migrates the `GridLayout` component a more traditional React design using **props** rather than providing an API. This change serves two purposes: 1. It makes the eventual Dashboard migration easier, since it is more similar to `react-grid-layout`'s implementation 3. It makes the `GridLayout` component less opinionated by moving the logic for panel management (i.e. panel placement, etc) to the parent component. I tried to keep efficiency in mind for this comparison, and ensured that we are still keeping the number of rerenders **o a minimum**. This PR should not introduce **any** extra renders in comparison to the API version. ### Checklist - [x] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) ### Identify risks There are no risks to this PR, since all work is contained in the `examples` plugin. --------- Co-authored-by: kibanamachine <[email protected]> (cherry picked from commit 5495322)
💚 All backports created successfully
Note: Successful backport PRs will be merged automatically after passing CI. Questions ?Please refer to the Backport tool documentation |
#201253) # Backport This will backport the following commits from `main` to `8.x`: - [[Dashboard] [Collapsable Panels] Switch to using props (#200793)](#200793) <!--- Backport version: 9.4.3 --> ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) <!--BACKPORT [{"author":{"name":"Hannah Mudge","email":"[email protected]"},"sourceCommit":{"committedDate":"2024-11-21T17:27:56Z","message":"[Dashboard] [Collapsable Panels] Switch to using props (#200793)\n\nCloses https://github.com/elastic/kibana/issues/200090\r\n\r\n## Summary\r\n\r\nThis PR migrates the `GridLayout` component a more traditional React\r\ndesign using **props** rather than providing an API. This change serves\r\ntwo purposes:\r\n1. It makes the eventual Dashboard migration easier, since it is more\r\nsimilar to `react-grid-layout`'s implementation\r\n3. It makes the `GridLayout` component less opinionated by moving the\r\nlogic for panel management (i.e. panel placement, etc) to the parent\r\ncomponent.\r\n\r\nI tried to keep efficiency in mind for this comparison, and ensured that\r\nwe are still keeping the number of rerenders **o a minimum**. This PR\r\nshould not introduce **any** extra renders in comparison to the API\r\nversion.\r\n\r\n### Checklist\r\n\r\n- [x] The PR description includes the appropriate Release Notes section,\r\nand the correct `release_note:*` label is applied per the\r\n[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)\r\n\r\n### Identify risks\r\n\r\nThere are no risks to this PR, since all work is contained in the\r\n`examples` plugin.\r\n\r\n---------\r\n\r\nCo-authored-by: kibanamachine <[email protected]>","sha":"549532240cd8bc271a78b74846021c9023e2da64","branchLabelMapping":{"^v9.0.0$":"main","^v8.18.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["Feature:Dashboard","Team:Presentation","loe:medium","release_note:skip","impact:high","v9.0.0","backport:prev-minor","Project:Collapsable Panels"],"title":"[Dashboard] [Collapsable Panels] Switch to using props","number":200793,"url":"https://github.com/elastic/kibana/pull/200793","mergeCommit":{"message":"[Dashboard] [Collapsable Panels] Switch to using props (#200793)\n\nCloses https://github.com/elastic/kibana/issues/200090\r\n\r\n## Summary\r\n\r\nThis PR migrates the `GridLayout` component a more traditional React\r\ndesign using **props** rather than providing an API. This change serves\r\ntwo purposes:\r\n1. It makes the eventual Dashboard migration easier, since it is more\r\nsimilar to `react-grid-layout`'s implementation\r\n3. It makes the `GridLayout` component less opinionated by moving the\r\nlogic for panel management (i.e. panel placement, etc) to the parent\r\ncomponent.\r\n\r\nI tried to keep efficiency in mind for this comparison, and ensured that\r\nwe are still keeping the number of rerenders **o a minimum**. This PR\r\nshould not introduce **any** extra renders in comparison to the API\r\nversion.\r\n\r\n### Checklist\r\n\r\n- [x] The PR description includes the appropriate Release Notes section,\r\nand the correct `release_note:*` label is applied per the\r\n[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)\r\n\r\n### Identify risks\r\n\r\nThere are no risks to this PR, since all work is contained in the\r\n`examples` plugin.\r\n\r\n---------\r\n\r\nCo-authored-by: kibanamachine <[email protected]>","sha":"549532240cd8bc271a78b74846021c9023e2da64"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","branchLabelMappingKey":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/200793","number":200793,"mergeCommit":{"message":"[Dashboard] [Collapsable Panels] Switch to using props (#200793)\n\nCloses https://github.com/elastic/kibana/issues/200090\r\n\r\n## Summary\r\n\r\nThis PR migrates the `GridLayout` component a more traditional React\r\ndesign using **props** rather than providing an API. This change serves\r\ntwo purposes:\r\n1. It makes the eventual Dashboard migration easier, since it is more\r\nsimilar to `react-grid-layout`'s implementation\r\n3. It makes the `GridLayout` component less opinionated by moving the\r\nlogic for panel management (i.e. panel placement, etc) to the parent\r\ncomponent.\r\n\r\nI tried to keep efficiency in mind for this comparison, and ensured that\r\nwe are still keeping the number of rerenders **o a minimum**. This PR\r\nshould not introduce **any** extra renders in comparison to the API\r\nversion.\r\n\r\n### Checklist\r\n\r\n- [x] The PR description includes the appropriate Release Notes section,\r\nand the correct `release_note:*` label is applied per the\r\n[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)\r\n\r\n### Identify risks\r\n\r\nThere are no risks to this PR, since all work is contained in the\r\n`examples` plugin.\r\n\r\n---------\r\n\r\nCo-authored-by: kibanamachine <[email protected]>","sha":"549532240cd8bc271a78b74846021c9023e2da64"}}]}] BACKPORT--> Co-authored-by: Hannah Mudge <[email protected]>
Closes elastic#200090 ## Summary This PR migrates the `GridLayout` component a more traditional React design using **props** rather than providing an API. This change serves two purposes: 1. It makes the eventual Dashboard migration easier, since it is more similar to `react-grid-layout`'s implementation 3. It makes the `GridLayout` component less opinionated by moving the logic for panel management (i.e. panel placement, etc) to the parent component. I tried to keep efficiency in mind for this comparison, and ensured that we are still keeping the number of rerenders **o a minimum**. This PR should not introduce **any** extra renders in comparison to the API version. ### Checklist - [x] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) ### Identify risks There are no risks to this PR, since all work is contained in the `examples` plugin. --------- Co-authored-by: kibanamachine <[email protected]>
## Summary When the `layout` prop updates, we cannot assume that it is "safe" (i.e. we cannot assume it has no floating panels and/or colliding panels). Because of this, we need to resolve each grid row when this prop changes. When I added this in #200793, I accidentally only **compacted** the rows, which did not account for possible collisions that the Dashboard's panel placement strategies do not account for. This PR fixes that by calling `resolveGridRow` (which compacts **and** detects collisions) instead of just `compactGridRow` (which, as the name suggests, only compacts the rows) **Before:** https://github.com/user-attachments/assets/bcea4efd-35fa-425d-ac04-41434ffaa810 **After:** https://github.com/user-attachments/assets/6cd205c6-d1d5-4a97-8d14-425c2a4bbeda ### Checklist - [x] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) ### Identify risks There are no risks to this PR, since all work is contained in the `examples` plugin.
…02049) ## Summary When the `layout` prop updates, we cannot assume that it is "safe" (i.e. we cannot assume it has no floating panels and/or colliding panels). Because of this, we need to resolve each grid row when this prop changes. When I added this in elastic#200793, I accidentally only **compacted** the rows, which did not account for possible collisions that the Dashboard's panel placement strategies do not account for. This PR fixes that by calling `resolveGridRow` (which compacts **and** detects collisions) instead of just `compactGridRow` (which, as the name suggests, only compacts the rows) **Before:** https://github.com/user-attachments/assets/bcea4efd-35fa-425d-ac04-41434ffaa810 **After:** https://github.com/user-attachments/assets/6cd205c6-d1d5-4a97-8d14-425c2a4bbeda ### Checklist - [x] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) ### Identify risks There are no risks to this PR, since all work is contained in the `examples` plugin. (cherry picked from commit 57b8bda)
…pdate (#202049) (#202072) # Backport This will backport the following commits from `main` to `8.x`: - [[Dashboard][Collapsable Panels] Fix bug on `layout` update (#202049)](#202049) <!--- Backport version: 9.4.3 --> ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) <!--BACKPORT [{"author":{"name":"Hannah Mudge","email":"[email protected]"},"sourceCommit":{"committedDate":"2024-11-27T21:12:15Z","message":"[Dashboard][Collapsable Panels] Fix bug on `layout` update (#202049)\n\n## Summary\r\n\r\nWhen the `layout` prop updates, we cannot assume that it is \"safe\" (i.e.\r\nwe cannot assume it has no floating panels and/or colliding panels).\r\nBecause of this, we need to resolve each grid row when this prop\r\nchanges. When I added this in\r\nhttps://github.com//pull/200793, I accidentally only\r\n**compacted** the rows, which did not account for possible collisions\r\nthat the Dashboard's panel placement strategies do not account for. This\r\nPR fixes that by calling `resolveGridRow` (which compacts **and**\r\ndetects collisions) instead of just `compactGridRow` (which, as the name\r\nsuggests, only compacts the rows)\r\n\r\n**Before:**\r\n\r\n\r\n\r\n\r\nhttps://github.com/user-attachments/assets/bcea4efd-35fa-425d-ac04-41434ffaa810\r\n\r\n\r\n**After:**\r\n\r\n\r\nhttps://github.com/user-attachments/assets/6cd205c6-d1d5-4a97-8d14-425c2a4bbeda\r\n\r\n\r\n\r\n### Checklist\r\n\r\n- [x] The PR description includes the appropriate Release Notes section,\r\nand the correct `release_note:*` label is applied per the\r\n[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)\r\n\r\n### Identify risks\r\n\r\nThere are no risks to this PR, since all work is contained in the\r\n`examples` plugin.","sha":"57b8bdad3fb64d26b8fe3b0bf12c071857fff9e2","branchLabelMapping":{"^v9.0.0$":"main","^v8.18.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["Feature:Dashboard","Team:Presentation","loe:small","release_note:skip","impact:high","v9.0.0","backport:prev-minor","Project:Collapsable Panels"],"title":"[Dashboard][Collapsable Panels] Fix bug on `layout` update","number":202049,"url":"https://github.com/elastic/kibana/pull/202049","mergeCommit":{"message":"[Dashboard][Collapsable Panels] Fix bug on `layout` update (#202049)\n\n## Summary\r\n\r\nWhen the `layout` prop updates, we cannot assume that it is \"safe\" (i.e.\r\nwe cannot assume it has no floating panels and/or colliding panels).\r\nBecause of this, we need to resolve each grid row when this prop\r\nchanges. When I added this in\r\nhttps://github.com//pull/200793, I accidentally only\r\n**compacted** the rows, which did not account for possible collisions\r\nthat the Dashboard's panel placement strategies do not account for. This\r\nPR fixes that by calling `resolveGridRow` (which compacts **and**\r\ndetects collisions) instead of just `compactGridRow` (which, as the name\r\nsuggests, only compacts the rows)\r\n\r\n**Before:**\r\n\r\n\r\n\r\n\r\nhttps://github.com/user-attachments/assets/bcea4efd-35fa-425d-ac04-41434ffaa810\r\n\r\n\r\n**After:**\r\n\r\n\r\nhttps://github.com/user-attachments/assets/6cd205c6-d1d5-4a97-8d14-425c2a4bbeda\r\n\r\n\r\n\r\n### Checklist\r\n\r\n- [x] The PR description includes the appropriate Release Notes section,\r\nand the correct `release_note:*` label is applied per the\r\n[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)\r\n\r\n### Identify risks\r\n\r\nThere are no risks to this PR, since all work is contained in the\r\n`examples` plugin.","sha":"57b8bdad3fb64d26b8fe3b0bf12c071857fff9e2"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","branchLabelMappingKey":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/202049","number":202049,"mergeCommit":{"message":"[Dashboard][Collapsable Panels] Fix bug on `layout` update (#202049)\n\n## Summary\r\n\r\nWhen the `layout` prop updates, we cannot assume that it is \"safe\" (i.e.\r\nwe cannot assume it has no floating panels and/or colliding panels).\r\nBecause of this, we need to resolve each grid row when this prop\r\nchanges. When I added this in\r\nhttps://github.com//pull/200793, I accidentally only\r\n**compacted** the rows, which did not account for possible collisions\r\nthat the Dashboard's panel placement strategies do not account for. This\r\nPR fixes that by calling `resolveGridRow` (which compacts **and**\r\ndetects collisions) instead of just `compactGridRow` (which, as the name\r\nsuggests, only compacts the rows)\r\n\r\n**Before:**\r\n\r\n\r\n\r\n\r\nhttps://github.com/user-attachments/assets/bcea4efd-35fa-425d-ac04-41434ffaa810\r\n\r\n\r\n**After:**\r\n\r\n\r\nhttps://github.com/user-attachments/assets/6cd205c6-d1d5-4a97-8d14-425c2a4bbeda\r\n\r\n\r\n\r\n### Checklist\r\n\r\n- [x] The PR description includes the appropriate Release Notes section,\r\nand the correct `release_note:*` label is applied per the\r\n[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)\r\n\r\n### Identify risks\r\n\r\nThere are no risks to this PR, since all work is contained in the\r\n`examples` plugin.","sha":"57b8bdad3fb64d26b8fe3b0bf12c071857fff9e2"}}]}] BACKPORT--> Co-authored-by: Hannah Mudge <[email protected]>
Closes elastic#200090 ## Summary This PR migrates the `GridLayout` component a more traditional React design using **props** rather than providing an API. This change serves two purposes: 1. It makes the eventual Dashboard migration easier, since it is more similar to `react-grid-layout`'s implementation 3. It makes the `GridLayout` component less opinionated by moving the logic for panel management (i.e. panel placement, etc) to the parent component. I tried to keep efficiency in mind for this comparison, and ensured that we are still keeping the number of rerenders **o a minimum**. This PR should not introduce **any** extra renders in comparison to the API version. ### Checklist - [x] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) ### Identify risks There are no risks to this PR, since all work is contained in the `examples` plugin. --------- Co-authored-by: kibanamachine <[email protected]>
…02049) ## Summary When the `layout` prop updates, we cannot assume that it is "safe" (i.e. we cannot assume it has no floating panels and/or colliding panels). Because of this, we need to resolve each grid row when this prop changes. When I added this in elastic#200793, I accidentally only **compacted** the rows, which did not account for possible collisions that the Dashboard's panel placement strategies do not account for. This PR fixes that by calling `resolveGridRow` (which compacts **and** detects collisions) instead of just `compactGridRow` (which, as the name suggests, only compacts the rows) **Before:** https://github.com/user-attachments/assets/bcea4efd-35fa-425d-ac04-41434ffaa810 **After:** https://github.com/user-attachments/assets/6cd205c6-d1d5-4a97-8d14-425c2a4bbeda ### Checklist - [x] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) ### Identify risks There are no risks to this PR, since all work is contained in the `examples` plugin.
Closes #200090
Summary
This PR migrates the
GridLayout
component a more traditional React design using props rather than providing an API. This change serves two purposes:react-grid-layout
's implementationGridLayout
component less opinionated by moving the logic for panel management (i.e. panel placement, etc) to the parent component.I tried to keep efficiency in mind for this comparison, and ensured that we are still keeping the number of rerenders o a minimum. This PR should not introduce any extra renders in comparison to the API version.
Checklist
release_note:*
label is applied per the guidelinesIdentify risks
There are no risks to this PR, since all work is contained in the
examples
plugin.