From e45b9f4d98f10cfc68f7fd96aa426c03458ca274 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 17 Aug 2026 14:17:26 +0900 Subject: [PATCH] feat: focus Event Lineage when opening a landed report member (v1.3.0) Opening Public post from Demo Corp members now focuses the popup Event Lineage heading so the next-action copy is reachable. Home list opens do not steal that focus. --- ...-focus-event-lineage-from-report-member.md | 4 ++++ CHANGELOG.md | 8 +++++++ frontend/package.json | 2 +- frontend/src/App.test.tsx | 3 +++ frontend/src/App.tsx | 24 ++++++++++++++++--- lineageweave/__init__.py | 2 +- pyproject.toml | 2 +- uv.lock | 2 +- 8 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 CHANGELOG.d/1.3.0-focus-event-lineage-from-report-member.md diff --git a/CHANGELOG.d/1.3.0-focus-event-lineage-from-report-member.md b/CHANGELOG.d/1.3.0-focus-event-lineage-from-report-member.md new file mode 100644 index 000000000..33f0436a9 --- /dev/null +++ b/CHANGELOG.d/1.3.0-focus-event-lineage-from-report-member.md @@ -0,0 +1,4 @@ +# 1.3.0 Focus Event Lineage from a report member + +Open Public post from the landed Demo Corp members and the popup Event +Lineage heading takes focus. Home list opens do not. diff --git a/CHANGELOG.md b/CHANGELOG.md index 98bd39366..5e98c688b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to this project are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.3.0] - 2026-08-17 + +### Added + +- Opening Public post from the landed Demo Corp members focuses the + popup Event Lineage heading, matching the next-action copy. Home + post-list opens do not steal that focus. No TEPP theta is invented. + ## [1.2.0] - 2026-08-17 ### Added diff --git a/frontend/package.json b/frontend/package.json index 887fc38d4..0361d7c2b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "frontend", "private": true, - "version": "1.2.0", + "version": "1.3.0", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/App.test.tsx b/frontend/src/App.test.tsx index 0ffdea3ac..5aa1b02dd 100644 --- a/frontend/src/App.test.tsx +++ b/frontend/src/App.test.tsx @@ -1470,6 +1470,7 @@ describe("App, authenticated", () => { // page, not a flat list -- two SVGs (home + popup) share the fork. expect(screen.getAllByLabelText("A-100 lineage").length).toBeGreaterThanOrEqual(2); expect(screen.getAllByLabelText("Open post: Pricing renegotiation follow-up").length).toBeGreaterThanOrEqual(2); + expect(document.getElementById("post-event-lineage")).not.toHaveFocus(); }); it("shows a seeded Ask exchange without an orchestrator round-trip", async () => { @@ -2264,6 +2265,7 @@ describe("App, authenticated", () => { expect( screen.getAllByRole("heading", { name: "Event Lineage" }).length, ).toBeGreaterThanOrEqual(2); + expect(document.getElementById("post-event-lineage")).toHaveFocus(); } finally { HTMLElement.prototype.scrollIntoView = originalScrollIntoView; } @@ -2527,6 +2529,7 @@ describe("App, authenticated", () => { expect(screen.getByText("Constructive stance: 2")).toBeInTheDocument(); expect(screen.getAllByText(/Ada West/).length).toBeGreaterThan(0); expect(screen.getAllByLabelText("A-100 lineage").length).toBeGreaterThanOrEqual(2); + expect(document.getElementById("post-event-lineage")).toHaveFocus(); }); it("lets post_admin rebuild the period report", async () => { diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 191e71dac..ce0f8a08a 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1163,6 +1163,7 @@ function PostDetailPopup({ canExtract, graph, liveBodyWarning, + focusEventLineage, onClose, onSelectPost, }: { @@ -1171,6 +1172,7 @@ function PostDetailPopup({ canExtract: boolean; graph: LineageGraph | null; liveBodyWarning?: string | null; + focusEventLineage?: boolean; onClose: () => void; onSelectPost?: (postId: string) => void; }) { @@ -1231,6 +1233,15 @@ function PostDetailPopup({ fetchPostVocEvidence(accessToken, postId).then(setVocEvidence).catch(() => setVocEvidence(null)); }, [postId, accessToken]); + useEffect(() => { + if (!focusEventLineage || !post) { + return; + } + const heading = document.getElementById("post-event-lineage"); + heading?.focus(); + heading?.scrollIntoView?.({ block: "nearest" }); + }, [focusEventLineage, post]); + return (
event.stopPropagation()}> @@ -1372,7 +1383,9 @@ function PostDetailPopup({ />
-

Event Lineage

+

+ Event Lineage +

void; + onSelectPost: (postId: string, options?: SelectPostOptions) => void; period: string; onSelectPeriod: (periodCode: string) => void; grouping: string; @@ -2295,7 +2309,7 @@ function ReportsPanel({ ? "true" : undefined } - onClick={() => onSelectPost(member.post_id)} + onClick={() => onSelectPost(member.post_id, { fromReportMember: true })} > {member.post_title} θ {member.theta_eap.toFixed(2)} @@ -2442,6 +2456,7 @@ function PostList({ accessToken }: { accessToken: string }) { const [openedGroupingKey, setOpenedGroupingKey] = useState(null); const [openedGroupingLabel, setOpenedGroupingLabel] = useState(null); const [landOnComparison, setLandOnComparison] = useState(false); + const [openedFromReportMember, setOpenedFromReportMember] = useState(false); function openReportFromAnalysisRun( periodCode: string, @@ -2479,12 +2494,14 @@ function PostList({ accessToken }: { accessToken: string }) { setSelectedPostId(postId); setOpenedAfterCutoff(Boolean(options?.liveAfterCutoff)); setOpenedCutoffIso(options?.knowledgeCutoff ?? null); + setOpenedFromReportMember(Boolean(options?.fromReportMember)); } function closeSelectedPost() { setSelectedPostId(null); setOpenedAfterCutoff(false); setOpenedCutoffIso(null); + setOpenedFromReportMember(false); } useEffect(() => { @@ -2572,6 +2589,7 @@ function PostList({ accessToken }: { accessToken: string }) { liveBodyWarning={ openedAfterCutoff ? analysisRunOpenedBodyWarning(openedCutoffIso) : null } + focusEventLineage={openedFromReportMember} onClose={closeSelectedPost} onSelectPost={selectPost} /> diff --git a/lineageweave/__init__.py b/lineageweave/__init__.py index 014176f1b..595ce60bf 100644 --- a/lineageweave/__init__.py +++ b/lineageweave/__init__.py @@ -55,4 +55,4 @@ "sentence_excerpts", ] -__version__ = "1.2.0" +__version__ = "1.3.0" diff --git a/pyproject.toml b/pyproject.toml index aecbe001f..f346811ae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lineageweave" -version = "1.2.0" +version = "1.3.0" description = "Reconstructs git-branch-style lineage DAGs from scattered short records using multi-channel score fusion and LLM adjudication." readme = "README.md" license = { text = "MIT" } diff --git a/uv.lock b/uv.lock index 881676af2..ff19ac892 100644 --- a/uv.lock +++ b/uv.lock @@ -454,7 +454,7 @@ wheels = [ [[package]] name = "lineageweave" -version = "1.2.0" +version = "1.3.0" source = { virtual = "." } dependencies = [ { name = "certifi" },