aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan-Hendrik Willms <tleilax+studip@gmail.com>2025-10-14 16:43:26 +0200
committerJan-Hendrik Willms <tleilax+studip@gmail.com>2025-10-14 16:43:26 +0200
commitbbb0d83322ccd88cdb9f9501f06b9518dbafa7a2 (patch)
treef69e14451fcc3e9238f160a952e4ee3a849a1d16
parentf65843128420a4da2ebbaf1f5a8958bfac97166e (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.php11
-rw-r--r--app/views/admin/user/_results.php371
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>&nbsp;</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>