43 lines
2.9 KiB
Plaintext
43 lines
2.9 KiB
Plaintext
<%#
|
|
Admin group membership body (todo §5), captured into the shell content slot. Config:
|
|
group { name }
|
|
members { action, rows: { kind:"group"|"user", label, subject }[] } action = remove-member endpoint
|
|
add { action, options: {label,value}[] } action = add-member endpoint
|
|
del { action } delete the whole group
|
|
csrfToken, error?
|
|
%><%
|
|
const group = locals.group;
|
|
const members = locals.members;
|
|
const add = locals.add;
|
|
const del = locals.del;
|
|
const csrf = locals.csrfToken;
|
|
-%>
|
|
<div class="form-page">
|
|
<% if (locals.error) { -%>
|
|
<%- include("alert", { text: locals.error, tone: "neg" }) %>
|
|
<% } -%>
|
|
<section class="form-card" aria-labelledby="members-h">
|
|
<h2 class="card-title" id="members-h">Members</h2>
|
|
<% if (members.rows.length) { -%>
|
|
<div class="table-wrap"><table class="table"><caption class="sr-only">Members of <%= group.name %></caption><thead><tr><th scope="col">Member</th><th scope="col">Type</th><th class="col-actions" scope="col"><span class="sr-only">Actions</span></th></tr></thead><tbody>
|
|
<% members.rows.forEach((m) => { -%>
|
|
<tr><th scope="row"><span class="cell-strong"><%= m.label %></span></th><td><span class="badge info"><span class="dot"></span><%= m.kind === "group" ? "Group" : "User" %></span></td><td class="col-actions"><form method="post" action="<%= members.action %>"><input type="hidden" name="_csrf" value="<%= csrf %>"><input type="hidden" name="member" value="<%= m.subject %>"><button class="btn" type="submit"><svg class="ico ico-sm" aria-hidden="true"><use href="#i-x"/></svg>Remove</button></form></td></tr>
|
|
<% }) -%>
|
|
</tbody></table></div>
|
|
<% } else { -%>
|
|
<p class="cell-muted">No members yet.</p>
|
|
<% } -%>
|
|
</section>
|
|
<section class="form-card" aria-labelledby="add-h">
|
|
<h2 class="card-title" id="add-h">Add a member</h2>
|
|
<% if (add.options.length) { -%>
|
|
<form class="inline-form" method="post" action="<%= add.action %>"><input type="hidden" name="_csrf" value="<%= csrf %>"><label class="sr-only" for="add-member">Member</label><span class="select"><select id="add-member" name="member" required><option value="" disabled selected>Choose a user or group…</option><% add.options.forEach((o) => { %><option value="<%= o.value %>"><%= o.label %></option><% }) %></select></span><button class="btn btn-primary" type="submit"><svg class="ico ico-sm" aria-hidden="true"><use href="#i-plus"/></svg>Add</button></form>
|
|
<% } else { -%>
|
|
<p class="cell-muted">All users and groups are already members.</p>
|
|
<% } -%>
|
|
</section>
|
|
<section class="form-card admin-actions" aria-label="Group actions">
|
|
<form method="post" action="<%= del.action %>"><input type="hidden" name="_csrf" value="<%= csrf %>"><button class="btn btn-danger" type="submit"><svg class="ico ico-sm" aria-hidden="true"><use href="#i-trash"/></svg>Delete group</button></form>
|
|
</section>
|
|
</div>
|