feat(userlist): add sortable columns to User List (#1615)

This commit is contained in:
0xsysr3ll
2026-03-21 00:45:00 +01:00
committed by GitHub
parent 25e376c74f
commit eaf397a021
5 changed files with 295 additions and 44 deletions

View File

@@ -45,6 +45,35 @@ router.get('/', async (req, res, next) => {
: Math.max(10, includeIds.length);
const skip = req.query.skip ? Number(req.query.skip) : 0;
const q = req.query.q ? req.query.q.toString().toLowerCase() : '';
const sortParam = req.query.sort ? req.query.sort.toString() : undefined;
const sortDirectionQuery = req.query.sortDirection
? req.query.sortDirection.toString().toLowerCase()
: undefined;
let sortDirection: 'ASC' | 'DESC';
if (sortDirectionQuery === 'asc') {
sortDirection = 'ASC';
} else if (sortDirectionQuery === 'desc') {
sortDirection = 'DESC';
} else {
switch (sortParam) {
case 'displayname':
sortDirection = 'ASC';
break;
case 'requests':
case 'updated':
sortDirection = 'DESC';
break;
case 'created':
case 'usertype':
case 'role':
case undefined:
default:
sortDirection = 'ASC';
break;
}
}
let query = getRepository(User).createQueryBuilder('user');
if (q) {
@@ -58,29 +87,32 @@ router.get('/', async (req, res, next) => {
query.andWhereInIds(includeIds);
}
switch (req.query.sort) {
switch (sortParam) {
case 'created':
query = query.orderBy('user.createdAt', sortDirection);
break;
case 'updated':
query = query.orderBy('user.updatedAt', 'DESC');
query = query.orderBy('user.updatedAt', sortDirection);
break;
case 'displayname':
query = query
.addSelect(
`CASE WHEN (user.username IS NULL OR user.username = '') THEN (
CASE WHEN (user.plexUsername IS NULL OR user.plexUsername = '') THEN (
CASE WHEN (user.jellyfinUsername IS NULL OR user.jellyfinUsername = '') THEN
"user"."email"
CASE WHEN (user.plexUsername IS NULL OR user.plexUsername = '') THEN (
CASE WHEN (user.jellyfinUsername IS NULL OR user.jellyfinUsername = '') THEN
"user"."email"
ELSE
LOWER(user.jellyfinUsername)
END)
ELSE
LOWER(user.jellyfinUsername)
LOWER(user.plexUsername)
END)
ELSE
LOWER(user.jellyfinUsername)
END)
ELSE
LOWER(user.username)
END`,
LOWER(user.username)
END`,
'displayname_sort_key'
)
.orderBy('displayname_sort_key', 'ASC');
.orderBy('displayname_sort_key', sortDirection);
break;
case 'requests':
query = query
@@ -90,10 +122,25 @@ router.get('/', async (req, res, next) => {
.from(MediaRequest, 'request')
.where('request.requestedBy.id = user.id');
}, 'request_count')
.orderBy('request_count', 'DESC');
.orderBy('request_count', sortDirection);
break;
case 'usertype':
query = query.orderBy('user.userType', sortDirection);
break;
case 'role':
query = query
.addSelect(
`CASE
WHEN user.id = 1 THEN 0
WHEN (user.permissions & ${Permission.ADMIN}) != 0 THEN 1
ELSE 2
END`,
'role_sort_key'
)
.orderBy('role_sort_key', sortDirection);
break;
default:
query = query.orderBy('user.id', 'ASC');
query = query.orderBy('user.id', sortDirection);
break;
}