Admin Tools: Fix sorting

This commit is contained in:
yu-i-i
2026-01-30 00:23:02 +01:00
parent 91e97dbdf2
commit ada07fb779
4 changed files with 38 additions and 30 deletions

View File

@@ -111,16 +111,23 @@ function _applyFilters(projects, filters) {
function _sortAndPaginate(projects, sort, page) { function _sortAndPaginate(projects, sort, page) {
if ( if (
(sort.by && !['lastUpdated', 'title', 'deletedAt'].includes(sort.by)) || (sort.by && !['lastUpdated', 'title', 'deletedAt', 'owner'].includes(sort.by)) ||
(sort.order && !['asc', 'desc'].includes(sort.order)) (sort.order && !['asc', 'desc'].includes(sort.order))
) { ) {
throw new OError('Invalid sorting criteria', { sort }) throw new OError('Invalid sorting criteria', { sort })
} }
const sortedProjects = _.orderBy(
projects, // sorting by owner is not implemented, it is mot needed
[sort.by || 'lastUpdated'], const sortedProjects =
[sort.order || 'desc'] sort.by === 'title'
) ? [...projects].sort((a, b) =>
(a.name ?? '\uffff').localeCompare(b.name ?? '\uffff')
)
: _.orderBy(
projects,
[sort.by || 'lastUpdated'],
[sort.order || 'desc']
)
return sortedProjects return sortedProjects
} }

View File

@@ -266,11 +266,23 @@ function _sortAndPaginate(users, sort, page) {
throw new OError('Invalid sorting criteria', { sort }) throw new OError('Invalid sorting criteria', { sort })
} }
const sortedUsers = _.orderBy( const LAST = '\uffff'
users, const sortedUsers =
[sort.by || 'signUpDate'], sort.by === 'name'
[sort.order || 'desc'] ? [...users].sort((a, b) =>
) (a.lastName ?? LAST).localeCompare(b.lastName ?? LAST, undefined, { sensitivity: 'base' }) ||
(a.firstName ?? LAST).localeCompare(b.firstName ?? LAST, undefined, { sensitivity: 'base' }) ||
(a.email ?? LAST).localeCompare(b.email ?? LAST, undefined, { sensitivity: 'base' })
)
: _.orderBy(
users,
[u => {
const key = sort.by || 'signUpDate'
const value = u[key]
return typeof value === 'string' ? (value ?? LAST).toLowerCase() : value
}],
[sort.order || 'desc']
)
return sortedUsers return sortedUsers
} }

View File

@@ -5,7 +5,6 @@ import {
useContext, useContext,
useEffect, useEffect,
useMemo, useMemo,
useRef,
useState, useState,
} from 'react' } from 'react'
import { import {
@@ -130,7 +129,6 @@ export function UserListProvider({ children }: UserListProviderProps) {
'user-list-filter', 'user-list-filter',
'all' 'all'
) )
const prevSortRef = useRef<Sort>(sort)
const [searchText, setSearchText] = useState('') const [searchText, setSearchText] = useState('')
@@ -160,11 +158,11 @@ export function UserListProvider({ children }: UserListProviderProps) {
}, [prefetchedUsersBlob, runAsync]) }, [prefetchedUsersBlob, runAsync])
const addUserToView = useCallback((newUser: Partial<User>) => { const addUserToView = useCallback((newUser: Partial<User>) => {
setLoadedUsers(prev => sortUsers([newUser, ...prev], prevSortRef.current)) setLoadedUsers(prev => [newUser as User, ...prev])
}, []) }, [])
const processedUsers = useMemo(() => { const processedUsers = useMemo(() => {
let users = [...loadedUsers] let users = loadedUsers
if (searchText.length) { if (searchText.length) {
const searchTextLowerCase = searchText.toLowerCase() const searchTextLowerCase = searchText.toLowerCase()
@@ -177,11 +175,7 @@ export function UserListProvider({ children }: UserListProviderProps) {
users = arrayFilter(users, filters[filter]) users = arrayFilter(users, filters[filter])
if (prevSortRef.current !== sort) { return sortUsers(users, sort)
users = sortUsers(users, sort)
}
return users
}, [loadedUsers, searchText, filter, sort]) }, [loadedUsers, searchText, filter, sort])
const visibleUsers = useMemo(() => { const visibleUsers = useMemo(() => {
@@ -198,10 +192,6 @@ export function UserListProvider({ children }: UserListProviderProps) {
MAX_USER_PER_PAGE MAX_USER_PER_PAGE
) )
useEffect(() => {
prevSortRef.current = sort
}, [sort])
const selfVisibleCount = useMemo(() => { const selfVisibleCount = useMemo(() => {
return visibleUsers.some(u => u.id === selfId) ? 1 : 0 return visibleUsers.some(u => u.id === selfId) ? 1 : 0
}, [visibleUsers]) }, [visibleUsers])
@@ -238,8 +228,8 @@ export function UserListProvider({ children }: UserListProviderProps) {
) )
const selectedUsers = useMemo(() => { const selectedUsers = useMemo(() => {
return visibleUsers.filter(user => selectedUserIds.has(user.id)) return loadedUsers.filter(user => selectedUserIds.has(user.id))
}, [selectedUserIds, visibleUsers]) }, [selectedUserIds, loadedUsers])
const selectOrUnselectAllUsers = useCallback( const selectOrUnselectAllUsers = useCallback(
(checked: any) => { (checked: any) => {
@@ -258,7 +248,7 @@ export function UserListProvider({ children }: UserListProviderProps) {
} }
return selectedUserIds return selectedUserIds
}) })
} , },
[visibleUsers] [visibleUsers]
) )
@@ -356,7 +346,7 @@ export function UserListProvider({ children }: UserListProviderProps) {
) )
if (!loadedUsers || loadedUsers.length === 0) { if (!loadedUsers || loadedUsers.length === 0) {
return null return null
} }
return ( return (
@@ -377,4 +367,3 @@ export function useUserListContext() {
} }
return context return context
} }

View File

@@ -8,7 +8,7 @@ export type Page = {
} }
export type Sort = { export type Sort = {
by: 'lastUpdated' | 'title' | 'deletedAt' by: 'lastUpdated' | 'title' | 'deletedAt' | 'owner'
order: SortingOrder order: SortingOrder
} }