Add purpose-built empty and error states to DAP Impact panels
What does this MR do and why?
DAP Impact dashboard panels get purpose-built states in place of the bare "Something went wrong" span and hover-only popover: no data, no access, ClickHouse configuration required, Siphon data not available yet, a retryable error with a working inline Try again, and a non-retryable error. A new shared panel_state.vue renders these in full and compact layouts, a new GLQL error classifier maps error extensions codes and /api/glql HTTP statuses to states, and retry now genuinely re-runs the query; the kebab Reload had the same no-op bug and is fixed the same way. The GLQL resolver keeps its parsed config through a failed execution so error states can size themselves by display type, and keeps already-loaded rows visible when a continuation page fails.
Every GLQL panel rendered through analytics_dashboard_panel.vue inherits these states, including user-defined custom dashboards. The dashboard YAML also re-enables the default panel actions menu on all DAP panels, as agreed with design in Slack, and both visualization schemas gain the emptyState key for per-panel empty-state copy. analytics_dashboard_panel_spec.js is unchanged because GLQL panels no longer route errors through the panel's alert mechanism; the new coverage lives in glql_spec.js and panel_state_spec.js.
Stacked on !256769 (merged).
References
- Resolves https://gitlab.com/gitlab-org/gitlab/-/work_items/629384
- Covers the inline-error intent of #604173 for GLQL panels.
How to set up and validate locally
- Sign in as a user with the Reporter role on a group with DAP data and open
/explore/analytics_dashboards/dap_impact; the credits panels show the access state, the rest load. - Pick a group without DAP activity for the no-data state.
- Stop Siphon or ClickHouse locally for the availability states.
Screenshots or screen recordings
| State | Before | After |
|---|---|---|
| No access (Reporter) | ![]() |
![]() |
| No data | ![]() |
|
| Siphon unavailable | ![]() |
|
| Generic error | ![]() |
![]() |
| After Try again | ![]() |





