From 8a56ebff2c20f339d81678d77297a7f4929b60c1 Mon Sep 17 00:00:00 2001 From: Disco DeDisco Date: Sun, 24 May 2026 17:05:14 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20swap=20UserAdmin's=20`unlocked=5Fdecks`?= =?UTF-8?q?=20+=20`buds`=20M2M=20widgets=20from=20`SelectMultiple`=20to=20?= =?UTF-8?q?`filter=5Fhorizontal`=20(dual-listbox).=20The=20default=20`Sele?= =?UTF-8?q?ctMultiple`=20widget=20renders=20ALL=20DeckVariant/User=20rows?= =?UTF-8?q?=20in=20a=20single=20listbox=20with=20only=20the=20currently-se?= =?UTF-8?q?lected=20ones=20blue-highlighted=20=E2=80=94=20visually=20indis?= =?UTF-8?q?tinguishable=20from=20"all=20of=20these=20are=20unlocked"=20if?= =?UTF-8?q?=20the=20reader=20doesn't=20notice=20the=20highlight=20state.?= =?UTF-8?q?=20This=20cost=20a=20half-hour=20staging=20bug=20investigation:?= =?UTF-8?q?=20Fiorentine=20Minchiate=20appeared=20in=20the=20listbox=20for?= =?UTF-8?q?=20admin=20`disco`=20and=20was=20read=20as=20"unlocked",=20but?= =?UTF-8?q?=20the=20Game=20Kit=20+=20Card=20Decks=20applets=20correctly=20?= =?UTF-8?q?rendered=20only=20Earthman=20because=20only=20Earthman=20was=20?= =?UTF-8?q?actually=20in=20`unlocked=5Fdecks`=20(Fiorentine=20was=20an=20*?= =?UTF-8?q?available=20option*,=20not=20a=20selected=20value).=20`filter?= =?UTF-8?q?=5Fhorizontal`=20splits=20into=20"Available"=20(left)=20+=20"Ch?= =?UTF-8?q?osen"=20(right)=20panes=20with=20explicit=20arrows=20between=20?= =?UTF-8?q?=E2=80=94=20selected=20vs=20available=20is=20unambiguous.=20Sam?= =?UTF-8?q?e=20trap=20applies=20to=20`buds`=20(also=20a=20bare=20M2M=20per?= =?UTF-8?q?=20[[project-deck-contribution-spec]]=20adjacent=20note),=20so?= =?UTF-8?q?=20fixing=20both.=20No=20model/template/test=20changes=20?= =?UTF-8?q?=E2=80=94=20just=20the=20admin=20widget.=20`UserAdminTest`=20on?= =?UTF-8?q?ly=20exercises=20the=20changelist=20(`/admin/lyric/user/`),=20n?= =?UTF-8?q?ot=20the=20change=20form,=20so=20no=20test=20impact?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- src/apps/lyric/admin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/lyric/admin.py b/src/apps/lyric/admin.py index 018bbff..0287ca2 100644 --- a/src/apps/lyric/admin.py +++ b/src/apps/lyric/admin.py @@ -7,6 +7,7 @@ from .models import LoginToken, Token, User class UserAdmin(admin.ModelAdmin): list_display = ["email"] search_fields = ["email"] + filter_horizontal = ["unlocked_decks", "buds"] class TokenAdminForm(forms.ModelForm):