diff options
| author | Jan-Hendrik Willms <tleilax+studip@gmail.com> | 2025-10-14 16:43:26 +0200 |
|---|---|---|
| committer | Jan-Hendrik Willms <tleilax+studip@gmail.com> | 2025-10-14 16:43:26 +0200 |
| commit | bbb0d83322ccd88cdb9f9501f06b9518dbafa7a2 (patch) | |
| tree | f69e14451fcc3e9238f160a952e4ee3a849a1d16 | |
| parent | f65843128420a4da2ebbaf1f5a8958bfac97166e (diff) | |
sort admin user table via js and not via php, fixes #5945
Closes #5945
Merge request studip/studip!4543
| -rw-r--r-- | app/controllers/admin/user.php | 11 | ||||
| -rw-r--r-- | app/views/admin/user/_results.php | 371 |
2 files changed, 177 insertions, 205 deletions
diff --git a/app/controllers/admin/user.php b/app/controllers/admin/user.php index f461f8b..2a29ea7 100644 --- a/app/controllers/admin/user.php +++ b/app/controllers/admin/user.php @@ -116,16 +116,7 @@ class Admin_UserController extends AuthenticatedController //wenn suche durchgeführt if (!empty($request)) { //Suchparameter - $this->sortby = Request::option('sortby', 'username'); - $this->order = Request::option('order', 'asc'); - if (Request::int('toggle')) { - $this->order = $this->order == 'desc' ? 'asc' : 'desc'; - } - - $request['sortby'] = $this->sortby; - $request['order'] = $this->order; - - $empty_search = $request['perm'] === 'alle'; + $empty_search = $request['perm'] === 'alle'; $values = [ 'username', diff --git a/app/views/admin/user/_results.php b/app/views/admin/user/_results.php index 6fe0ad0..3ea545b 100644 --- a/app/views/admin/user/_results.php +++ b/app/views/admin/user/_results.php @@ -1,7 +1,7 @@ <?php /** * @var Admin_UserController $controller - * @var array $users + * @var User[] $users * @var string $sortby * @var string $order */ @@ -10,240 +10,221 @@ <form action="<?= $controller->link_for('admin/user/bulk') ?>" method="post" data-dialog="size=auto" class="default"> <?= CSRFProtection::tokenTag() ?> - <table class="default"> + <table class="default sortable-table" data-sortlist="[[0, 0]]"> <caption> <?= sprintf(_('Suchergebnis: es wurden %s Personen gefunden'), count($users)) ?> </caption> <thead> - <tr class="sortable"> - <th colspan="2" <?= $sortby === 'username' ? 'class="sort' . $order . '"' : '' ?>> - <a href="<?= $controller->link_for('admin/user', ['sortby' => 'username', 'order' => $order, 'toggle' => $sortby === 'username']) ?>"> - <?= _('Benutzername') ?> - </a> + <tr> + <th colspan="2" data-sort="text"> + <?= _('Benutzername') ?> </th> <th> </th> - <th <?= $sortby === 'matriculation_number' ? 'class="sort' . $order . '"' : '' ?>> - <a href="<?= $controller->link_for('admin/user', ['sortby' => 'matriculation_number', 'order' => $order, 'toggle' => $sortby === 'matriculation_number']) ?>"> - <?= _('Matrikelnummer') ?> - </a> + <th data-sort="text"> + <?= _('Matrikelnummer') ?> </th> - <th <?= $sortby === 'perms' ? 'class="sort' . $order . '"' : '' ?>> - <a href="<?= $controller->link_for('admin/user',['sortby' =>'perms', 'order'=> $order ,'toggle' => $sortby === 'perms']) ?>"> - <?= _('Status') ?> - </a> + <th data-sort="text"> + <?= _('Status') ?> </th> - <th <?= $sortby === 'Vorname' ? 'class="sort' . $order . '"' : '' ?>> - <a href="<?= $controller->link_for('admin/user', ['sortby' => 'Vorname', 'order' => $order, 'toggle' => $sortby === 'Vorname']) ?>"> - <?= _('Vorname') ?> - </a> + <th data-sort="text"> + <?= _('Vorname') ?> </th> - <th <?= $sortby === 'Nachname' ? 'class="sort' . $order . '"' : '' ?>> - <a href="<?= $controller->link_for('admin/user', ['sortby' => 'Nachname' , 'order' => $order, 'toggle' => $sortby === 'Nachname']) ?>"> - <?= _('Nachname') ?> - </a> + <th data-sort="text"> + <?= _('Nachname') ?> </th> - <th <?= $sortby === 'Email' ? 'class="sort' . $order . '"' : '' ?>> - <a href="<?= $controller->link_for('admin/user', ['sortby' => 'Email', 'order' => $order, 'toggle' => $sortby === 'Email']) ?>"> - <?= _('E-Mail') ?> - </a> + <th data-sort="text"> + <?= _('E-Mail') ?> </th> - <th <?= $sortby === 'changed' ? 'class="sort' . $order . '"' : '' ?>> - <a href="<?= $controller->link_for('admin/user', ['sortby' => 'changed', 'order' => $order, 'toggle' => $sortby === 'changed']) ?>"> - <?= _('inaktiv') ?> - </a> + <th data-sort="htmldata"> + <?= _('inaktiv') ?> </th> - <th <?= $sortby === 'mkdate' ? 'class="sort' . $order . '"' : '' ?>> - <a href="<?= $controller->link_for('admin/user', ['sortby' => 'mkdate', 'order' => $order , 'toggle' => $sortby === 'mkdate']) ?>"> - <?= _('registriert seit') ?> - </a> + <th data-sort="htmldate"> + <?= _('registriert seit') ?> </th> - <th colspan="2" <?= $sortby === 'auth_plugin' ? 'class="sort' . $order . '"' : '' ?>> - <a href="<?= $controller->link_for('admin/user', ['sortby'=> 'auth_plugin', 'order' => $order ,'toggle' => $sortby === 'auth_plugin']) ?>"> - <?= _('Authentifizierung') ?> - </a> + <th data-sort="text"> + <?= _('Authentifizierung') ?> </th> + <th></th> </tr> </thead> - <tbody> - <? foreach ($users as $user) : ?> - <tr> - <td style="white-space:nowrap;"> - <input class="check_all" type="checkbox" name="user_ids[]" value="<?= htmlReady($user->id) ?>"> - <a href="<?= $controller->link_for("admin/user/edit/{$user->id}") ?>" - title="<?= _('Nutzer bearbeiten') ?>"> - <?= Avatar::getAvatar($user->id)->getImageTag(Avatar::SMALL) ?> - </a> - </td> - <td> - <a href="<?= $controller->link_for("admin/user/edit/{$user->id}") ?>" - title="<?= _('Nutzer bearbeiten') ?>"> - <?= htmlReady($user->username) ?> - </a> - <? if ($user->locked) : ?> - <?= Icon::create('lock-locked', Icon::ROLE_INFO)->asSvg(tooltip2(sprintf(_('%s ist gesperrt'), htmlReady($user->getFullName())))) ?> - <? endif ?> - </td> - <td> - <? - $userdomains = UserDomain::getUserDomainsForUser($user->user_id); - $tooltxt = _('Sichtbarkeit:') . ' ' . $user->visible; - if (!empty($userdomains)) { - $domains = []; - array_walk($userdomains, function ($a) use (&$domains) { - if (!in_array($a->name, $domains)) { - $domains[] = $a->name; - } - }); - $tooltxt .= "\n" . _('Domänen:') . ' ' . implode(', ', $domains); - } - if ($user->locked == '1') { - $tooltxt .= "\n" . _("Nutzer ist gesperrt!"); - } - ?> - <?= tooltipHtmlIcon(htmlReady($tooltxt, true, true)) ?> - </td> - <td><?= htmlReady($user->matriculation_number) ?></td> - <td><?= $user['perms'] ?></td> - <td><?= htmlReady($user->Vorname) ?></td> - <td><?= htmlReady($user->nachname) ?></td> - <td><?= htmlReady($user->email) ?></td> - <td> - <? if (!empty($user->online->last_lifesign)) : - $inactive = time() - $user->online->last_lifesign; - if ($inactive < 3600 * 24) { - $inactive = gmdate('H:i:s', $inactive); - } else { - $inactive = floor($inactive / (3600 * 24)) . ' ' . _('Tage'); - } - else : - $inactive = _('nie benutzt'); - endif ?> - <?= $inactive ?> - </td> - <td> - <?= $user->mkdate ? strftime('%x', $user->mkdate) : _('unbekannt') ?> - </td> - <td><?= htmlReady($user['auth_plugin'] === null ? _('vorläufig') : $user->auth_plugin) ?></td> - <td class="actions" nowrap> + <? foreach ($users as $user) : ?> + <tr> + <td style="white-space:nowrap;"> + <input class="check_all" type="checkbox" name="user_ids[]" value="<?= htmlReady($user->id) ?>"> + <a href="<?= $controller->link_for("admin/user/edit/{$user->id}") ?>" + title="<?= _('Nutzer bearbeiten') ?>"> + <?= Avatar::getAvatar($user->id)->getImageTag(Avatar::SMALL) ?> + </a> + </td> + <td> + <a href="<?= $controller->link_for("admin/user/edit/{$user->id}") ?>" + title="<?= _('Nutzer bearbeiten') ?>"> + <?= htmlReady($user->username) ?> + </a> + <? if ($user->locked) : ?> + <?= Icon::create('lock-locked', Icon::ROLE_INFO)->asSvg(tooltip2(sprintf(_('%s ist gesperrt'), htmlReady($user->getFullName())))) ?> + <? endif ?> + </td> + <td> <? - $actionMenu = ActionMenu::get()->setContext($user); + $userdomains = UserDomain::getUserDomainsForUser($user->user_id); + $tooltxt = _('Sichtbarkeit:') . ' ' . $user->visible; + if (!empty($userdomains)) { + $domains = []; + array_walk($userdomains, function ($a) use (&$domains) { + if (!in_array($a->name, $domains)) { + $domains[] = $a->name; + } + }); + $tooltxt .= "\n" . _('Domänen:') . ' ' . implode(', ', $domains); + } + if ($user->locked == '1') { + $tooltxt .= "\n" . _("Nutzer ist gesperrt!"); + } + ?> + <?= tooltipHtmlIcon(htmlReady($tooltxt, true, true)) ?> + </td> + <td><?= htmlReady($user->matriculation_number) ?></td> + <td><?= htmlReady($user->perms) ?></td> + <td><?= htmlReady($user->vorname) ?></td> + <td><?= htmlReady($user->nachname) ?></td> + <td><?= htmlReady($user->email) ?></td> + <td data-sort-value="<?= htmlReady($user->online->last_lifesign ?? 0) ?>"> + <? if (!empty($user->online->last_lifesign)) : + $inactive = time() - $user->online->last_lifesign; + if ($inactive < 3600 * 24) { + $inactive = gmdate('H:i:s', $inactive); + } else { + $inactive = floor($inactive / (3600 * 24)) . ' ' . _('Tage'); + } + else : + $inactive = _('nie benutzt'); + endif ?> + <?= $inactive ?> + </td> + <td data-sort-value="<?= htmlReady($user->mkdate) ?>"> + <?= $user->mkdate ? strftime('%x', $user->mkdate) : _('unbekannt') ?> + </td> + <td><?= htmlReady($user['auth_plugin'] === null ? _('vorläufig') : $user->auth_plugin) ?></td> + <td class="actions" nowrap> + <? + $actionMenu = ActionMenu::get()->setContext($user); + $actionMenu->addLink( + $controller->url_for("admin/user/edit/{$user->id}"), + _('Nutzer bearbeiten'), + Icon::create('edit') + ); + + $actionMenu->addLink( + $controller->url_for('profile',['username' => $user->username]), + _('Zum Profil'), + Icon::create('person') + ); + if ($GLOBALS['perm']->have_perm('root')) { $actionMenu->addLink( - $controller->url_for("admin/user/edit/{$user->id}"), - _('Nutzer bearbeiten'), - Icon::create('edit') + $controller->url_for('admin/user/activities/' . $user->user_id, ['from_index' => 1]), + _('Datei- und Aktivitätsübersicht'), + Icon::create('vcard'), + ['data-dialog' => 'size=auto'] ); - $actionMenu->addLink( - $controller->url_for('profile',['username' => $user->username]), - _('Zum Profil'), - Icon::create('person') + $controller->show_user_coursesURL($user, ['from_index' => 1]), + _('Veranstaltungsübersicht'), + Icon::create('seminar'), + ['data-dialog' => 'size=auto'] ); - if ($GLOBALS['perm']->have_perm('root')) { - $actionMenu->addLink( - $controller->url_for('admin/user/activities/' . $user->user_id, ['from_index' => 1]), - _('Datei- und Aktivitätsübersicht'), - Icon::create('vcard'), - ['data-dialog' => 'size=auto'] - ); + if (Config::get()->LOG_ENABLE) { $actionMenu->addLink( - $controller->show_user_coursesURL($user, ['from_index' => 1]), - _('Veranstaltungsübersicht'), - Icon::create('seminar'), - ['data-dialog' => 'size=auto'] + $controller->url_for('event_log/show', ['search' => $user->username, 'type' => 'user', 'object_id' => $user->id]), + _('Personeneinträge im Log'), + Icon::create('log') ); - if (Config::get()->LOG_ENABLE) { - $actionMenu->addLink( - $controller->url_for('event_log/show', ['search' => $user->username, 'type' => 'user', 'object_id' => $user->id]), - _('Personeneinträge im Log'), - Icon::create('log') - ); - } } + } + $actionMenu->addLink( + $controller->url_for('messages/write', ['rec_uname' => $user->username]), + _('Nachricht an Nutzer verschicken'), + Icon::create('mail'), + ['data-dialog' => 'size=auto'] + ); + + if ($user->locked) { + $actionMenu->addButton( + 'unlock', + _('Nutzeraccount entsperren'), + Icon::create('lock-unlocked'), + [ + 'formaction' => $controller->url_for("admin/user/unlock/{$user->id}", ['from_index' => 1]) + ] + ); + } else { $actionMenu->addLink( - $controller->url_for('messages/write', ['rec_uname' => $user->username]), - _('Nachricht an Nutzer verschicken'), - Icon::create('mail'), + $controller->url_for("admin/user/lock_comment/{$user->id}", ['from_index' => 1]), + _('Nutzeraccount sperren'), + Icon::create('lock-locked'), ['data-dialog' => 'size=auto'] ); + } - if ($user->locked) { + if ($user->auth_plugin !== 'preliminary' && ($GLOBALS['perm']->have_perm('root') || $GLOBALS['perm']->is_fak_admin() || !in_array($user->perms, words('root admin')))) { + if (!StudipAuthAbstract::CheckField('auth_user_md5.password', $user->auth_plugin)) { $actionMenu->addButton( - 'unlock', - _('Nutzeraccount entsperren'), - Icon::create('lock-unlocked'), + 'change_password', + _('Passwortlink zusenden'), + Icon::create('key'), [ - 'formaction' => $controller->url_for("admin/user/unlock/{$user->id}", ['from_index' => 1]) + 'formaction' => $controller->url_for("admin/user/change_password/{$user->id}", ['from_index' => 1]) ] ); - } else { - $actionMenu->addLink( - $controller->url_for("admin/user/lock_comment/{$user->id}", ['from_index' => 1]), - _('Nutzeraccount sperren'), - Icon::create('lock-locked'), - ['data-dialog' => 'size=auto'] - ); } - if ($user->auth_plugin !== 'preliminary' && ($GLOBALS['perm']->have_perm('root') || $GLOBALS['perm']->is_fak_admin() || !in_array($user->perms, words('root admin')))) { - if (!StudipAuthAbstract::CheckField('auth_user_md5.password', $user->auth_plugin)) { - $actionMenu->addButton( - 'change_password', - _('Passwortlink zusenden'), - Icon::create('key'), - [ - 'formaction' => $controller->url_for("admin/user/change_password/{$user->id}", ['from_index' => 1]) - ] - ); - } - - $actionMenu->addButton( - 'delete_user', - _('Nutzer löschen'), - Icon::create('trash'), - ['formaction' => $controller->url_for("admin/user/bulk/{$user->id}", ['method' => 'delete'])] - ); + $actionMenu->addButton( + 'delete_user', + _('Nutzer löschen'), + Icon::create('trash'), + ['formaction' => $controller->url_for("admin/user/bulk/{$user->id}", ['method' => 'delete'])] + ); - } + } - if (Privacy::isVisible($user->id)) { - $actionMenu->addLink( - $controller->url_for("privacy/landing/{$user->id}"), - _('Anzeige Personendaten'), - Icon::create('log'), - ['data-dialog' => 'size=medium'] - ); - $actionMenu->addLink( - $controller->url_for("privacy/print/{$user->id}"), - _('Personendaten drucken'), - Icon::create('print'), - ['class' => 'print_action', 'target' => '_blank'] - ); - $actionMenu->addLink( - $controller->url_for("privacy/export/{$user->id}"), - _('Export Personendaten als CSV'), - Icon::create('file-text') - ); - $actionMenu->addLink( - $controller->url_for("privacy/xml/{$user->id}"), - _('Export Personendaten als XML'), - Icon::create('file-text') - ); - $actionMenu->addLink( - $controller->url_for("privacy/filesexport/{$user->id}"), - _('Export persönlicher Dateien als ZIP'), - Icon::create('file-archive') - ); - } - - echo $actionMenu; - ?> - </td> - </tr> - <? endforeach ?> + if (Privacy::isVisible($user->id)) { + $actionMenu->addLink( + $controller->url_for("privacy/landing/{$user->id}"), + _('Anzeige Personendaten'), + Icon::create('log'), + ['data-dialog' => 'size=medium'] + ); + $actionMenu->addLink( + $controller->url_for("privacy/print/{$user->id}"), + _('Personendaten drucken'), + Icon::create('print'), + ['class' => 'print_action', 'target' => '_blank'] + ); + $actionMenu->addLink( + $controller->url_for("privacy/export/{$user->id}"), + _('Export Personendaten als CSV'), + Icon::create('file-text') + ); + $actionMenu->addLink( + $controller->url_for("privacy/xml/{$user->id}"), + _('Export Personendaten als XML'), + Icon::create('file-text') + ); + $actionMenu->addLink( + $controller->url_for("privacy/filesexport/{$user->id}"), + _('Export persönlicher Dateien als ZIP'), + Icon::create('file-archive') + ); + } + echo $actionMenu; + ?> + </td> + </tr> + <? endforeach ?> </tbody> <tfoot> <tr> |
