Verfahrensablauf timeline: optional duration indicator on event cards (hover by default, toggle for always-on) #133
Open
opened 2026-05-26 13:32:16 +00:00 by mAi
·
1 comment
No Branch/Tag Specified
main
mai/planck/coder-b5-b6-train-share
mai/archimedes/fixer-port-engine
mai/maxwell/coder-b4-akte-mode
mai/lorenz/coder-b3-event-triggered
mai/euler/fixer-builder-add
mai/brunel/fixer-prod-500s-after-b1
mai/galileo/coder-b1-b2-mvp-train
mai/pasteur/fixer-pkg-litigationplann
mai/newton/coder-b0-scenario-db
mai/edison/inventor-prd-columnar
mai/knuth/coder-workflow-tracker
mai/atlas/inventor-extend-tools
mai/cronus/inventor-unified
mai/atlas/inventor-deadline-system
mai/atlas/inventor-followup-rules
mai/athena/consultant-deadline
mai/brunel/fixer-dark-mode-support
mai/knuth/coder-cronus-fristenrechn
mai/ritchie/coder-mig-153-proceeding
mai/atlas/inventor-proceeding
mai/cronus/inventor-fristenrechner
mai/curie/coder-mig152-clone-dedupe
mai/darwin/researcher-lexy-draft
mai/knuth/coder-dedupe-null
mai/cronus/coder-composer-slice-f
mai/cronus/coder-composer-slice-e
mai/cronus/coder-composer-slice-d
mai/curie/coder-slice-b6-url-rename
mai/curie/coder-slice-b5-go-rename
mai/cronus/coder-composer-slice-c
mai/curie/coder-slice-b4-destructive-drop
mai/cronus/coder-composer-slice-b
mai/cronus/coder-composer-slice-a
mai/cronus/inventor-prd-for
mai/knuth/coder-verfahrensablauf
mai/ritchie/coder-make-backup
mai/diesel/fixer-dark-mode-css
mai/curie/coder-slice-b3-read-cutover
mai/diesel/fixer-verfahrensablauf
mai/curie/coder-slice-b2-dual-write
mai/cronus/coder-slice-d-scenarios
mai/knuth/coder-backfill-applies
mai/hermes/gitster-verfahrensablauf
mai/cronus/coder-berufung-labels-refactor
mai/diesel/hotfix-2-mig-134-missing
mai/curie/coder-slice-b1-procedural-events
mai/cronus/coder-slice-c-upc-snapshot
mai/brunel/hotfix-rename-upc-apl
mai/cronus/coder-slice-b3-primary-party
mai/cronus/coder-slice-b2-catalog-query
mai/cronus/inventor-litigation-slice-b
mai/curie/researcher-slice-b-zero
mai/cronus/inventor-litigation
mai/artemis/gitster-remove-admin
mai/ritchie/coder-sort-post-trigger
mai/knuth/coder-conditional-label
mai/hermes/coder-verfahrensablauf
mai/brunel/rebase-121-conditional
mai/knuth/coder-conditional-rule
mai/hermes/gitster-dark-mode-fix
mai/ritchie/coder-submission-form
mai/artemis/gitster-re-surface
mai/brunel/fixer-views-any-filters
mai/cronus/coder-cicd-slice-a
mai/knuth/coder-wave-1-tier-1-rule
mai/ritchie/coder-upc-damages-add
mai/cronus/inventor-ci-cd-pre
mai/brunel/rebase-108-language
mai/hermes/gitster-admin-rules-list
mai/artemis/gitster-submission
mai/icarus/gitster-verfahrensablauf
mai/orpheus/gitster-search-input
mai/atlas/coder-event-card-choices-slice-ab
mai/hermes/gitster-date-range
mai/demeter/gitster-submission
mai/knuth/coder-hl-patents-style
mai/hermes/gitster-draft-editor
mai/atlas/inventor-per-event-card
mai/knuth/coder-deadline-rule-tier
mai/cronus/coder-procedural-events-slice-a
mai/hermes/gitster-deadline-form
mai/artemis/gitster-add-missing-i18n
mai/demeter/gitster-paliadin-chat
mai/brunel/wave0-tier0-deadline-fixes
mai/artemis/coder-docker-compose-yml
mai/icarus/coder-inbox-overhaul-slice-a
mai/atlas/coder-date-range-picker-slice-a
mai/brunel/fixer-de-inf-lg-cfi
mai/cronus/inventor-procedural
mai/hermes/gitster-event-type-modal
mai/cronus/coder-backup-mode
mai/curie/researcher-bulletproof
mai/hermes/gitster-draft-editor-focus-jump
mai/cronus/inventor-backup-mode
mai/hermes/gitster-submissions
mai/artemis/gitster-deadline-form
mai/brunel/fixer-submission-preview
mai/brunel/fixer-test-data-reset
mai/artemis/gitster-approval-withdraw
mai/demeter/gitster-events
mai/hermes/gitster-sidebar-loses
mai/hermes/gitster-browse-a
mai/brunel/fixer-submissions-demo
mai/icarus/inventor-inbox-overhaul
mai/atlas/inventor-symmetric-date
mai/artemis/gitster-demote-daten
mai/hermes/gitster-team-view-mailto
mai/knuth/coder-global-schriftsatze
mai/knuth/coder-schriftsatze
mai/ritchie/coder-author-demo-docx
mai/knuth/coder-add-schriftsatze
mai/knuth/coder-add-checklist
mai/knuth/coder-anchor-lookup-must
mai/tesla/dashboard-resize-clamp
mai/knuth/coder-demote-projekt
mai/knuth/coder-paliadin-chat
mai/knuth/coder-print-views
mai/knuth/coder-add-proceeding
mai/knuth/coder-submission
mai/ritchie/coder-extend-team-email
mai/knuth/coder-changelog-catch-up
mai/tesla/dashboard-overlap
mai/pasteur/fixercoder-dashboard
mai/newton/inventor-configurable
mai/dirac/inventorcoder-user
mai/gauss/inventorcoder-team-admin
mai/kepler/inventorcoder-project
mai/darwin/roadmap-ccr-en
mai/euler/coder-small-ux-polish
mai/darwin/fristenrechner-cleanup
mai/darwin/fixercoder-priority-bug
mai/leibniz/inventor-caldav-multi
mai/hertz/inventor-unified-modal
mai/archimedes/inventor-excel-data
mai/boltzmann/inventor-gap-tolerant
mai/copernicus/submission-slice-1
mai/fermi/interactive-session
mai/hertz/inventor-suggest-changes
mai/copernicus/inventor-submission
mai/mendel/test-strategy-slice-1
mai/mendel/inventor-test-strategy
mai/ampere/custom-views-improvements
mai/joule/mig-097-apply-huygens-s
mai/ohm/workstream-b-rename
mai/huygens/workstream-a-backfill
mai/kelvin/t-204-phase-2-proceeding
mai/bohr/ingest-t-paliad-203-rule
mai/curie/fristenrechner-gap
mai/maxwell/inbox-grey-out
mai/rutherford/slice-9-follow-up-b-re
mai/dirac/slice-9-follow-up-a
mai/bose/determinator-cascade-slice-3
mai/bose/determinator-cascade-slice-2
mai/bose/determinator-row-cascade
mai/lorenz/fristen-phase-3-slice-9
mai/curie/fristen-phase-3-slice-12
mai/planck/aichat-phase-b-paliad
mai/young/fristen-phase-3-slice-11b
mai/lorenz/fristen-phase-3-slice-11a
mai/lorenz/fristen-phase-3-slice-10
mai/lorenz/fristen-phase-3-slice-8
mai/lorenz/fristen-phase-3-slice-7
mai/lorenz/fristen-phase-3-slice-6
mai/lorenz/fristen-phase-3-slice-5
mai/lorenz/fristen-phase-3-slice-4
mai/lorenz/fristen-phase-3-slice-3
mai/lorenz/fristen-phase-3-slice-2
mai/lorenz/fristen-phase-3-slice-1
mai/pauli/fristen-phase2-design
mai/tesla/project-timeline-chart
mai/pauli/fristen-logic-audit
mai/pauli/determinator-b1-row-by
mai/noether/tools-cleanup-slice-1
mai/kelvin/inventor-tools-surface
mai/planck/paliadin-per-user-rls
mai/maxwell/bug-bundle-filterbar
mai/faraday/project-timeline-chart
mai/schroedinger/smarttimeline-slice-4
mai/bohr/smarttimeline-slice-3
mai/gauss/smarttimeline-slice-2
mai/riemann/filterbar-phase-2-slice
mai/lagrange/smarttimeline-design-the
mai/curie/researcher-determinator
mai/noether/collapse-regel-typ-on
mai/riemann/inventor-universal
mai/minkowski/project-level-our-side
mai/dirac/inventor-inline-paliadin
mai/feynman/fristenrechner
mai/minkowski/navbar-dashboard-reorg
mai/shannon/approval-rework
mai/einstein/consultant-deadline-data
mai/curie/researcher-upc-rop-audit
mai/noether/paliadin-real-claude
mai/noether/inventor-paliadin
mai/hilbert/inventor-approval-policy
mai/shannon/bug-frist-due-date
mai/fritz/bug-fristen-termine
mai/godel/inventor-projects-page
mai/fritz/bug-paliadin-chat
mai/kepler/inventor-profession-vs
mai/noether/inventor-paliadin-in-app
mai/fritz/bulk-team-email-send-to
mai/noether/inventor-local-chat-for
mai/noether/inventor-data-display
mai/fritz/bug-derived-team-members
mai/fritz/bug-sidebar-visibly
mai/noether/inventor-project
mai/shannon/bug-project-team-add
mai/cronus/inventor-dual-control
mai/fritz/bug-edit-mode-on
mai/cronus/inventor-holidays-per
mai/ritchie/phase-h-ai-deadline
No results found.
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: m/paliad#133
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking 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?
Gap
Fristenrechner (
/tools/fristenrechner) already renders each rule's duration:in
frontend/src/client/fristenrechner.ts:990and:1663. The Verfahrensablauf timeline (/tools/verfahrensablauf) doesn't —frontend/src/client/views/verfahrensablauf-core.tshas zerodurationreferences. Lawyers can't see why a deadline lands when it does without flipping to Fristenrechner.Design
Two modes, both opt-in:
title="2 Monate ab Zustellung"is the cheapest; a proper styled popover would be nicer but the hover-titleis a defensible v1.paliad.fristen.notes-showlocalStorage flag inverfahrensablauf.ts:F8) that renders the duration inline on every card —"2 Mo. ab Zustellung"next to the date.Duration values are already on the payload returned from
/api/fristenrechner/calculate— they live on eachDeadlinerow asdurationValue+durationUnit+timing(the same fields Fristenrechner consumes). No backend change needed; just plumb them through to the timeline renderer.Acceptance
"<n> <unit> <timing>"as a tooltip (DE + EN labels via existing i18n).Dauern anzeigen/Show durationsnext to the existingNotizen anzeigentoggle. Click → all cards render the duration inline. Preference persists via localStorage keypaliad.verfahrensablauf.durations-show.durationValue > 0.bun run build+go testclean.Files
frontend/src/client/views/verfahrensablauf-core.ts— event-card rendering (find where dates render, attachtitle=or new inline span).frontend/src/client/verfahrensablauf.ts— adddurations-showlocalStorage helpers next to the existingnotes-showones (look forpaliad.fristen.notes-show).frontend/src/verfahrensablauf.tsx— add the toggle button next to the existing notes toggle (search fornotes-toggleor similar).frontend/src/client/i18n.ts+i18n-keys.ts— DE + EN strings for the toggle label, the duration formatter labels (reuse Fristenrechner'sunitLabel+timingLabelhelpers if exported, else copy them).Scope guardrails
unitLabel+timingLabel(Mo./Tage/Wo./Werktage + ab/vor) — don't re-invent.Implemented on
mai/hermes/gitster-verfahrensablauf— commit 3097df3.What landed
Default (hover) — each event card's date span carries a
title=attribute with the rule's duration, e.g.2 Monate nach/2 months after. Court-set and zero-duration rules (trigger event, hearings) get no tooltip.Toggle (inline) — new header toggle
Dauern anzeigen/Show durationsnext to the existingHinweise anzeigentoggle. Click → every card renders the duration inline in the meta row alongside the rule reference. Preference persists vialocalStoragekeypaliad.verfahrensablauf.durations-show. Default off.i18n —
deadlines.durations.show(DE:Dauern anzeigen, EN:Show durations). Duration string itself reuses the existingdeadlines.event.unit.<unit>.{one,many}+deadlines.event.timing.{before,after}keys (the same ones Fristenrechner's event-mode renderer consumes), so we have one source of truth for unit/timing translations.Scope deviation: one additive backend field set
The issue scoped this as pure-frontend on the assumption that the duration fields were already on the
/api/tools/fristenrechnerpayload ("they live on each Deadline row asdurationValue+durationUnit+timing"). They were not —lp.TimelineEntrypreviously exposed only the computeddueDate, not the rule's(duration_value, duration_unit, timing)tuple. Those fields exist on theRulerow, onEventDeadlineResult(Fristenrechner event mode), and onRuleCalculationRule(single-rule click flow), but not on the proceeding-timeline wire that backs both Fristenrechner's procedure mode and/tools/verfahrensablauf.Resolution: added three additive optional fields to
TimelineEntry(durationValue,durationUnit,timing) and populated them in both engine emission sites (CalculateandCalculateByTriggerEvent) directly from the rule row. No DB migration, no new endpoint, no change to the API path. The values reflect the base rule fields rather than the post-alt-swap arithmetic — the tooltip reads as a property of the rule ("this rule's interval is 2 months after the anchor") rather than a recap of whichwith_ccr-style branch fired.If strict no-backend was a hard guardrail, flagging here so it can be reverted before merge — but the alternative was leaving the data unreachable on the frontend, and the change is purely additive (zero-value fields are omitted on the wire, so it can't regress any existing consumer).
Acceptance check
<n> <unit> <timing>(DE + EN via existing i18n).Dauern anzeigen/Show durations; click → inline labels; persists vialocalStorage["paliad.verfahrensablauf.durations-show"].formatDurationLabelshort-circuits whendurationValue <= 0.bun run buildclean;go test ./pkg/litigationplanner/... ./internal/...clean;bun test src/client/viewsclean (89/89).TimelineEntry, no API-path change. See the deviation note above.Files touched
pkg/litigationplanner/types.go— three fields onTimelineEntry.pkg/litigationplanner/engine.go— populate at both emission sites.frontend/src/client/views/verfahrensablauf-core.ts—formatDurationLabel,CardOpts.showDurations,ColumnsBodyOpts.showDurations, tooltip on date span, inline span in meta row.frontend/src/client/verfahrensablauf.ts—paliad.verfahrensablauf.durations-showlocalStorage, toggle handler, plumbshowDurationsinto both renderers.frontend/src/verfahrensablauf.tsx— toggle UI next to the existing notes toggle.frontend/src/client/i18n.ts+frontend/src/i18n-keys.ts— DE/ENdeadlines.durations.show.frontend/src/styles/global.css—.timeline-durationrule.Ready for review.