Skip to content

[Dashboards as code] remove client transform of panels array to map#224314

Merged
nreese merged 49 commits intoelastic:mainfrom
nreese:remove_panels_to_map
Jun 24, 2025
Merged

[Dashboards as code] remove client transform of panels array to map#224314
nreese merged 49 commits intoelastic:mainfrom
nreese:remove_panels_to_map

Conversation

@nreese
Copy link
Contributor

@nreese nreese commented Jun 17, 2025

Closes #224294

External team reviewers

@elastic/kibana-presentation team is working on "Dashboards as code" project where we provide a human readable CRUD API for dashboards. Part of this work is aligning dashboard client code with the shape of dashboard server api. As such, we are changing the shape of panels from a Map to an Array - to directly consume what is being returned from the dashboard server api.

PR Overview

The goal of this PR is to update dashboard client-side state panels type to match the type from dashboard server api. The dashboard server api returns panels as an Array, while the dashboard client-side logic is expecting panels to be a Map keyed by panel id.

This type change required the following changes:

  • Refactored dashboard client code to receive panels as an array and return panels as an array. Biggest work is in layout_manager deserializeState and serializeState methods.
  • Remove convertPanelsArrayToPanelSectionMaps from loadDashboardState. convertPanelsArrayToPanelSectionMaps performed 2 tasks
    1. Convert panels array to map. This is no longer needed as now dashboard client code accepts panels in its native shape from the dashboard server api.
    2. Move id and title fields into embeddable state. This is no longer needed as now dashboard server api does this transform before sending the dashboard to the client.
  • Remove convertPanelSectionMapsToPanelsArray from getSerializedState. convertPanelSectionMapsToPanelsArray performed 2 tasks.
    1. Convert panels map into panels array. This is no longer needed as now panels is provided to getSerializedState in the shape required for the dashboard server api.
    2. Lift id and title fields from into top level panel state. This is no longer needed as all embeddable state should remain under panelConfig.
  • Remove a bunch of code in dashboard/common as now the client and server are do not need to depend on shared logic as the client is much simpler and no longer needs to transform the server response. Much of this shared logic was copied into server saved object migrations in [dashboard] revert 8.17 to 9.1 changes to dashboard/server/dashboard_saved_object/migrations folder #223980 but can now be removed from common since its no longer used in the client.

@nreese nreese changed the title Remove panels to map [Dashboards as code] remove client transform of panels array to map Jun 18, 2025
@nreese
Copy link
Contributor Author

nreese commented Jun 18, 2025

/ci

@nreese
Copy link
Contributor Author

nreese commented Jun 19, 2025

/ci

@nreese
Copy link
Contributor Author

nreese commented Jun 19, 2025

/ci

@nreese
Copy link
Contributor Author

nreese commented Jun 19, 2025

/ci

@nreese
Copy link
Contributor Author

nreese commented Jun 19, 2025

/ci

Copy link
Contributor

@ThomThomson ThomThomson left a comment

Choose a reason for hiding this comment

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

Changes LGTM! This is a great PR that aligns and cleans up a lot of Dashboard's panel management. Looked through the code, and ran some smoke tests locally. Left a few nits, the most urgent of which involve some seemingly missing jest tests.

Really clean set of changes!


import type { DashboardAttributes, DashboardSection } from '../server/content_management';

