Verfahrensablauf perspective: replace 'Beide' with 'Undefined' (legally impossible to be on both sides) #120

Open
opened 2026-05-26 07:23:50 +00:00 by mAi · 1 comment
Collaborator

m's report (2026-05-26 09:24)

2
Perspektive und Datum
Seite:
Klägerseite
Beklagtenseite
Beide

This 'Beide' Option usually has no consequences?! I think we should remove it or replace 'Beide' (legally impossible!) by Undefined

Scope

The Verfahrensablauf side selector currently offers Klägerseite / Beklagtenseite / Beide. "Beide" is legally impossible (no party is on both sides). The right semantic is "perspective not yet chosen" — replace with "Undefined" / "Nicht festgelegt".

Fix:

  1. Rename the chip label BeideNicht festgelegt (DE) / Undefined (EN). Keep the underlying state value (probably 'both' or null) for backward compat OR migrate to null/'undefined' if cleaner.
  2. Default state when project has no our_side and user hasn't picked = Undefined. This is also the value icarus #111 falls back to when no project autofill is available.
  3. The deadline-column projection in this state shows all rules in both columns (current behavior) — that's correct as the "I haven't picked yet" fallback.
  4. Add a small hint chip / tooltip: "Wählen Sie eine Seite, um die Spalten zu fokussieren." / "Pick a side to focus the columns."

Files most likely touched

  • frontend/src/client/verfahrensablauf.ts — chip label + state value
  • frontend/src/client/views/verfahrensablauf-core.ts — projection behavior when side=undefined
  • frontend/src/client/views/verfahrensablauf-core.test.ts
  • frontend/src/client/i18n.ts — replace side.both with side.undefined; keep DE/EN translations
  • frontend/src/i18n-keys.ts

Hard rules

  • Backward compat on URL state — if a user has a saved URL with ?side=both, treat as undefined (same column behavior).
  • Don't change the side toggle's downstream effect when 'Klägerseite' or 'Beklagtenseite' is picked.
  • go build ./... && go test ./internal/... && cd frontend && bun run build clean.
  • Branch: mai/<worker>/perspective-beide-to-undefined.

Out of scope

  • Cross-jurisdictional perspective variants (e.g. EPA Einsprechende/Patentinhaberin — those have their own roles).
  • Removing the perspective concept entirely.

Reporting

mai report completed with branch + SHAs + UX path: open Verfahrensablauf with no project context → chip cluster shows Klägerseite / Beklagtenseite / Nicht festgelegt → pick Nicht festgelegt → both columns render all rules (same behavior as old 'Beide') → hint chip prompts to pick a side.

## m's report (2026-05-26 09:24) > 2 > Perspektive und Datum > Seite: > Klägerseite > Beklagtenseite > Beide > > This 'Beide' Option usually has no consequences?! I think we should remove it or replace 'Beide' (legally impossible!) by Undefined ## Scope The Verfahrensablauf side selector currently offers `Klägerseite / Beklagtenseite / Beide`. "Beide" is legally impossible (no party is on both sides). The right semantic is "perspective not yet chosen" — replace with "Undefined" / "Nicht festgelegt". Fix: 1. Rename the chip label `Beide` → `Nicht festgelegt` (DE) / `Undefined` (EN). Keep the underlying state value (probably `'both'` or `null`) for backward compat OR migrate to `null`/`'undefined'` if cleaner. 2. Default state when project has no `our_side` and user hasn't picked = `Undefined`. This is also the value icarus #111 falls back to when no project autofill is available. 3. The deadline-column projection in this state shows **all rules in both columns** (current behavior) — that's correct as the "I haven't picked yet" fallback. 4. Add a small hint chip / tooltip: "Wählen Sie eine Seite, um die Spalten zu fokussieren." / "Pick a side to focus the columns." ## Files most likely touched - `frontend/src/client/verfahrensablauf.ts` — chip label + state value - `frontend/src/client/views/verfahrensablauf-core.ts` — projection behavior when side=undefined - `frontend/src/client/views/verfahrensablauf-core.test.ts` - `frontend/src/client/i18n.ts` — replace `side.both` with `side.undefined`; keep DE/EN translations - `frontend/src/i18n-keys.ts` ## Hard rules - Backward compat on URL state — if a user has a saved URL with `?side=both`, treat as `undefined` (same column behavior). - Don't change the side toggle's downstream effect when 'Klägerseite' or 'Beklagtenseite' is picked. - `go build ./... && go test ./internal/... && cd frontend && bun run build` clean. - Branch: `mai/<worker>/perspective-beide-to-undefined`. ## Out of scope - Cross-jurisdictional perspective variants (e.g. EPA Einsprechende/Patentinhaberin — those have their own roles). - Removing the perspective concept entirely. ## Reporting `mai report completed` with branch + SHAs + UX path: open Verfahrensablauf with no project context → chip cluster shows Klägerseite / Beklagtenseite / Nicht festgelegt → pick Nicht festgelegt → both columns render all rules (same behavior as old 'Beide') → hint chip prompts to pick a side.
mAi self-assigned this 2026-05-26 07:23:50 +00:00
Author
Collaborator

Shipped on mai/hermes/gitster-verfahrensablauf @ 0e1f62e.

Changes

  • Chip label: BeideNicht festgelegt (DE) / Undefined (EN). The underlying radio value stays "" so the side state remains the existing null (no migration needed).
  • Hint chip: new italic, muted-tone hint sits next to the radio cluster — „Wählen Sie eine Seite, um die Spalten zu fokussieren." (DE) / “Pick a side to focus the columns.” (EN). Shown only while currentSide === null; auto-hides as soon as the user picks Klägerseite or Beklagtenseite.
  • Projection behaviour: unchanged. bucketDeadlinesIntoColumns already routes side: null as the claimant-on-the-left fallback with party='both' rules rendered in both columns — that's exactly the old Beide behaviour.
  • URL backward-compat: ?side=both was already silently treated as null by readSideFromURL() (it only accepts claimant|defendant). No legacy URLs break; the column layout stays identical for them.
  • Out of scope: projects.field.our_side.both is a different concept (a project participating on both sides as a multi-party stakeholder) and stays untouched.

Files

  • frontend/src/verfahrensablauf.tsx — chip label flip + new <span id="side-hint"> inside #side-radio-cluster.
  • frontend/src/client/verfahrensablauf.ts — new syncSideHintVisibility(); wired into initPerspectiveControls, the name=side change handler, and showSideRadioCluster (chip → radio override path).
  • frontend/src/client/i18n.tsdeadlines.side.bothdeadlines.side.undefined in DE+EN; new deadlines.side.hint in DE+EN.
  • frontend/src/i18n-keys.ts — renamed in the union, kept alphabetical.
  • frontend/src/styles/global.css.side-radio-cluster becomes inline-flex so the hint sits next to the toggle; .side-hint muted+italic.

UX path verified by code review

  1. Open /tools/verfahrensablauf with no project context.
  2. Step 2 chip cluster reads Klägerseite / Beklagtenseite / Nicht festgelegt (last one checked by default).
  3. Hint chip next to it: „Wählen Sie eine Seite, um die Spalten zu fokussieren.".
  4. Default state renders both columns with all rules (including party='both' mirrored into both columns) — the existing bucketDeadlinesIntoColumns test case "default (no opts) mirrors 'both' rules into ours AND opponent" still passes and covers this projection.
  5. Pick Klägerseite or Beklagtenseite → hint disappears, columns focus.
  6. Pick Nicht festgelegt again → hint reappears, both columns repopulate.

Verification

  • bun test src/client/views/verfahrensablauf-core.test.ts17 pass / 0 fail (41 expect calls).
  • bun run build — clean (i18n codegen: 2901 keys, i18n scan: data-i18n attributes clean).
  • go build ./... — clean.
  • go test ./internal/... — clean.

Commit: https://mgit.msbls.de/m/paliad/commit/0e1f62e

Shipped on `mai/hermes/gitster-verfahrensablauf` @ 0e1f62e. ## Changes - **Chip label**: `Beide` → **Nicht festgelegt** (DE) / **Undefined** (EN). The underlying radio value stays `""` so the side state remains the existing `null` (no migration needed). - **Hint chip**: new italic, muted-tone hint sits next to the radio cluster — *„Wählen Sie eine Seite, um die Spalten zu fokussieren."* (DE) / *“Pick a side to focus the columns.”* (EN). Shown only while `currentSide === null`; auto-hides as soon as the user picks Klägerseite or Beklagtenseite. - **Projection behaviour**: unchanged. `bucketDeadlinesIntoColumns` already routes `side: null` as the claimant-on-the-left fallback with `party='both'` rules rendered in **both** columns — that's exactly the old `Beide` behaviour. - **URL backward-compat**: `?side=both` was already silently treated as `null` by `readSideFromURL()` (it only accepts `claimant`|`defendant`). No legacy URLs break; the column layout stays identical for them. - **Out of scope**: `projects.field.our_side.both` is a different concept (a project participating on both sides as a multi-party stakeholder) and stays untouched. ## Files - `frontend/src/verfahrensablauf.tsx` — chip label flip + new `<span id="side-hint">` inside `#side-radio-cluster`. - `frontend/src/client/verfahrensablauf.ts` — new `syncSideHintVisibility()`; wired into `initPerspectiveControls`, the `name=side` change handler, and `showSideRadioCluster` (chip → radio override path). - `frontend/src/client/i18n.ts` — `deadlines.side.both` → `deadlines.side.undefined` in DE+EN; new `deadlines.side.hint` in DE+EN. - `frontend/src/i18n-keys.ts` — renamed in the union, kept alphabetical. - `frontend/src/styles/global.css` — `.side-radio-cluster` becomes `inline-flex` so the hint sits next to the toggle; `.side-hint` muted+italic. ## UX path verified by code review 1. Open `/tools/verfahrensablauf` with no project context. 2. Step 2 chip cluster reads **Klägerseite / Beklagtenseite / Nicht festgelegt** (last one checked by default). 3. Hint chip next to it: *„Wählen Sie eine Seite, um die Spalten zu fokussieren."*. 4. Default state renders both columns with all rules (including `party='both'` mirrored into both columns) — the existing `bucketDeadlinesIntoColumns` test case `"default (no opts) mirrors 'both' rules into ours AND opponent"` still passes and covers this projection. 5. Pick Klägerseite or Beklagtenseite → hint disappears, columns focus. 6. Pick Nicht festgelegt again → hint reappears, both columns repopulate. ## Verification - `bun test src/client/views/verfahrensablauf-core.test.ts` — **17 pass / 0 fail** (41 expect calls). - `bun run build` — clean (`i18n codegen: 2901 keys`, `i18n scan: data-i18n attributes clean`). - `go build ./...` — clean. - `go test ./internal/...` — clean. Commit: https://mgit.msbls.de/m/paliad/commit/0e1f62e
mAi added the
done
label 2026-05-26 07:34:08 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: m/paliad#120
No description provided.