Browse-a-proceeding: side+appellant selectors + 'appealable decision' trigger label #81
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
m's report (2026-05-25 12:51 + 12:54)
m pasted a worked example of the current state — every "both parties" deadline appears TWICE (once in Proactive, once in Reactive):
m: "This would be better then - thanks" — referring to the cleaned-up output once the appellant selector lands.
Scope
Three concerns, one task:
Concern A — Side / appellant selectors
grep -rforKlägerseite|Beklagtenseite|claimant|defendantcheckboxes) to the Browse-a-proceeding page.Concern B — Appeal trigger label bug
The UPC Appeal proceeding currently uses trigger event "Appeal proceeding" but the actual trigger is the appealable decision (the first-instance ruling that starts the appeal clock). Rename / fix:
paliad.event_typesor wherever proceeding triggers live.Concern C — Parameter contract for proceeding selection
When a project HAS a chosen proceeding (typical state), the side+appellant selectors should be auto-filled from the project's parties / counterclaim_of / submission history. The Browse-a-proceeding feature is the only place these are manual.
Define the parameter set cleanly:
side: claimant / defendant (or DE equivalent)appellant: claimant / defendant / null (only relevant when proceeding has an appellant axis)These flow into the deadline-rule resolution that builds the timeline columns.
What to do
frontend/src/browse-proceeding.tsxor similar — verify path).?side=...&appellant=...) so the view is shareable.Files most likely touched
frontend/src/browse-proceeding.tsx+ corresponding client filefrontend/src/client/views/shape-timeline.ts(or whoever builds the column projection)internal/services/projection_service.go— the column placement logic if it's server-sideHard rules
go build ./... && go test ./internal/... && cd frontend && bun run buildclean.mai/<worker>/proceeding-side-appellant.Out of scope
Reporting
mai report completedwith branch + SHAs + the UX path: open Browse-a-proceeding → pick UPC Appeal → choose appellant=claimant → confirm each deadline appears once in the correct column (no "both parties" duplicates) AND the trigger label reads "appealable decision" / equivalent.Done — branch
mai/hermes/gitster-browse-aCommit:
02255c4234What changed
Concern A — side + appellant selectors on /tools/verfahrensablauf
Added a perspective strip below the trigger-date row in step 2:
Seite:— Klägerseite / Beklagtenseite / Beide (default Beide). Side=defendant swaps the column labels so the user's own side is the Proaktiv column ("your filings") and the opposing side is Reaktiv.Berufung durch:— Klägerseite / Beklagtenseite / — (default —). When set,party='both'rows collapse to a single row in the appellant's column — no more duplicate "both parties" entries across Proactive + Reactive.Both selectors are URL-driven (
?side=…&appellant=…) so the perspective survives reload and is shareable. The appellant row hides itself for proceedings without an appellant axis (first-instance Inf / Rev / Opp) via a small allowlist.Concern B — UPC Appeal trigger label
"Auslösendes Ereignis" on /tools/verfahrensablauf now reads Anfechtbare Entscheidung / Appealable Decision instead of falling back to "Berufungsverfahren" / "Appeal". Implemented as an optional
trigger_event_label_{de,en}column onpaliad.proceeding_types(mig 121); the frontend prefers it over the proceedingName fallback that fires when no rule hasIsRootEvent=true. No deadline-rule additions, no slug changes — hard rule from the issue.Concern C — parameter contract
Column routing extracted into
bucketDeadlinesIntoColumns(deadlines, {side, appellant})— a pure helper thatrenderColumnsBodynow calls. The selectors are auto-populatable from project context in the future (when /tools/verfahrensablauf gains an Akte binding) — for now the wizard is no-project, so only manual selection.Files
internal/db/migrations/121_proceeding_trigger_event_label.{up,down}.sql— schema + UPC Appeal label seedinternal/models/models.go—ProceedingType.TriggerEventLabel{DE,EN}internal/services/fristenrechner.go— UIResponse exposestriggerEventLabel{,EN}frontend/src/verfahrensablauf.tsx— perspective strip in step 2frontend/src/client/verfahrensablauf.ts—?side+?appellantURL state, recalc-free re-render, appellant-axis allowlist (upc.apl.*, DE Berufung/Revision,dpma.appeal.*,epa.opp.boa)frontend/src/client/views/verfahrensablauf-core.ts—bucketDeadlinesIntoColumnshelper + column-label swapfrontend/src/client/views/verfahrensablauf-core.test.ts— 7 new tests pinning the routing matrixfrontend/src/client/i18n.ts,frontend/src/i18n-keys.ts— new DE/EN stringsfrontend/src/styles/global.css—.verfahrensablauf-perspectivelayoutVerification
go build ./...cleango test ./...all greenbun run build(frontend) cleanbun test110/110 (12 new + 98 prior)UX path (once deployed)
/tools/verfahrensablaufAnfechtbare Entscheidung(DE) /Appealable Decision(EN) ✔Berufung durch: Klägerseite— Notice of Appeal, Statement of Grounds, Response to Appeal, Cross-Appeal, Reply to Cross-Appeal each appear ONCE in the Proactive column (no more duplicates).Berufung durch: Beklagtenseite— same rows now appear ONCE in the Reactive column.?side=…&appellant=…for share/reload.Out of scope (filed-as-future)
The current spec collapses ALL
party='both'rules into the appellant's column. Strictly speaking some of them (Response to Appeal, Cross-Appeal) are respondent-side filings — but the deadline_rules schema doesn't carry per-rule appellant/respondent tagging yet, and the issue's hard rules excluded schema additions. Filing as follow-up: enrichpaliad.deadline_ruleswith anappellant_role: 'appellant' | 'respondent' | nullcolumn so respondent filings land in the respondent's column instead. That would turn the current single-column collapse into the realistic-per-row routing m's original brief alludes to.