OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

team_members.php

8 KB
<?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">&#9998; Bearbeiten</a> '
        . '<a href="/admin/vault/teams" class="btn btn-secondary btn-sm">&larr; 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">&#128100;</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('&#9203; 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') ?>">&#128465;</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 &amp; 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>