Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
51 lines
2.1 KiB
HTML
51 lines
2.1 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}Admin — {{ g.name }}{% endblock %}
|
|
|
|
{% macro ucard(u) %}
|
|
<label class="ucard" data-search="{{ (u.username ~ ' ' ~ (u.name or '') ~ ' ' ~ (u.email or ''))|lower }}">
|
|
<input type="checkbox" name="members" value="{{ u.pk }}" {% if u.pk|string in g.users %}checked{% endif %}>
|
|
<span class="uini">{{ (u.username or '?')[0]|upper }}</span>
|
|
<span class="ubody">
|
|
<span class="uname">{{ u.name or u.username }}</span>
|
|
<span class="usub" title="{{ u.username }}{% if u.email %} · {{ u.email }}{% endif %}">{{ u.username }}{% if u.email %} · {{ u.email }}{% endif %}</span>
|
|
</span>
|
|
<span class="uchk">✓</span>
|
|
</label>
|
|
{% endmacro %}
|
|
|
|
{% block body %}
|
|
<p><a href="/admin/groups" class="muted">← Grupper</a></p>
|
|
<h1>{{ g.name }}</h1>
|
|
<p class="lead">Klik på brugerne der skal være medlem. Markerede er medlemmer.</p>
|
|
|
|
{% set people = users|rejectattr('type','in',['service_account','internal_service_account'])|list %}
|
|
{% set svcs = users|selectattr('type','in',['service_account','internal_service_account'])|list %}
|
|
|
|
<form method="post" action="/admin/groups/{{ g.pk }}">
|
|
<div class="filter" style="max-width:22rem">
|
|
<span class="mag">⌕</span>
|
|
<input id="ufilter" type="search" placeholder="Søg brugere…" autocomplete="off" aria-label="Søg brugere">
|
|
</div>
|
|
<div class="ucards" id="ucards">
|
|
{% for u in people %}{{ ucard(u) }}{% endfor %}
|
|
</div>
|
|
{% if svcs %}
|
|
<details style="margin-top:1.2rem">
|
|
<summary class="muted" style="cursor:pointer">Service-konti ({{ svcs|length }})</summary>
|
|
<div class="ucards">{% for u in svcs %}{{ ucard(u) }}{% endfor %}</div>
|
|
</details>
|
|
{% endif %}
|
|
<p style="margin-top:1.3rem"><button class="btn" type="submit">Gem medlemmer</button></p>
|
|
</form>
|
|
<script>
|
|
(function(){
|
|
var inp=document.getElementById('ufilter'); if(!inp) return;
|
|
var cards=[].slice.call(document.querySelectorAll('#ucards .ucard'));
|
|
inp.addEventListener('input',function(){
|
|
var q=inp.value.trim().toLowerCase();
|
|
cards.forEach(function(c){ c.classList.toggle('hidden', !!q && c.getAttribute('data-search').indexOf(q)<0); });
|
|
});
|
|
})();
|
|
</script>
|
|
{% endblock %}
|