feat(dashboards): add error tracking dashboard widget (8/11)#60524
Merged
MattPua merged 31 commits intoJun 3, 2026
Conversation
This was referenced May 28, 2026
Closed
Member
Author
This was referenced May 28, 2026
Closed
Closed
07b7d6a to
fa6e73b
Compare
2a164c8 to
bb392df
Compare
fa6e73b to
2a33a0c
Compare
19de44b to
72c7562
Compare
2a33a0c to
58653c9
Compare
72c7562 to
5d90bb4
Compare
58653c9 to
400ebc6
Compare
5d90bb4 to
c96af34
Compare
400ebc6 to
067652e
Compare
c96af34 to
c8c9156
Compare
Remove deprecated error_tracking alias, align zod limit default with backend, simplify config validation via zod, remount edit modal form on open, and inline one-off layout constants. Co-authored-by: Cursor <cursoragent@cursor.com>
Delete WidgetSettingsModalSections, move modal state into kea logic, and map API config errors via zod instead of parsing backend message strings. Co-authored-by: Cursor <cursoragent@cursor.com>
use catalog header title in remove-toast assertions, fix DashboardWidgetCatalogKey typing, drop session replay story decorator from ET branch, and patch strict TS in widget modal and issue list tests
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
The Loading story intentionally renders skeletons; VR must not wait for them to disappear. Co-authored-by: Cursor <cursoragent@cursor.com>
Extract shared widgetLimitFieldSchema, simplify validation with a flat zod form schema and typed ErrorTrackingWidgetConfig, tighten modal structure, and use standard tailwind sizing in ErrorTrackingIssueList. Co-authored-by: Cursor <cursoragent@cursor.com>
… review Remove widget type aliases, infer group labels from groupId, move form schema to configSchemas, extract shared edit-modal tile helpers, and trim default config to non-default fields only. Co-authored-by: Cursor <cursoragent@cursor.com>
Extract shared edit-modal builders and filters section, default catalog header meta/layout, remove disableLinks prop, and inline skeleton row count. Co-authored-by: Cursor <cursoragent@cursor.com>
throw on unknown widget types, drop edit modal barrel/types files, move ErrorTrackingWidgetResult colocated, fix orderBy reducer and z.flattenError typing, remove stale alias registry test Co-authored-by: Cursor <cursoragent@cursor.com>
…arklines request listing volume resolution in run_widgets, widen fixed grid columns, and keep horizontal scroll in the issue list Co-authored-by: Cursor <cursoragent@cursor.com>
…st failures Inline edit modal reducers for kea-typegen compatibility, fix saving reducer payload signatures, and guard unknown widget types in tile layout catalog lookup. Co-authored-by: Cursor <cursoragent@cursor.com>
…ount Add vertical hogLayout to ProductIntroduction, stacked widget introduction layout, and mount filterTestAccountsDefaultsLogic in story fixtures. Co-authored-by: Cursor <cursoragent@cursor.com>
14 updated Run: a69eda04-55af-4645-8010-ec6c89077815 Co-authored-by: MattPua <3376526+MattPua@users.noreply.github.com>
Duplicate tile creates a new widget row but never fetched run_widgets for it, so the copy showed the empty state until a full dashboard refresh.
Batch name and description into one metadata tiles PATCH, await config and metadata saves via loaders, deep-merge widget fields in dashboard state, and reveal hidden descriptions in the same metadata request.
Collapse edit-modal saves into updateWidgetTile so dashboardsPartialUpdate sends config, name, and description together instead of two PATCHes.
Return null from the updateWidgetTile loader so kea infers Promise<null> instead of Promise<DashboardTile | null>, which broke Frontend typechecking.
Move catalog/registry lookup into a child rendered inside ErrorBoundary so prop evaluation in the parent no longer crashes the whole dashboard.
Use useAsyncActions for updateWidgetTile so modal onSave waits for the PATCH to finish before closing and can surface config validation errors.
Fire an explicit server-side event when widget tiles are created, with widget_type, tile_id, widget_id, and request source (web, mcp, api).
Resolve catalog metadata for the header without throwing, and scope the error boundary to the card body so remove/edit menu actions stay usable.
Skip fetch-error UI and refresh actions when the widget type is not registered locally so the body renders the full error boundary instead.
Match error tracking widget setup UX: always-vertical WidgetCardProductIntroduction and centered CTA for availability gates.
…lling Use bottom-row placement for widget batch adds so tiles land under the tallest existing tile rather than in lowest open segments mid-layout.
session_replay_list is registered on the SR stack PR, not ET. The batch analytics event is already covered for error_tracking_list here.
… full Use dashboard bottom y for the fallback placement instead of reusing the current row, and hoist ERROR_TRACKING_LISTING_VOLUME_RESOLUTION import. Co-authored-by: Cursor <cursoragent@cursor.com>
Each widget registry entry owns parseConfigApiError so utils.ts no longer switches on widget type when mapping dashboard PATCH failures. Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
|
⏭️ Skipped snapshot commit because branch advanced to The new commit will trigger its own snapshot update workflow. If you expected this workflow to succeed: This can happen due to concurrent commits. To get a fresh workflow run, either:
|
2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Problem
Dashboards need embeddable product widgets beyond insights. Error tracking issues are the first list-style widget: a ranked table of top issues that fits the WidgetCard shell and establishes patterns later widgets (session replay, etc.) reuse.
This PR is 8/11 in the dashboard widgets Graphite stack (WidgetCard shell #60523 is merged).
Changes
error_tracking_listwidget — catalog/registry entry, backend runner, config schema, preview, and full frontend tile (component, edit modal, stories, tests)ErrorTrackingIssueListextraction — shared list component + skeleton for dashboard embedding without pulling in the full error tracking sceneeditWidgetModalBuilders, tile/filter section components,buildWidgetTileMetadataPatch, and kea patterns both widget types inheritupdateWidgetTile/updateDashboardWidgetTile(config + name + description)useAsyncActionsso edit modals await save before closingErrorBoundary(no fetch-error refresh UI)WidgetCardProductIntroductiondashboard widget addedalongside existingdashboard tile addedgetDashboardWidgetCatalogEntry/tryGetDashboardWidgetCatalogEntryresolve layout and header metadataHow did you test this code?
DashboardWidgetItem, anddashboardLogicwidget tile updatestest_dashboard_widgets,test_run_widgets, andtest_widget_layouts👉 Stay up-to-date with PostHog coding conventions for a smoother review.
Automatic notifications
Docs update
Add the
skip-inkeep-docslabel — no user-facing docs yet (feature flagged). Agent skill/docs land in #60516.🤖 Agent context
dashboardLogic,DashboardWidgetItem, and backend tile create paths used by every widget type