Page sections, danger zone, callouts and form controls #618
Labels
No labels
bug
duplicate
enhancement
help wanted
high priority
invalid
L
low priority
M
medium priority
needs refinement
optional
question
S
security
technical improvement
UX Improvement
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
local-it/mitgliederverwaltung#618
Loading…
Add table
Add a link
Reference in a new issue
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?
Motivation
Pages frame their content in five different ways (one with a heavy shadow), ~12 Danger zones are copy-pasted, and some forms have none. Help appears in about nine visual styles, from solid alerts below AA contrast to palette boxes and explanations below tables. Save sits in four different places. Some settings save immediately through checkboxes next to fields that wait for “Save”. DESIGN_GUIDELINES §16 (sections), §17 (help ladder), §18 (form controls), §5.4 (Save placement) and §11 (detail layout) define the target.
Visible improvement
Calm, uniform pages: each section has its title, description and action together; hints are readable and look the same everywhere; it is obvious when a change takes effect.
Scope (ordered steps,
just ci-devgreen after each)If
/planfinds this too large for one run, split after step 4 into a sequence of two issues.<.section>(card header pattern: title, description,actions,toolbar,footer) and<.danger_zone>; replace<.form_section>and the privatesection_boxcopies.<.list>(today a<ul class="list">) is rebuilt as the two-column<dl>layout or a new component replaces the four detail layouts; migrate detail pages and the interim<dl>markup (DESIGN_GUIDELINES §11).ENV-managed settings (#540) show their values as
readonlyinputs styled like disabled (greyed surface, muted value still >= 4.5:1, no placeholder) with a source line below ("Environment variableVAR", "Missing – …"), by human decision instead of §22.1's read-only text: add this as an explicit exception to DESIGN_GUIDELINES §22.1 (values set in the server environment, shown inside an otherwise editable settings form) and keep the #540 component as the one implementation.Security fix carried along (open on
main, checked 2026-10-19): the member show page's mail links (lib/mv_web/live/member_live/show.ex, the header linkhref={"mailto:#{MemberHelpers.email_recipient(@member)}"}andmailto_link/1) put the recipient intomailto:without URL encoding.email_recipient/1quotes RFC 5322 specials only, not?or&, so a member name such asMax?bcc=x@example.orgadds headers (bcc=,subject=) to the mail the viewer composes. The #535 fix covers only the overview's bulk mail and copy. Fix while migrating the detail layout: percent-encode themailto:address part (as the overview's BCC already does); regression test with?,&,#and%in first and last name.Global settings after #540: each section is its own LiveComponent (
lib/mv_web/live/global_settings_live/*_section.ex); wrap each one in<.section>without merging them back. A section can mix ENV-managed (read-only) and editable fields — SMTP in ENV mode keeps the sender fields (MAIL_FROM_*, per field) editable: the footer Save appears only when the section has editable fields; a fully ENV-managed group has no Save.w-xl) and shadows in page content.<.callout>,<.collapsible>,helpon<.input>; migrate hints by the help ladder:<.callout>kind; remove the interim component so there is one callout;example.comhosts (SMTP, Vereinfacht API/app URL; NN/g: placeholders read as real values).<.input type="toggle">with a hook that resetscheckedwhen the handler pushes the stored value after an error (push_event; a re-render of an unchanged assign sends no diff, DESIGN_GUIDELINES §8.1); global settings checkboxes that save immediately become switches (toast + rollback; the flash #540 adds to "Allow direct registration" becomes this toast). The switch needs the two states #540 already has: set via environment variable (OIDC_ONLY: shown in its state, not toggleable, lock line below) and not switchable until OIDC is fully configured; the “Change password” checkbox becomes a disclosure through<.collapsible>(decide whether it renders<details>or a button witharia-expanded/aria-controlsinside forms; DESIGN_GUIDELINES §18.2).checkbox-primarytoday).Out of scope
Acceptance criteria
alert-*for hints, no palette colors, noshadow-*in page content (guard exceptions removed accordingly).ASSOCIATION_NAMEset), German locale.aria-describedby; callouts reach 4.5:1 (text) and 3:1 (icon); switches haverole="switch"and a toast on change; Danger zone only for authorized users.mailto:links are percent-encoded; a name containing?/&adds no header (regression test).just ci-devgreen after every step.Dependencies
<.section>,<.danger_zone>and the switch input.Anchors (verified against
main@d9093a1f, re-check before filing)lib/mv_web/live/membership_fee_settings_live.ex:114; raw primary checkbox::167lib/mv_web/live/import_live/components.ex:23lib/mv_web/live/user_live/form.ex:113,166,174,192,213; “Change password” checkbox::101lib/mv_web/live/global_settings_live/join_form_section.ex:48,auth_section.ex:51(registration),auth_section.ex:92(OIDC only)lib/mv_web/live/member_live/show/cycles_component.ex:223<.form_section>:lib/mv_web/components/core_components.ex:686Caution
ui-tagged browser test that the switch shows the stored value again after a failed save.