feat(t-paliad-207): Verfahrensablauf + Fristenrechner polish (jurisdiction prefix, trigger-event, flag rows, rule links, R.19 label)
Five intertwined fixes m surfaced in the interactive session:
1. **Jurisdiction prefix on the picked proceeding** — the collapsed
summary chip and the result header now read "UPC Verletzungsverfahren"
/ "DE Verletzungsklage (LG)" instead of the bare proceeding name.
Disambiguates the 4 redundancies in the corpus once the picker
collapses. Driven by .proceeding-group[data-forum] which is already
on every group.
2. **Trigger Event label = root rule** — step 2's "Auslösendes Ereignis"
line now shows the first event in the proceeding (e.g. Klageerhebung,
Nichtigkeitsklage) instead of the proceeding name. Populated from
the calc response (isRootEvent=true) on every render; em-dash
placeholder while step 3 hasn't rendered yet. lang-change keeps it
coherent.
3. **Flag rows on /tools/verfahrensablauf** — Slice 1 of t-paliad-179
stripped the with_ccr / with_amend / with_cci toggles when it lifted
the shared renderer; they never came back. Lifted the 4 existing
rows from fristenrechner.tsx plus 2 new with_po rows (RoP 19.1
preliminary objection, mig 095) — same wiring + show/hide rules on
both surfaces. with_amend stays nested under with_ccr on upc.inf.cfi
(R.30 only with a CCR).
4. **Rule references → youpc.org/laws links** — new
BuildLegalSourceURL(src) maps the structured legal_source code to
the youpc permalink for the UPC corpus (UPCRoP / UPCA / UPCS today;
39 of 91 active rules carry UPC.RoP.* and now link). DE/EPA/EU
bodies have no youpc home yet and render as plain display text —
filed as m/paliad#39. Wired through UIDeadline.LegalSourceDisplay +
LegalSourceURL so deadlineCardHtml can render <a target="_blank"
rel="noopener"> when the URL is set.
5. **R.19 label: "Vorab-Einrede" → "Einspruch"** — m's correction. DE
only (EN canonical UPC RoP term stays "Preliminary objection").
Client-side change only — i18n + JSX fallbacks. The matching DB
rename on the two rule-name rows folds into joule's broader mig 097
(legal-citation backfill, t-paliad-208 follow-up). The live UPDATE
applied during the session is captured under that audit reason; the
no-op when joule's mig re-applies is harmless.
Build hygiene:
- go build ./... + go vet ./... clean
- new test TestBuildLegalSourceURL covers UPC corpus + DE/EPA/EU
fall-through + edge cases (empty input, malformed source)
- bun run build clean (2417 i18n keys total)
Rebased on origin/main @ d126913 (ohm's submission_code rename
workstream B) — no conflicts in this commit's surface area.
Branch: mai/fermi/interactive-session. NOT self-merged.
This commit is contained in:
@@ -878,14 +878,23 @@ func FormatLegalSourceDisplay(src string) string {
|
||||
// caller renders the display string as plain text.
|
||||
//
|
||||
// Inputs mirror FormatLegalSourceDisplay — structured dot-separated
|
||||
// codes like UPC.RoP.220.1, UPC.UPCA.83. Sub-paragraph segments
|
||||
// beyond the law-number position are dropped; youpc resolves the page
|
||||
// at <type>/<number> granularity.
|
||||
// codes like UPC.RoP.23.1, UPC.UPCA.83. Sub-paragraph segments beyond
|
||||
// the law-number position are dropped; youpc resolves the page at
|
||||
// <type>.<number> granularity. The law-number is zero-padded to 3
|
||||
// digits to match how youpc stores law_number (laws-data.json carries
|
||||
// "001" / "023" / "220" forms).
|
||||
//
|
||||
// UPC.RoP.220.1 → https://youpc.org/laws/UPCRoP/220
|
||||
// UPC.RoP.29.a → https://youpc.org/laws/UPCRoP/29
|
||||
// UPC.UPCA.83 → https://youpc.org/laws/UPCA/83
|
||||
// DE.ZPO.276.1 → "" (no youpc home — render display text plain)
|
||||
// URL shape uses the hash-fragment form that youpc itself emits from
|
||||
// its laws-page redirect (handlers/laws.go:215+229) — the canonical
|
||||
// in-app deep link target. The `/laws/:type/:number` pretty route also
|
||||
// resolves the same page but redirects to the hash form anyway.
|
||||
//
|
||||
// UPC.RoP.23.1 → https://youpc.org/laws#UPCRoP.023
|
||||
// UPC.RoP.139 → https://youpc.org/laws#UPCRoP.139
|
||||
// UPC.RoP.220.1 → https://youpc.org/laws#UPCRoP.220
|
||||
// UPC.RoP.29.a → https://youpc.org/laws#UPCRoP.029
|
||||
// UPC.UPCA.83 → https://youpc.org/laws#UPCA.083
|
||||
// DE.ZPO.276.1 → "" (no youpc home — render display text plain)
|
||||
func BuildLegalSourceURL(src string) string {
|
||||
src = strings.TrimSpace(src)
|
||||
if src == "" {
|
||||
@@ -906,11 +915,30 @@ func BuildLegalSourceURL(src string) string {
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
number := parts[2]
|
||||
number := padLawNumber(parts[2])
|
||||
if number == "" {
|
||||
return ""
|
||||
}
|
||||
return "https://youpc.org/laws/" + lawType + "/" + number
|
||||
return "https://youpc.org/laws#" + lawType + "." + number
|
||||
}
|
||||
|
||||
// padLawNumber zero-pads a pure-digit law-number segment to 3 digits.
|
||||
// Non-digit-only inputs (e.g. "112a" if youpc ever ingests EPÜ Art.
|
||||
// 112a) pass through unchanged so the URL still resolves. Empty input
|
||||
// returns the empty string.
|
||||
func padLawNumber(s string) string {
|
||||
if s == "" {
|
||||
return ""
|
||||
}
|
||||
for _, c := range s {
|
||||
if c < '0' || c > '9' {
|
||||
return s
|
||||
}
|
||||
}
|
||||
if len(s) >= 3 {
|
||||
return s
|
||||
}
|
||||
return strings.Repeat("0", 3-len(s)) + s
|
||||
}
|
||||
|
||||
// RefreshSearchView re-populates the materialised view. Safe to call on
|
||||
|
||||
@@ -48,13 +48,14 @@ func TestBuildLegalSourceURL(t *testing.T) {
|
||||
cases := []struct {
|
||||
in, want string
|
||||
}{
|
||||
{"UPC.RoP.23.1", "https://youpc.org/laws/UPCRoP/23"},
|
||||
{"UPC.RoP.139", "https://youpc.org/laws/UPCRoP/139"},
|
||||
{"UPC.RoP.220.1", "https://youpc.org/laws/UPCRoP/220"},
|
||||
{"UPC.RoP.29.a", "https://youpc.org/laws/UPCRoP/29"},
|
||||
{"UPC.RoP.49.2.a", "https://youpc.org/laws/UPCRoP/49"},
|
||||
{"UPC.UPCA.83", "https://youpc.org/laws/UPCA/83"},
|
||||
{"UPC.UPCS.40.1", "https://youpc.org/laws/UPCS/40"},
|
||||
{"UPC.RoP.23.1", "https://youpc.org/laws#UPCRoP.023"},
|
||||
{"UPC.RoP.139", "https://youpc.org/laws#UPCRoP.139"},
|
||||
{"UPC.RoP.220.1", "https://youpc.org/laws#UPCRoP.220"},
|
||||
{"UPC.RoP.29.a", "https://youpc.org/laws#UPCRoP.029"},
|
||||
{"UPC.RoP.49.2.a", "https://youpc.org/laws#UPCRoP.049"},
|
||||
{"UPC.RoP.19.1", "https://youpc.org/laws#UPCRoP.019"},
|
||||
{"UPC.UPCA.83", "https://youpc.org/laws#UPCA.083"},
|
||||
{"UPC.UPCS.40.1", "https://youpc.org/laws#UPCS.040"},
|
||||
{"DE.PatG.82.1", ""},
|
||||
{"DE.ZPO.276.1", ""},
|
||||
{"EU.EPÜ.108", ""},
|
||||
|
||||
Reference in New Issue
Block a user