export const isDashboardSection = (
Copy link
Contributor

Choose a reason for hiding this comment

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

Nit: Do we need this to be in a separate file? In the presentation_publishing package we usually combine type guards with their type definitions, so maybe we could do something similar here?

@nreese
Copy link
Contributor Author

nreese commented Jun 23, 2025

@elasticmachine merge upstream

@nreese
Copy link
Contributor Author

nreese commented Jun 24, 2025

@elasticmachine merge upstream

@elasticmachine
Copy link
Contributor

elasticmachine commented Jun 24, 2025

@nreese
Copy link
Contributor Author

nreese commented Jun 24, 2025

@elasticmachine merge upstream

@nreese nreese merged commit 3d6954e into elastic:main Jun 24, 2025
10 checks passed
@kibanamachine
Copy link
Contributor

Starting backport for target branches: 8.19

https://github.com/elastic/kibana/actions/runs/15853781043

@kibanamachine
Copy link
Contributor

💔 All backports failed

Status Branch Result
8.19 Backport failed because of merge conflicts

You might need to backport the following PRs to 8.19:
- [Dashboard] Rewrite scss to emotion (#220520)

Manual backport

To create the backport manually run:

node scripts/backport --pr 224314

Questions ?

Please refer to the Backport tool documentation

@nreese
Copy link
Contributor Author

nreese commented Jun 24, 2025

💚 All backports created successfully

Status Branch Result
8.19

Note: Successful backport PRs will be merged automatically after passing CI.

Questions ?

Please refer to the Backport tool documentation

nreese added a commit to nreese/kibana that referenced this pull request Jun 24, 2025
…lastic#224314)

Closes elastic#224294

### External team reviewers
@elastic/kibana-presentation team is working on "Dashboards as code"
project where we provide a human readable CRUD API for dashboards. Part
of this work is aligning dashboard client code with the shape of
dashboard server api. As such, we are changing the shape of `panels`
from a Map to an Array - to directly consume what is being returned from
the dashboard server api.

### PR Overview

The goal of this PR is to update dashboard client-side state `panels`
type to match the type from dashboard server api. The dashboard server
api returns panels as an Array, while the dashboard client-side logic is
expecting panels to be a Map keyed by panel id.

This type change required the following changes:
* Refactored dashboard client code to receive panels as an array and
return panels as an array. Biggest work is in layout_manager
`deserializeState` and `serializeState` methods.
* Remove `convertPanelsArrayToPanelSectionMaps` from
`loadDashboardState`. `convertPanelsArrayToPanelSectionMaps` performed 2
tasks
1) Convert panels array to map. This is no longer needed as now
dashboard client code accepts panels in its native shape from the
dashboard server api.
2) Move `id` and `title` fields into embeddable state. This is no longer
needed as now dashboard server api does this transform before sending
the dashboard to the client.
* Remove `convertPanelSectionMapsToPanelsArray` from
`getSerializedState`. `convertPanelSectionMapsToPanelsArray` performed 2
tasks.
1) Convert panels map into panels array. This is no longer needed as now
panels is provided to `getSerializedState` in the shape required for the
dashboard server api.
2) Lift `id` and `title` fields from into top level panel state. This is
no longer needed as all embeddable state should remain under
`panelConfig`.
* Remove a bunch of code in `dashboard/common` as now the client and
server are do not need to depend on shared logic as the client is much
simpler and no longer needs to transform the server response. Much of
this shared logic was copied into server saved object migrations in
elastic#223980 but can now be removed
from common since its no longer used in the client.

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
(cherry picked from commit 3d6954e)

