Skip to content

fix(persons): stop person preview covering row action buttons - #81595

Draft
posthog[bot] wants to merge 2 commits into
masterfrom
posthog-self-driving/fixpersons-stop-the-no-profile-popover-8b4e73
Draft

fix(persons): stop person preview covering row action buttons#81595
posthog[bot] wants to merge 2 commits into
masterfrom
posthog-self-driving/fixpersons-stop-the-no-profile-popover-8b4e73

Conversation

@posthog

@posthog posthog Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Problem

  • An analyst opens a funnel's persons list, clicks a dropped-off person's name, and the person preview opens over the row's own "View recording" button — so the next click lands on the popover, not the button.
  • For a person with no profile, that popover is the "No profile associated with this ID" empty state, so the analyst aims at the play button and gets a shrug instead of a recording.
  • This is routine, not an edge case: a large share of events are captured without a person profile, so funnel actor rows regularly reference people with no profile to preview.
  • Root cause: PersonDisplay's preview popover lists right as a fallback placement. When there is not enough room above or below the name, flip moves it beside the anchor — at the same height as the row's action buttons, on top of them.

Changes

  • Drop right from the preview popover's fallbackPlacements in PersonDisplay, leaving top and bottom only.
  • Both remaining placements sit above or below the name, so the preview can never share the row's vertical band with the "View recording" button.
  • The existing size middleware already caps the popover height and scrolls its content, so removing the side escape hatch does not clip the preview.

How did you test this code?

  • Verified at the floating-ui config level: the popover feeds fallbackPlacements straight into flip, so removing right leaves only top/bottom, which are vertically offset from the row and cannot overlap an in-row button.
  • I did not run the app or capture a before/after screenshot. This overlap only appears when vertical space is too tight for top or bottom (the condition that made flip choose right), which the roomy Storybook mock does not reproduce. No automated test asserts popover geometry, so I added none — a unit test here would assert floating-ui internals rather than a real regression.

Automatic notifications

  • Publish to changelog?

Docs update

None — internal UI placement fix, no user-facing copy or documented workflow changes.

🤖 Agent context

Autonomy: Fully autonomous

Authored by Claude Code (Opus 4.8) from a PostHog inbox report.

  • Scope: I took only the unclaimed "popover" half of the report. The related recording-copy and diagnostics work is already in flight — #72320 reworks the missing-recording button copy in this same modal, and the report notes a separate PR splitting the replay diagnostics fallback — so I left both alone.
  • Overlap check: #73800 edits PersonDisplay.tsx too, but its concern is link/click gating via asLink; it does not touch popover placement, so this change is additive and does not conflict semantically.
  • Decision: the report suggested three options (scope the click target, constrain placement, or skip the popover when there is no profile). I chose the placement constraint because it deterministically frees the button in every case, while "skip when no profile" depends on detecting profile absence synchronously from the actor object, which is not reliable (properties can be an empty-but-present object).

Created with PostHog Desktop from this inbox report.

The person preview popover fell back to a side (right) placement when
there was not enough space above or below the name. In the funnel actors
modal that side placement lands on the row's own "View recording" button,
so a click aimed at the button hits the popover instead — and for
profile-less actors that popover is the "No profile associated with this
ID" dead end.

Constrain the fallback to above/below only, so the preview can never sit
beside the name over the row's action controls.

Generated-By: PostHog Desktop
Task-Id: 0bcf3cdd-f2c7-4987-a729-9dcf8a818d97
@trunk-io

trunk-io Bot commented Aug 11, 2026

Copy link
Copy Markdown

Merging to master in this repository is managed by Trunk.

  • To merge this pull request, check the box to the left or comment /trunk merge below.

After your PR is submitted to the merge queue, this comment will be automatically updated with its status. If the PR fails, failure details will also be posted here

@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

🤖 CI report

Bundle size — 🟢 -8 B (-0.0%)

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 67.75 MiB · 🟢 -8 B (-0.0%)

No file changed by more than 1000 B.

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1.26 MiB · 22 files no change ███░░░░░░░ 28.0% of 4.51 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
8.36 MiB · 3,140 files 🟢 -8 B (-0.0%) █████████░ 86.1% of 9.71 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx

Largest files eagerly shipped from src/index.tsx
Size File
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
6.3 KiB ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js
4.5 KiB ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js
3.9 KiB ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js
1.4 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.3 KiB src/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
789 B src/scenes/ChunkLoadErrorBoundary.tsx
762 B src/index.tsx
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
285.3 KiB ../node_modules/.pnpm/posthog-js@1.410.1/node_modules/posthog-js/dist/rrweb.js
267.7 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
238.4 KiB src/taxonomy/core-filter-definitions-by-group.json
231.5 KiB ../node_modules/.pnpm/posthog-js@1.410.1/node_modules/posthog-js/dist/module.js
154.3 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
104.5 KiB src/lib/api.ts
94.6 KiB ../packages/quill/packages/quill/dist/index.js
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
90.6 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js

Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479

Toolbar bundle — eager 2.20 MiB within budget

What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.

Metric Size Δ vs base Budget
Eager (shipped)
entry + static imports
2.20 MiB · 17 files no change ████░░░░░░ 38.4% of 5.72 MiB
Deferred (lazy) 2.08 MiB · 33 files no change n/a — loads on demand
Loader dist/toolbar.js 1.1 KiB no change █░░░░░░░░░ 5.8% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
725.7 KiB dist/toolbar/toolbar-app-VGLJI6DC.css
552.7 KiB dist/toolbar/chunk-chunk-EZ5S4CFD.js
484.6 KiB dist/toolbar/chunk-chunk-7QEIU5OS.js
133.6 KiB dist/toolbar/chunk-chunk-GBTDYOYN.js
131.8 KiB dist/toolbar/chunk-chunk-T5KY5WYR.js
71.2 KiB dist/toolbar/toolbar-app-EXXK5YIQ.js
69.0 KiB dist/toolbar/chunk-chunk-27JL52RE.js
35.6 KiB dist/toolbar/chunk-chunk-N5Q3HTBN.js
20.9 KiB dist/toolbar/chunk-chunk-6JVOILCC.js
12.2 KiB dist/toolbar/chunk-chunk-PIK3PADE.js

Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile

Dist folder size — 🔺 +523 B (+0.0%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 1421.45 MiB · 🔺 +523 B (+0.0%)

@posthog posthog Bot added the run-ci-frontend Force ci-storybook's full visual-regression matrix to run even on a draft PR label Aug 12, 2026
…o-profile-popover-8b4e73

Generated-By: PostHog Desktop
Task-Id: 0bcf3cdd-f2c7-4987-a729-9dcf8a818d97
@posthog

posthog Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor Author

👋 Visual changes detected for this PR.

Review and approve in PostHog Visual Review

If these changes are unexpected, they may be caused by a flaky test or a broken snapshot on master. Don't approve — rerun the job or wait for a fix.

@trunk-io

trunk-io Bot commented Aug 12, 2026

Copy link
Copy Markdown

Static BadgeStatic BadgeStatic Badge

View Full Report ↗︎Docs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

run-ci-frontend Force ci-storybook's full visual-regression matrix to run even on a draft PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants