From 19386698b5d4acfdbb3ebeb51aaf0524f882b760 Mon Sep 17 00:00:00 2001 From: Asger Geel Weirsoee Date: Thu, 11 Jun 2026 21:35:00 +0200 Subject: [PATCH] admin: kort-visning af brugere m. type-filter (skjul service-konti) + kort-baseret gruppe-medlemskab Co-Authored-By: Claude Opus 4.8 (1M context) --- templates/admin_group_edit.html | 47 +++++++++++++-- templates/admin_users.html | 104 +++++++++++++++++++++++--------- templates/base.html | 17 ++++++ 3 files changed, 132 insertions(+), 36 deletions(-) diff --git a/templates/admin_group_edit.html b/templates/admin_group_edit.html index 22b63b5..02bfc27 100644 --- a/templates/admin_group_edit.html +++ b/templates/admin_group_edit.html @@ -1,15 +1,50 @@ {% extends "base.html" %} {% block title %}Admin — {{ g.name }}{% endblock %} + +{% macro ucard(u) %} + +{% endmacro %} + {% block body %}

← Grupper

{{ g.name }}

-

Sæt flueben ved de brugere der skal være medlem af gruppen.

+

Klik på brugerne der skal være medlem. Markerede er medlemmer.

+ +{% set people = users|rejectattr('type','in',['service_account','internal_service_account'])|list %} +{% set svcs = users|selectattr('type','in',['service_account','internal_service_account'])|list %} +
-
- {% for u in users %} - - {% endfor %} +
+ ⌕ +
-

+
+ {% for u in people %}{{ ucard(u) }}{% endfor %} +
+ {% if svcs %} +
+ Service-konti ({{ svcs|length }}) +
{% for u in svcs %}{{ ucard(u) }}{% endfor %}
+
+ {% endif %} +

+ {% endblock %} diff --git a/templates/admin_users.html b/templates/admin_users.html index 2ff66fd..044a649 100644 --- a/templates/admin_users.html +++ b/templates/admin_users.html @@ -2,39 +2,83 @@ {% block title %}Admin — brugere{% endblock %} {% block body %}

Brugere

-

Opret og administrér brugere. Adgang til services styres via grupper (en app er bundet til en gruppe).

+

Opret og administrér brugere. Adgang til services styres via grupper.

{% if saved %}
{{ saved }}
{% endif %} -

Opret ny bruger

-
-
- - - - -
-

Adgang (grupper) — sæt flueben for de services brugeren skal kunne tilgå:

-
- {% for g in groups %} - - {% endfor %} -
-

-
+
+ + Opret ny bruger +
+
+ + + + +
+

Adgang (grupper) — sæt flueben for de services brugeren skal kunne tilgå:

+
+ {% for grp in groups %} + + {% endfor %} +
+

+
+
-

Alle brugere ({{ users|length }})

- - - +
+
⌕ +
+
+ + + +
+
+ +
{% for u in users %} -
- - - - - - + {% set svc = u.type in ['service_account','internal_service_account'] %} + + {{ (u.username or '?')[0]|upper }} + + {{ u.name or u.username }} + {{ u.username }}{% if u.group_names %} · {{ u.group_names|length }} grupper{% endif %}{% if not u.active %} · inaktiv{% endif %} + + → + {% endfor %} - -
BrugerEmailGrupperStatus
{{ u.username }}{% if u.name %} · {{ u.name }}{% endif %}{{ u.email or '—' }}{{ u.group_names|join(', ') if u.group_names else '—' }}{% if u.active %}aktiv{% else %}inaktiv{% endif %}Rediger →
+
+ + + + {% endblock %} diff --git a/templates/base.html b/templates/base.html index bc622fd..ee9bca7 100644 --- a/templates/base.html +++ b/templates/base.html @@ -113,6 +113,23 @@ code { background:var(--surface2); padding:.12em .42em; border-radius:.35rem; font-size:.85em; } .stat { background:color-mix(in srgb, var(--surface) 70%, transparent); border:1px solid var(--border); border-radius:1rem; padding:1.3rem; } .stat .n { font-size:2.1rem; font-weight:800; letter-spacing:-.02em; } + /* bruger-kort (medlemskab/tildeling) — fixed bredde + afkortning, intet overlap */ + .ucards { display:grid; gap:.55rem; grid-template-columns:repeat(auto-fill,minmax(15rem,1fr)); margin-top:.6rem; } + .ucard { position:relative; display:flex; align-items:center; gap:.6rem; padding:.55rem .7rem; border:1px solid var(--border); + border-radius:.8rem; background:color-mix(in srgb,var(--surface) 70%,transparent); cursor:pointer; min-width:0; + transition:border-color .15s, background .15s; } + .ucard:hover { border-color:var(--accent); } + .ucard input { position:absolute; opacity:0; pointer-events:none; } + .ucard:has(input:checked) { border-color:var(--accent); background:color-mix(in srgb,var(--accent) 12%,transparent); } + .ucard .uini { flex:0 0 auto; width:1.9rem; height:1.9rem; border-radius:.5rem; display:grid; place-items:center; + font-weight:700; font-size:.85rem; background:color-mix(in srgb,var(--accent) 16%,transparent); color:var(--accent); } + .ucard .ubody { min-width:0; flex:1; } + .ucard .uname { font-weight:600; font-size:.9rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } + .ucard .usub { color:var(--muted); font-size:.78rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } + .ucard .uchk { flex:0 0 auto; width:1.25rem; height:1.25rem; border:1.5px solid var(--border); border-radius:.35rem; + display:grid; place-items:center; color:transparent; font-size:.8rem; font-weight:700; } + .ucard:has(input:checked) .uchk { background:var(--accent); border-color:var(--accent); color:#06101f; } + .ucard.hidden { display:none; } /* footer */ .foot { width:100%; max-width:960px; margin:0 auto; padding:1.6rem 1.25rem 2.5rem; color:var(--muted); font-size:.85rem; border-top:1px solid var(--border); } .foot a { color:var(--accent); text-decoration:none; }