mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-05-23 09:09:36 +02:00
Admin Tools: Fix sorting
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user