Skip to content

fix(experiments): restoring the timezone label on the start and stop date - #108903

Merged
trunk-io[bot] merged 3 commits into
masterfrom
experiments/fix-timezone-conversion-start-stop-date
Sep 30, 2026
Merged

trunk-io[bot] merged 3 commits into
masterfrom
experiments/fix-timezone-conversion-start-stop-date

Conversation

@rodrigoi

@rodrigoi rodrigoi commented Sep 30, 2026 •

Copy link
Copy Markdown
Member

Problem

The redesigned experiment information bar lost the timezone conversion popover on the start and end dates, so users only see the time in their device timezone.

Changes

  • Hovering the start or end date now shows the TZLabel popover with device, project, UTC, and UNIX times.
  • The popover replaces the plain "Started ... Click to change." tooltip. Clicking the date still opens the calendar.
  • The popover hides while the calendar is open, so the two do not stack.
  • The refresh button drops its "Refresh results" tooltip, so it no longer competes with the TZLabel on the refresh time.
before
before
after, start date
start
after, end date
end
  • products/experiments/frontend/components/ExperimentMetaBar/ExperimentDateRange.tsx
  • products/experiments/frontend/components/ExperimentMetaBar/ExperimentRefreshButton.tsx

How did you test this code?

pnpm --filter=@posthog/frontend typescript:check

cat-type-small

👉 Stay up-to-date with PostHog coding conventions for a smoother review.

Release status

  • No feature flag controls this change
  • This change is behind a feature flag and is not available to users
  • This change makes a previously flagged feature available to everyone

Automatic notifications

  • Publish to changelog?

Docs update

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Agent: Claude Code, Opus 5.5

Model: Opus 5.5
Manually refactored: yes

Skills used:

  • /writing-pull-requests (local)
  • /writing-pr-descriptions (local)

Relevant decisions:

  • TZLabel wraps the button text instead of replacing the button, so the calendar picker keeps working on click.
  • The refresh time keeps its existing TZLabel in ExperimentLastRefreshText; only the competing button tooltip goes away.
  • The popover arrow points at the text, not the button edge. An offset middleware would fix it, but it needs @floating-ui/react as a new dependency of the experiments package.

🤖 Generated with Claude Code

@rodrigoi rodrigoi self-assigned this Sep 30, 2026
@trunk-io

trunk-io Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

😎 Merged successfully - details.

@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

🤖 CI report

✅ Trunk lane — non-backend lane (fe:product:experiments)

This PR is assigned to the non-backend lane (fe:product:experiments). It does not run backend Python tests and may merge in parallel with PRs in other lanes.

✅ Complexity (TypeScript) — clean

Cyclomatic complexity above the limit in changed typescript files (10 for production files, 15 for test files). Warn only: worth simplifying when you next touch these functions.

✅ Duplication (Python) — clean

New Python code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

✅ Duplication (TypeScript) — clean

New TypeScript code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

⚠️ Bundle size — 🔺 +5 B (+0.0%)

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