# Conflicts:
#	src/platform/plugins/shared/dashboard/public/dashboard_renderer/grid/dashboard_grid_item.tsx
nreese added a commit that referenced this pull request Jun 24, 2025
…o map (#224314) (#225096)

# Backport

This will backport the following commits from `main` to `8.19`:
- [[Dashboards as code] remove client transform of panels array to map
(#224314)](#224314)

<!--- Backport version: 10.0.1 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sorenlouv/backport)

<!--BACKPORT [{"author":{"name":"Nathan
Reese","email":"reese.nathan@elastic.co"},"sourceCommit":{"committedDate":"2025-06-24T14:48:08Z","message":"[Dashboards
as code] remove client transform of panels array to map
(#224314)\n\nCloses
https://github.com/elastic/kibana/issues/224294\n\n### External team
reviewers\n@elastic/kibana-presentation team is working on \"Dashboards
as code\"\nproject where we provide a human readable CRUD API for
dashboards. Part\nof this work is aligning dashboard client code with
the shape of\ndashboard server api. As such, we are changing the shape
of `panels`\nfrom a Map to an Array - to directly consume what is being
returned from\nthe dashboard server api.\n\n### PR Overview\n\nThe goal
of this PR is to update dashboard client-side state `panels`\ntype to
match the type from dashboard server api. The dashboard server\napi
returns panels as an Array, while the dashboard client-side logic
is\nexpecting panels to be a Map keyed by panel id.\n\nThis type change
required the following changes:\n* Refactored dashboard client code to
receive panels as an array and\nreturn panels as an array. Biggest work
is in layout_manager\n`deserializeState` and `serializeState`
methods.\n* Remove `convertPanelsArrayToPanelSectionMaps`
from\n`loadDashboardState`. `convertPanelsArrayToPanelSectionMaps`
performed 2\ntasks\n1) Convert panels array to map. This is no longer
needed as now\ndashboard client code accepts panels in its native shape
from the\ndashboard server api.\n2) Move `id` and `title` fields into
embeddable state. This is no longer\nneeded as now dashboard server api
does this transform before sending\nthe dashboard to the client.\n*
Remove `convertPanelSectionMapsToPanelsArray`
from\n`getSerializedState`. `convertPanelSectionMapsToPanelsArray`
performed 2\ntasks.\n1) Convert panels map into panels array. This is no
longer needed as now\npanels is provided to `getSerializedState` in the
shape required for the\ndashboard server api.\n2) Lift `id` and `title`
fields from into top level panel state. This is\nno longer needed as all
embeddable state should remain under\n`panelConfig`.\n* Remove a bunch
of code in `dashboard/common` as now the client and\nserver are do not
need to depend on shared logic as the client is much\nsimpler and no
longer needs to transform the server response. Much of\nthis shared
logic was copied into server saved object migrations
in\nhttps://github.com//pull/223980 but can now be
removed\nfrom common since its no longer used in the
client.\n\n---------\n\nCo-authored-by: kibanamachine
<42973632+kibanamachine@users.noreply.github.com>\nCo-authored-by:
Elastic Machine
<elasticmachine@users.noreply.github.com>","sha":"3d6954e25284014527209cb8ba50db255cbfe41a","branchLabelMapping":{"^v9.1.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["Team:Presentation","release_note:skip","Team:obs-ux-infra_services","Team:obs-ux-management","backport:version","Project:Dashboards
API","v9.1.0","v8.19.0"],"title":"[Dashboards as code] remove client
transform of panels array to
map","number":224314,"url":"https://github.com/elastic/kibana/pull/224314","mergeCommit":{"message":"[Dashboards
as code] remove client transform of panels array to map
(#224314)\n\nCloses
https://github.com/elastic/kibana/issues/224294\n\n### External team
reviewers\n@elastic/kibana-presentation team is working on \"Dashboards
as code\"\nproject where we provide a human readable CRUD API for
dashboards. Part\nof this work is aligning dashboard client code with
the shape of\ndashboard server api. As such, we are changing the shape
of `panels`\nfrom a Map to an Array - to directly consume what is being
returned from\nthe dashboard server api.\n\n### PR Overview\n\nThe goal
of this PR is to update dashboard client-side state `panels`\ntype to
match the type from dashboard server api. The dashboard server\napi
returns panels as an Array, while the dashboard client-side logic
is\nexpecting panels to be a Map keyed by panel id.\n\nThis type change
required the following changes:\n* Refactored dashboard client code to
receive panels as an array and\nreturn panels as an array. Biggest work
is in layout_manager\n`deserializeState` and `serializeState`
methods.\n* Remove `convertPanelsArrayToPanelSectionMaps`
from\n`loadDashboardState`. `convertPanelsArrayToPanelSectionMaps`
performed 2\ntasks\n1) Convert panels array to map. This is no longer
needed as now\ndashboard client code accepts panels in its native shape
from the\ndashboard server api.\n2) Move `id` and `title` fields into
embeddable state. This is no longer\nneeded as now dashboard server api
does this transform before sending\nthe dashboard to the client.\n*
Remove `convertPanelSectionMapsToPanelsArray`
from\n`getSerializedState`. `convertPanelSectionMapsToPanelsArray`
performed 2\ntasks.\n1) Convert panels map into panels array. This is no
longer needed as now\npanels is provided to `getSerializedState` in the
shape required for the\ndashboard server api.\n2) Lift `id` and `title`
fields from into top level panel state. This is\nno longer needed as all
embeddable state should remain under\n`panelConfig`.\n* Remove a bunch
of code in `dashboard/common` as now the client and\nserver are do not
need to depend on shared logic as the client is much\nsimpler and no
longer needs to transform the server response. Much of\nthis shared
logic was copied into server saved object migrations
in\nhttps://github.com//pull/223980 but can now be
removed\nfrom common since its no longer used in the
client.\n\n---------\n\nCo-authored-by: kibanamachine
<42973632+kibanamachine@users.noreply.github.com>\nCo-authored-by:
Elastic Machine
<elasticmachine@users.noreply.github.com>","sha":"3d6954e25284014527209cb8ba50db255cbfe41a"}},"sourceBranch":"main","suggestedTargetBranches":["8.19"],"targetPullRequestStates":[{"branch":"main","label":"v9.1.0","branchLabelMappingKey":"^v9.1.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/224314","number":224314,"mergeCommit":{"message":"[Dashboards
as code] remove client transform of panels array to map
(#224314)\n\nCloses
https://github.com/elastic/kibana/issues/224294\n\n### External team
reviewers\n@elastic/kibana-presentation team is working on \"Dashboards
as code\"\nproject where we provide a human readable CRUD API for
dashboards. Part\nof this work is aligning dashboard client code with
the shape of\ndashboard server api. As such, we are changing the shape
of `panels`\nfrom a Map to an Array - to directly consume what is being
returned from\nthe dashboard server api.\n\n### PR Overview\n\nThe goal
of this PR is to update dashboard client-side state `panels`\ntype to
match the type from dashboard server api. The dashboard server\napi
returns panels as an Array, while the dashboard client-side logic
is\nexpecting panels to be a Map keyed by panel id.\n\nThis type change
required the following changes:\n* Refactored dashboard client code to
receive panels as an array and\nreturn panels as an array. Biggest work
is in layout_manager\n`deserializeState` and `serializeState`
methods.\n* Remove `convertPanelsArrayToPanelSectionMaps`
from\n`loadDashboardState`. `convertPanelsArrayToPanelSectionMaps`
performed 2\ntasks\n1) Convert panels array to map. This is no longer
needed as now\ndashboard client code accepts panels in its native shape
from the\ndashboard server api.\n2) Move `id` and `title` fields into
embeddable state. This is no longer\nneeded as now dashboard server api
does this transform before sending\nthe dashboard to the client.\n*
Remove `convertPanelSectionMapsToPanelsArray`
from\n`getSerializedState`. `convertPanelSectionMapsToPanelsArray`
performed 2\ntasks.\n1) Convert panels map into panels array. This is no
longer needed as now\npanels is provided to `getSerializedState` in the
shape required for the\ndashboard server api.\n2) Lift `id` and `title`
fields from into top level panel state. This is\nno longer needed as all
embeddable state should remain under\n`panelConfig`.\n* Remove a bunch
of code in `dashboard/common` as now the client and\nserver are do not
need to depend on shared logic as the client is much\nsimpler and no
longer needs to transform the server response. Much of\nthis shared
logic was copied into server saved object migrations
in\nhttps://github.com//pull/223980 but can now be
removed\nfrom common since its no longer used in the
client.\n\n---------\n\nCo-authored-by: kibanamachine
<42973632+kibanamachine@users.noreply.github.com>\nCo-authored-by:
Elastic Machine
<elasticmachine@users.noreply.github.com>","sha":"3d6954e25284014527209cb8ba50db255cbfe41a"}},{"branch":"8.19","label":"v8.19.0","branchLabelMappingKey":"^v(\\d+).(\\d+).\\d+$","isSourceBranch":false,"state":"NOT_CREATED"}]}]
BACKPORT-->
akowalska622 pushed a commit to akowalska622/kibana that referenced this pull request Jun 25, 2025
…lastic#224314)

Closes elastic#224294

### External team reviewers
@elastic/kibana-presentation team is working on "Dashboards as code"
project where we provide a human readable CRUD API for dashboards. Part
of this work is aligning dashboard client code with the shape of
dashboard server api. As such, we are changing the shape of `panels`
from a Map to an Array - to directly consume what is being returned from
the dashboard server api.

### PR Overview

The goal of this PR is to update dashboard client-side state `panels`
type to match the type from dashboard server api. The dashboard server
api returns panels as an Array, while the dashboard client-side logic is
expecting panels to be a Map keyed by panel id.

This type change required the following changes:
* Refactored dashboard client code to receive panels as an array and
return panels as an array. Biggest work is in layout_manager
`deserializeState` and `serializeState` methods.
* Remove `convertPanelsArrayToPanelSectionMaps` from
`loadDashboardState`. `convertPanelsArrayToPanelSectionMaps` performed 2
tasks
1) Convert panels array to map. This is no longer needed as now
dashboard client code accepts panels in its native shape from the
dashboard server api.
2) Move `id` and `title` fields into embeddable state. This is no longer
needed as now dashboard server api does this transform before sending
the dashboard to the client.
* Remove `convertPanelSectionMapsToPanelsArray` from
`getSerializedState`. `convertPanelSectionMapsToPanelsArray` performed 2
tasks.
1) Convert panels map into panels array. This is no longer needed as now
panels is provided to `getSerializedState` in the shape required for the
dashboard server api.
2) Lift `id` and `title` fields from into top level panel state. This is
no longer needed as all embeddable state should remain under
`panelConfig`.
* Remove a bunch of code in `dashboard/common` as now the client and
server are do not need to depend on shared logic as the client is much
simpler and no longer needs to transform the server response. Much of
this shared logic was copied into server saved object migrations in
elastic#223980 but can now be removed
from common since its no longer used in the client.

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport:version Backport to applied version labels Project:Dashboards API release_note:skip Skip the PR/issue when compiling release notes Team:actionable-obs Formerly "obs-ux-management", responsible for SLO, o11y alerting, significant events, & synthetics. Team:obs-ux-infra_services - DEPRECATED DEPRECATED - Use Team:obs-presentation. Team:Presentation Presentation Team for Dashboard, Input Controls, and Canvas t// v8.19.0 v9.1.0

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Dashboards as code] remove client transform of panels array to map

6 participants