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

How to set up and validate locally

  1. 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.
  2. Pick a group without DAP activity for the no-data state.
  3. Stop Siphon or ClickHouse locally for the availability states.

Screenshots or screen recordings

State Before After
No access (Reporter) gdk-before-master gdk-final-reporter
No data gdk-empty-group2
Siphon unavailable gdk-siphon-off2
Generic error gdk-before-master gdk-generic-error2
After Try again gdk-after-retry

Merge request reports

Loading
Loading