Total: 69.02 MiB · 🔺 +5 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.60 MiB · 22 files no change █████████░ 86.7% of 1.84 MiB
logged-out boot: index + App + bootApp (preloaded by every page, including /login)
src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
3.54 MiB · 629 files no change █████████░ 87.8% of 4.03 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
7.40 MiB · 2,358 files no change █████████░ 88.8% of 8.34 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/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/layout/navigation-3000/navigationLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/scenes/dashboard/dashboardLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/lemon-ui/LemonMarkdown/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/RichContentEditor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/CodeSnippet/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/taxonomy/core-filter-definitions-by-group.json stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 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
🟢 src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts 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
🟢 [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/index.tsx
1.3 KiB src/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
854 B src/scenes/ChunkLoadErrorBoundary.tsx
Largest files eagerly shipped from src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
Size File
301.8 KiB ../node_modules/.pnpm/posthog-js@1.434.14_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
216.9 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
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
100.5 KiB src/lib/api.ts
89.2 KiB src/products.tsx
69.4 KiB src/lib/lemon-ui/icons/icons.tsx
40.1 KiB src/lib/utils/eventUsageLogic.ts
38.7 KiB ../node_modules/.pnpm/@dnd-kit+core@6.0.8_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@dnd-kit/core/dist/core.esm.js
33.9 KiB ../node_modules/.pnpm/kea@4.0.0-pre.6_patch_hash=139b8d1f1304f9d9da452a9a1244c94ea679dbcb85687d8999563146879fb6f5_react@18.3.1/node_modules/kea/lib/index.cjs.js
28.5 KiB src/scenes/scenes.ts
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
301.8 KiB ../node_modules/.pnpm/posthog-js@1.434.14_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
272.3 KiB src/taxonomy/core-filter-definitions-by-group.json
216.9 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
153.7 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
100.5 KiB src/lib/api.ts
98.8 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
89.2 KiB src/products.tsx

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.17 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.17 MiB · 19 files no change ████░░░░░░ 37.9% of 5.72 MiB
Deferred (lazy) 2.10 MiB · 44 files no change n/a — loads on demand
Loader dist/toolbar.js 1.2 KiB no change █░░░░░░░░░ 6.0% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
808.7 KiB dist/toolbar/toolbar-app-B5DLYY4F.css
651.6 KiB dist/toolbar/chunk-chunk-TPLFJ5IQ.js
259.4 KiB dist/toolbar/chunk-chunk-OMXHH7OQ.js
138.3 KiB dist/toolbar/chunk-chunk-ZBFO7P7Z.js
131.8 KiB dist/toolbar/chunk-chunk-FDH2IBXT.js
75.2 KiB dist/toolbar/toolbar-app-D5QY3P6S.js
69.0 KiB dist/toolbar/chunk-chunk-TSAL54PB.js
35.6 KiB dist/toolbar/chunk-chunk-ESR7LIND.js
21.0 KiB dist/toolbar/chunk-chunk-USMXYCTT.js
6.8 KiB dist/toolbar/chunk-chunk-DV7IWQNF.js

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

✅ Dist folder size — 🔺 +672 B (+0.0%)

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

Total: 949.37 MiB · 🔺 +672 B (+0.0%)

✅ Playwright — all passed

All tests passed.

View test results →

@greptile-apps

greptile-apps Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Retrigger

[Low risk] Restores timezone label display on experiment date fields.

The PR appears safe to merge; no outstanding finding or new regression was identified.

Reviews (2) · Last reviewed commit: "fix(experiments): add aria label to relo..."

@coderabbitai

coderabbitai Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: PostHog/posthog/.coderabbit.yaml

Review profile: QUIET

Plan: Enterprise

Run ID: a0fbfcfe-fb64-4b74-bdaa-f6ee8eb9c53f

📥 Commits

Reviewing files that changed from the base of the PR and between 897b113 and 6f9b3f4.

📒 Files selected for processing (2)
  • products/experiments/frontend/components/ExperimentMetaBar/ExperimentDateRange.tsx
  • products/experiments/frontend/components/ExperimentMetaBar/ExperimentRefreshButton.tsx
💤 Files with no reviewable changes (1)
  • products/experiments/frontend/components/ExperimentMetaBar/ExperimentDateRange.tsx

Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 10 remain after this review.


📝 Walkthrough

Walkthrough

Dated experiment values render inside TZLabel with a boundary-specific title. The trigger hides the label while the calendar is open. The date-specific tooltip text was removed. The refresh button uses the aria-label “Refresh results” when idle and omits it while refreshing.

Priority: ⬇️ Low

Merge Risk: ⚪ Minimal · up to 6f9b3

The date picker and refresh control remain identifiable to assistive technology in the checked states. No concrete change-specific merge blocker is established.

🚥 Pre-merge checks | ✅ 1
✅ Passed checks (1 passed)
Check name Status Explanation
Description check ✅ Passed The description is complete and relevant. It explains the user problem, lists visible changes, includes frontend screenshots, identifies the automated type-check command, selects a release status, and…
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Comment @coderabbitai help to get the list of available commands.

@rodrigoi
rodrigoi marked this pull request as ready for review September 30, 2026 05:16
@rodrigoi rodrigoi added the stamphog Request AI approval (no full review) label Sep 30, 2026
@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

🦔 Hogbox preview · ✅ ready

▶ Open the preview

🔑 Login test@posthog.com / 12345678 (demo data)
🧩 Running this PR's backend and frontend, on the PostHog :master base
🔗 Link stable across rebuilds — a re-push swaps the box underneath, the URL stays
🔒 Access tailnet only (PostHog VPN)
🛠️ Admin inspect & debug state in hogland
💤 Idle sleeps after ~30 min idle (snapshot to S3, zero node cost) and wakes on your next visit in ~30s, behind a brief "waking up" screen

commit 6f9b3f4 · box box-6934e32d4e54 · ready in 737s (push → usable) · build log · rebuilds on every push, torn down on close

@pr-assigner-resolver-posthog
pr-assigner-resolver-posthog Bot requested a review from a team September 30, 2026 05:17
@trunk-io

trunk-io Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Static Badge   Static Badge   Static Badge

View Full Report ↗︎ ⋅ Docs

@stamphog stamphog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

Small, contained frontend UI fix by a STRONG-familiarity owning-team author. It is outside risky territory and easy to revert. The diff matches the description, and the refresh button keeps an aria-label.

  • Author wrote 100% of the modified lines and has 3 merged PRs in these paths (familiarity STRONG).
  • 👍 on the PR from greptile-apps[bot].
Gate mechanics and policy version
Gate Result
prerequisites ✓ all clear
deny-list ✓ no deny categories matched
size ✓ 20L, 2F substantive — within ceiling
tier ✓ T1-agent / T1a-trivial (20L, 2F, single-area, fix)
stamphog 2.3.1 .stamphog/policy.yml @ 6f9b3f4 · reviewed head 6f9b3f4

@trunk-io
trunk-io Bot merged commit b15e9fb into master Sep 30, 2026
353 of 371 checks passed
@trunk-io
trunk-io Bot deleted the experiments/fix-timezone-conversion-start-stop-date branch September 30, 2026 06:41
@deployment-status-posthog

deployment-status-posthog Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-09-30 07:01 UTC Run
prod-us ✅ Deployed 2026-09-30 07:20 UTC Run
prod-eu ✅ Deployed 2026-09-30 07:23 UTC Run

This branch was successfully deployed

1 active deployment
preview-pr-108903 — 6f9b3f4f Deployed Sep 30, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stamphog Request AI approval (no full review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant