ADR-0042: Named selection lists for enum and list fields
Kontext
enum und list waren zwei Feldtypen mit eigenen config.options. Kardinalität steht jetzt getrennt (n oder 1–99). Nutzer erwarten: ein Wert aus einer Liste ist enum, mehrere Werte aus derselben Art Liste ist list. Die Werte selbst gehören in eine wiederverwendbare Auswahlliste, nicht in jedes Feld.
Entscheidung
- Produkt ist die Liste. Tabelle
selection_lists(code,label); Einträge inselection_list_entries(value= Key,label= Wert,sort_order). Der Key folgt derselben Serialisierung wie IDs (^[a-z][a-z0-9_]*$), ist pro Liste eindeutig und per Stift setzbar. Kein zweites Zentrum. enum= Kardinalität1.listohneitem_type: group= Kardinalitätnoder 2–99. Typ und Kardinalität gleichen sich beim Schreiben an.- Jedes solche Feld hat
field_definitions.list_code(FK,ON DELETE RESTRICT). Anlegen ohne Liste → 400. Verschachteltelist+group(Akteurszuweisung) bleibt ohne Liste. - UI: zuerst Kardinalität, dann Feldtyp, dann Auswahlliste (Dropdown, + / ✎ / ×).
config.optionskommt zur Laufzeit aus der Liste (Validierung, QGIS). - Bestehende
enum-Felder werden nach{kind_code}_{field_code}migriert.
| Gate | Recommendation | Why it fits here | Rejected alternative and why |
|---|---|---|---|
| Modell | eigene Listen-Tabelle | Wiederverwendbar, eine Pflege | Options nur in config JSON — Drift pro Feld |
| Typ | enum/list folgen der Kardinalität | Ein Bedienweg, keine doppelte Semantik | Zwei unabhängige Typen plus Kardinalität |
| Löschen | RESTRICT solange ein Feld bindet | Kein stilles Leeren von Masken | CASCADE — Felder ohne Werte |
Begründung (für dieses Setup)
Fachmodelle teilen Status-, Art- und Tag-Listen. Wenige Listen pro Organisation; Resolve-on-read in _field_dicts bleibt billig. Nested Groups bleiben das andere list-Modell (ADR-0039).
Verworfene Alternativen
| Alternative | Warum verworfen |
|---|---|
Options nur im Feld-config |
Keine Wiederverwendung, Dialog ohne Auswahlliste |
| Enum und List als getrennte Kataloge | Dieselbe Werteliste, nur die Anzahl unterscheidet |
Liste als Kind von entity_kinds |
Keine Records, kein GIS — anderes Produkt |
Folgen
- Alembic
0019_selection_lists/ Tenant0007_selection_lists. - API
GET/POST /selection-lists,GET/PUT/DELETE /selection-lists/{code};FieldDefinitionIn/Out.list_code. - Plugin bleibt apply-only; Formulare lesen
config.optionswie bisher.