Quelltext des aktuellen Standes
<?php $this->layout('layouts/admin', [
'page_title' => $team['name'] . ' – Mitglieder',
'current_admin_page' => 'vault-teams',
'page_actions' =>
'<a href="/admin/vault/teams/' . $team['id'] . '/export" class="btn btn-success btn-sm" title="Alle Passwörter als CSV exportieren (inkl. TOTP)">'
. '<i class="fas fa-file-csv"></i> CSV Export'
. '</a> '
. '<a href="/admin/vault/teams/' . $team['id'] . '/edit" class="btn btn-secondary btn-sm">✎ Bearbeiten</a> '
. '<a href="/admin/vault/teams" class="btn btn-secondary btn-sm">← Alle Teams</a>',
]); ?>
<style>
.vault-members-page .vault-members-grid {
display: grid;
grid-template-columns: 1fr 320px;
gap: 1rem;
margin-bottom: 1.5rem;
}
.vault-members-page .vault-members-grid > * { min-width: 0; }
@media (max-width: 900px) {
.vault-members-page .vault-members-grid {
grid-template-columns: 1fr;
}
}
</style>
<div class="vault-members-page">
<div class="detail-section full-width" style="margin-bottom:1.25rem;display:flex;align-items:center;gap:0.6rem;">
<i class="fas fa-lock" style="color:var(--color-primary);"></i>
<span><?= $this->t('Neue Mitglieder erhalten beim nächsten Login automatisch Zugriff auf den Team-Tresor. Mitglieder mit ausstehendem Schlüssel werden mit <strong>Ausstehend</strong> markiert.') ?></span>
</div>
<div class="vault-members-grid">
<!-- Mitglieder-Liste -->
<section class="detail-section">
<h2>
<?= $this->te('Aktuelle Mitglieder') ?>
<span class="badge badge-secondary" style="font-size:0.75rem;font-weight:600;vertical-align:middle;margin-left:0.4rem;"><?= count($members) ?></span>
</h2>
<?php if (empty($members)): ?>
<div class="empty-state">
<div class="empty-icon">👤</div>
<h2><?= $this->te('Noch keine Mitglieder') ?></h2>
<p><?= $this->te('Füge unten Benutzer zu diesem Team-Tresor hinzu.') ?></p>
</div>
<?php else: ?>
<div class="table-wrapper">
<table class="data-table">
<thead>
<tr>
<th scope="col"><?= $this->te('Benutzer') ?></th>
<th scope="col"><?= $this->te('Rolle') ?></th>
<th scope="col"><?= $this->te('Status') ?></th>
<th scope="col" class="actions-col"></th>
</tr>
</thead>
<tbody>
<?php foreach ($members as $member): ?>
<tr>
<td>
<div class="user-cell">
<div class="user-avatar">
<?= strtoupper(substr($member['display_name'], 0, 1)) ?>
</div>
<div class="user-info">
<span class="user-name"><?= $this->e($member['display_name']) ?></span>
<span class="text-muted" style="font-size:0.78rem;"><?= $this->e($member['email']) ?></span>
</div>
</div>
</td>
<td>
<?php if ($member['role'] === 'admin'): ?>
<span class="badge badge-admin"><?= $this->te('Admin') ?></span>
<?php elseif ($member['role'] === 'viewer'): ?>
<span class="badge badge-info"><?= $this->te('Betrachter') ?></span>
<?php else: ?>
<span class="badge badge-secondary"><?= $this->te('Mitglied') ?></span>
<?php endif; ?>
</td>
<td>
<?php if (!(bool)$member['tvk_ready']): ?>
<span class="badge badge-warning" title="<?= $this->te('Schlüssel wird beim nächsten Login provisioniert') ?>"><?= $this->te('⏳ Ausstehend') ?></span>
<?php else: ?>
<span class="badge badge-success"><?= $this->te('Aktiv') ?></span>
<?php endif; ?>
</td>
<td class="actions-col">
<div class="action-buttons">
<form method="POST" action="/admin/vault/teams/<?= $team['id'] ?>/members/remove"
onsubmit="return confirm('<?= $this->e(addslashes($member['display_name'])) ?> wirklich aus dem Team entfernen?')"
style="margin:0;">
<input type="hidden" name="_csrf" value="<?= $this->csrf() ?>">
<input type="hidden" name="user_id" value="<?= $member['user_id'] ?>">
<button type="submit" class="btn btn-sm btn-icon btn-danger" title="<?= $this->te('Entfernen') ?>" aria-label="<?= $this->te('Mitglied entfernen') ?>">🗑</button>
</form>
</div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
</section>
<!-- Mitglied hinzufügen -->
<aside class="detail-section">
<h2><?= $this->te('Mitglied hinzufügen') ?></h2>
<?php if (!empty($non_members)): ?>
<form method="POST" action="/admin/vault/teams/<?= $team['id'] ?>/members/add">
<input type="hidden" name="_csrf" value="<?= $this->csrf() ?>">
<div class="form-group">
<label for="add_user_id"><?= $this->te('Benutzer') ?></label>
<select id="add_user_id" name="user_id" class="form-control" required>
<option value=""><?= $this->te('Benutzer auswählen…') ?></option>
<?php foreach ($non_members as $user): ?>
<option value="<?= $user['id'] ?>">
<?= $this->e($user['display_name']) ?> (<?= $this->e($user['email']) ?>)
</option>
<?php endforeach; ?>
</select>
</div>
<div class="form-group">
<label for="add_role"><?= $this->te('Rolle') ?></label>
<select id="add_role" name="role" class="form-control">
<option value="member"><?= $this->te('Mitglied (Lesen & Schreiben)') ?></option>
<option value="viewer"><?= $this->te('Betrachter (nur Lesen)') ?></option>
<option value="admin"><?= $this->te('Admin') ?></option>
</select>
</div>
<button type="submit" class="btn btn-primary">
<i class="fas fa-plus"></i> <?= $this->te('Hinzufügen') ?>
</button>
</form>
<?php else: ?>
<p class="text-muted"><?= $this->te('Alle Benutzer sind bereits Mitglieder dieses Teams.') ?></p>
<?php endif; ?>
</aside>
</div>
</div>