Skip to content

feat(nest-profiler): rework the home page into per-kind sidebar views - #187

Merged
fpasquet merged 1 commit into
mainfrom
feat/profiler-sidebar-navigation
Jul 14, 2026
Merged

feat(nest-profiler): rework the home page into per-kind sidebar views#187
fpasquet merged 1 commit into
mainfrom
feat/profiler-sidebar-navigation

Conversation

@fpasquet

@fpasquet fpasquet commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Summary

Reworks the profiler home page (GET /_profiler) into a two-column, sidebar-navigated layout — the same shell as the profile detail page — without adding the Summary dashboard (that lands separately in #186).

  • Two-column layout + sidebar views — the home page adopts the detail page's sticky left sidebar + right content pane. The active view is selected server-side from a ?view= query param (plain links, no client JS, consistent with the script-src 'self' CSP).
  • A page per entrypoint kind — each list section (HTTP, GraphQL, Commands, RabbitMQ…) is its own dissociated ?view= page under a Profiling group in the sidebar (defaulting to the HTTP catch-all); each renders only its own list, filters, pager and the process-heap trend.
  • Global panels become sidebar views — Config, Routes and DB schemas are no longer stacked inline as <details>; each is its own sidebar destination.
  • Count badges — every sidebar item carries a count: a list section shows its unfiltered profile total, and a global panel shows its own count (the first *Count field its data exposes, e.g. routeCount). GlobalPanelInfo gains an optional badge.
  • Empty states & back link — each list section renders an empty-state row when it has no profiles (every kind is now always reachable as its own page); the detail page gains a back link to the list view of the profile's kind; the redundant "All Profiles" header link is removed.
  • Responsive + mobile tables — the two-column layout stacks on mobile (identically on the detail page), and wide UI tables scroll horizontally inside their card (overflow-x-auto + min-w) instead of being clipped (fix: profile-list and panel tables are not horizontally scrollable on mobile #184).

Behaviour-preserving: no Summary, no storage-index changes, no collector API changes — purely the navigation shell over data that already exists.

Related issue

Part of #146 (the navigation shell, extracted from the Summary work in #186). Closes #184 (mobile table scroll).

Checklist

  • Tests were added or updated to cover the change
  • Documentation was added or updated
  • A changeset was added, or this PR does not affect published packages
  • Breaking changes use a major changeset with a BREAKING: note

Breaking changes

  • This PR includes breaking changes

Additive only — the sidebar navigation replaces the inline global-panel <details>; the same data and endpoints, reachable via ?view=.

@vercel

vercel Bot commented Jul 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
nest-profiler Ready Ready Preview, Comment Jul 14, 2026 6:42pm
nest-profiler-example Ready Ready Preview, Comment Jul 14, 2026 6:42pm

@github-actions github-actions Bot added scope: packages Change to a publishable package scope: examples Change to example applications package: nest-profiler Affects the @eleven-labs/nest-profiler package package: nest-profiler-routes Affects the @eleven-labs/nest-profiler-routes package labels Jul 14, 2026
@fpasquet
fpasquet force-pushed the feat/profiler-sidebar-navigation branch from 9fefe12 to f363177 Compare July 14, 2026 16:09
@github-actions github-actions Bot added package: nest-profiler-cache Affects the @eleven-labs/nest-profiler-cache package package: nest-profiler-validator Affects the @eleven-labs/nest-profiler-validator package package: nest-profiler-graphql Affects the @eleven-labs/nest-profiler-graphql package package: nest-profiler-commander Affects the @eleven-labs/nest-profiler-commander package package: nest-profiler-rabbitmq Affects the @eleven-labs/nest-profiler-rabbitmq package labels Jul 14, 2026
@fpasquet
fpasquet force-pushed the feat/profiler-sidebar-navigation branch from c4cff14 to 41cd7b0 Compare July 14, 2026 17:49
@fpasquet fpasquet changed the title feat(nest-profiler): rework the home page into a sidebar-navigated two-column layout feat(nest-profiler): rework the home page into per-kind sidebar views Jul 14, 2026
@fpasquet
fpasquet force-pushed the feat/profiler-sidebar-navigation branch from 41cd7b0 to dc44181 Compare July 14, 2026 18:23
@fpasquet
fpasquet force-pushed the feat/profiler-sidebar-navigation branch from dc44181 to 2e52350 Compare July 14, 2026 18:36
@fpasquet
fpasquet marked this pull request as ready for review July 14, 2026 18:39
- adopt the detail page's two-column layout with a sticky left sidebar selected via `?view=`
- give each list section (HTTP, GraphQL, Commands, RabbitMQ) its own page under a Profiling group
- promote each global-scope collector panel (Config, Routes, Schemas) to its own sidebar view
- badge every sidebar item: a section shows its unfiltered total, a global panel its `*Count`
- add `GlobalPanelInfo.badge`; render only the active view (default: the HTTP catch-all section)
- make the two-column layout responsive: stack on mobile, sticky two columns from `md` up
- wrap wide UI tables in `overflow-x-auto` + `min-w` so they scroll on a narrow viewport (#184)
- render an empty-state row on a list section that has no profiles
- add a detail-page back link to the kind's list; drop the redundant All Profiles header link
- apply the responsive layout identically to the profile detail page; document the navigation
@fpasquet
fpasquet force-pushed the feat/profiler-sidebar-navigation branch from 2e52350 to 8c59dc3 Compare July 14, 2026 18:40
@fpasquet
fpasquet merged commit a3ba8ee into main Jul 14, 2026
18 checks passed
@fpasquet
fpasquet deleted the feat/profiler-sidebar-navigation branch July 14, 2026 18:52
fpasquet added a commit that referenced this pull request Jul 15, 2026
…ckage (#195)

Each entrypoint kind now defines failure itself, resolved from its own package's `error` option.
A 404 is a bug for one team and an answer for another; a status means nothing to GraphQL or a CLI.

core:
- add `resolveProfileErrorClassifier`/`resolveEntryErrorClassifier`/`resolveErrorSeverity`
- resolve layers in order, first decisive: `classify`, then `httpStatus`, then `exceptions`
- make `httpStatus` decisive alone: a 404 also yields an exception, so reading both contradicts it
- add `error` to `ProfilerModuleOptions`, governing the built-in `http` kind
- add `isError`/`errorSeverity`/`hiddenFilters` to `ProfilerEntrypointType`
- add `isErrorEntry`/`errorSeverity` to `TagConfig`; `error` is now severity-configurable
- rewrite `errorRule` to own no criteria: it only applies each kind's and collector's verdict
- add an `Exception` list filter, its options built from the values actually captured
- render the exception `code` as a badge, so a filtered row shows what it was filtered on
- rename the `With errors` checkbox to `Errors`; the query parameter is unchanged

graphql:
- add `error`; a 200 says nothing, so `extensions.code` decides — `INTERNAL_SERVER_ERROR` by default
- add `code` to `ExceptionEntry`, read from `extensions.code` instead of the `stack` string
- align the module on `ConfigurableModuleBuilder` like the others, gaining `forRootAsync`

rabbitmq:
- add `error`; a message has no status, so the default is that the handler threw

commander:
- keep the tag (non-zero exit) with no option; hide the `Errors` checkbox, redundant with `Status`

example:
- drop the artificial `/api/v1/error`: a rejected `POST /products` is a truer 400, and its
  exception-capture coverage moves onto that route
- add `/api/v1/crash` for the 500 the Errors filter keeps

docs:
- add the "What counts as an error" guide, the API reference entries and the per-package options
- fix what the #187 sidebar rework left behind: the screenshot script still isolated `<details>`
  blocks from the old home page, silently shooting the HTTP list in place of the Config, Routes
  and Schema panels — each is now its own `?view=` page
- retire the `Type` filter from the docs; it no longer exists, kinds being sidebar views
- regenerate every screenshot against the current UI
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

package: nest-profiler Affects the @eleven-labs/nest-profiler package package: nest-profiler-cache Affects the @eleven-labs/nest-profiler-cache package package: nest-profiler-commander Affects the @eleven-labs/nest-profiler-commander package package: nest-profiler-graphql Affects the @eleven-labs/nest-profiler-graphql package package: nest-profiler-rabbitmq Affects the @eleven-labs/nest-profiler-rabbitmq package package: nest-profiler-routes Affects the @eleven-labs/nest-profiler-routes package package: nest-profiler-validator Affects the @eleven-labs/nest-profiler-validator package scope: examples Change to example applications scope: packages Change to a publishable package

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix: profile-list and panel tables are not horizontally scrollable on mobile

1 participant