Skip to content

Commit 0efe737

Browse files
authored
Merge pull request #1021 from topcoder-platform/diazz-f2f-30376413
Topcoder Admin App - Misc Bug Fix
2 parents 26ef81c + 87a85a3 commit 0efe737

File tree

8 files changed

+42
-96
lines changed

8 files changed

+42
-96
lines changed

src/apps/admin/src/challenge-management/ManageUserPage/ManageUserPage.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
PageContent,
2929
PageHeader,
3030
} from '../../lib/components'
31+
import { TABLE_PAGINATION_ITEM_PER_PAGE } from '../../config/index.config'
3132
import {
3233
ChallengeFilterCriteria,
3334
ChallengeResource,
@@ -77,7 +78,7 @@ export const ManageUserPage: FC = () => {
7778
Dispatch<SetStateAction<ChallengeResourceFilterCriteria>>,
7879
] = useState<ChallengeResourceFilterCriteria>({
7980
page: 1,
80-
perPage: 5,
81+
perPage: TABLE_PAGINATION_ITEM_PER_PAGE,
8182
roleId: '',
8283
})
8384
const [users, setUsers]: [

src/apps/admin/src/config/index.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { InputSelectOption } from '~/libs/ui/lib/components/form/form-groups/for
44
/**
55
* Common config for ui.
66
*/
7-
const EMPTY_OPTION: InputSelectOption = { label: '', value: '' }
7+
const EMPTY_OPTION: InputSelectOption = { label: 'all', value: '' }
88
export const USER_STATUS_SELECT_OPTIONS: InputSelectOption[] = [
99
EMPTY_OPTION,
1010
{ label: 'active', value: 'active' },

src/apps/admin/src/lib/components/ChallengeFilters/ChallengeFilters.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ const ChallengeFilters: FC<ChallengeFiltersProps> = props => {
5454
label: item,
5555
value: item,
5656
})
57-
const emptyOption: InputSelectOption = { label: '', value: '' }
57+
const emptyOption: InputSelectOption = { label: 'All', value: '' }
5858

5959
return {
6060
challengeStatusOptions: [

src/apps/admin/src/lib/components/ChallengeUserFilters/ChallengeUserFilters.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { ChangeEvent, FC, useContext, useEffect, useMemo, useRef } from 'react'
2-
import _ from 'lodash'
32

43
import { Button, InputSelect, InputSelectOption } from '~/libs/ui'
54

@@ -25,7 +24,6 @@ interface ChallengeUserFiltersProps {
2524
}
2625

2726
const ChallengeUserFilters: FC<ChallengeUserFiltersProps> = props => {
28-
const DEFAULT_ROLE_FILTER_NAME = 'Submitter'
2927
const { resourceRoles, loadResourceRoles }: ChallengeManagementContextType
3028
= useContext(ChallengeManagementContext)
3129
const {
@@ -39,14 +37,10 @@ const ChallengeUserFilters: FC<ChallengeUserFiltersProps> = props => {
3937
label: item.name,
4038
value: item.id,
4139
})
42-
const emptyOption: InputSelectOption = { label: '', value: '' }
43-
const o: InputSelectOption | undefined = _.filter(resourceRoles, {
44-
name: DEFAULT_ROLE_FILTER_NAME,
45-
})
46-
.map(role2Option)[0]
40+
const emptyOption: InputSelectOption = { label: 'All', value: '' }
4741

4842
return {
49-
defaultResourceRoleOption: o,
43+
defaultResourceRoleOption: emptyOption,
5044
resourceRoleOptions: [
5145
emptyOption,
5246
...resourceRoles.map(role2Option),

src/apps/admin/src/lib/components/common/Pagination/Pagination.tsx

Lines changed: 26 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { FC, useCallback, useEffect, useMemo, useState } from 'react'
1+
import { FC, useEffect, useMemo, useState } from 'react'
22

33
import { useWindowSize, WindowSize } from '~/libs/shared'
44
import { Button, IconOutline } from '~/libs/ui'
@@ -19,98 +19,39 @@ const Pagination: FC<PaginationProps> = (props: PaginationProps) => {
1919
const MAX_PAGE_DISPLAY = 5
2020
const MAX_PAGE_MOBILE_DISPLAY = 3
2121
const { width: screenWidth }: WindowSize = useWindowSize()
22+
const isMobile = useMemo(() => screenWidth < 767, [screenWidth])
2223

2324
const [displayPages, setDisplayPages] = useState<number[]>([])
24-
const mobiledisplayPages = useMemo(() => {
25-
if (displayPages.length <= MAX_PAGE_MOBILE_DISPLAY) {
26-
return displayPages
27-
}
28-
29-
const LEFT = MAX_PAGE_MOBILE_DISPLAY % 2 === 0 ? MAX_PAGE_MOBILE_DISPLAY / 2 : (MAX_PAGE_MOBILE_DISPLAY + 1) / 2
30-
const RIGHT = MAX_PAGE_MOBILE_DISPLAY - LEFT
31-
const index = displayPages.indexOf(props.page)
32-
let start = Math.max(0, index - LEFT)
33-
let end = Math.min(index + RIGHT, displayPages.length)
34-
if (end - start < MAX_PAGE_MOBILE_DISPLAY) {
35-
start = Math.min(Math.max(0, end - MAX_PAGE_MOBILE_DISPLAY), start)
36-
}
37-
38-
if (end - start < MAX_PAGE_MOBILE_DISPLAY) {
39-
end = Math.min(Math.max(start + MAX_PAGE_MOBILE_DISPLAY, end), displayPages.length)
40-
}
41-
42-
return displayPages.slice(start, end)
43-
}, [displayPages, props.page, screenWidth]) // eslint-disable-line react-hooks/exhaustive-deps, max-len -- unneccessary dependency: screenWidth
44-
45-
const createDisplayPages = useCallback((reset: boolean) => {
46-
// eslint-disable-next-line complexity
47-
setDisplayPages(oldDisplayPages => {
48-
let expectedDisplayPages = oldDisplayPages
49-
if (expectedDisplayPages.includes(props.page) && !reset) {
50-
return [...expectedDisplayPages]
51-
}
52-
53-
if (reset) {
54-
expectedDisplayPages = []
55-
}
56-
57-
// Initial
58-
if (expectedDisplayPages.length === 0) {
59-
const pages = []
60-
for (
61-
let i = props.page - MAX_PAGE_DISPLAY + 1;
62-
i <= props.page + MAX_PAGE_DISPLAY;
63-
i++
64-
) {
65-
if (i >= 1 && i <= totalPages && pages.length < MAX_PAGE_DISPLAY) {
66-
pages.push(i)
67-
}
68-
}
69-
70-
return pages
71-
}
7225

73-
// Go next
74-
if (props.page > expectedDisplayPages[expectedDisplayPages.length - 1]) {
75-
const pages = []
76-
for (
77-
let i = props.page - MAX_PAGE_DISPLAY + 1;
78-
i <= props.page;
79-
i++
80-
) {
81-
if (i >= 1) {
82-
pages.push(i)
83-
}
26+
useEffect(() => {
27+
let pages: number[] = []
28+
if (props.page) {
29+
pages = [props.page]
30+
const maxDisplayPage = isMobile
31+
? MAX_PAGE_MOBILE_DISPLAY
32+
: MAX_PAGE_DISPLAY
33+
let haveAvailablePage = true
34+
let i = 1
35+
while (haveAvailablePage && pages.length < maxDisplayPage) {
36+
const prevPage = props.page - i
37+
haveAvailablePage = false
38+
if (prevPage > 0) {
39+
pages = [prevPage, ...pages]
40+
haveAvailablePage = true
8441
}
8542

86-
return pages
87-
}
88-
89-
// Go previous
90-
if (props.page < expectedDisplayPages[0] && props.page >= 1) {
91-
const pages = []
92-
for (
93-
let i = props.page;
94-
i < props.page + MAX_PAGE_DISPLAY;
95-
i++
96-
) {
97-
pages.push(i)
43+
const nextPage = props.page + i
44+
if (nextPage <= totalPages) {
45+
pages = [...pages, nextPage]
46+
haveAvailablePage = true
9847
}
9948

100-
return pages
49+
i += 1
10150
}
51+
}
10252

103-
return [...expectedDisplayPages]
104-
})
105-
}, [props.page, totalPages])
106-
107-
useEffect(() => {
108-
createDisplayPages(true)
109-
}, [totalPages]) // eslint-disable-line react-hooks/exhaustive-deps
110-
111-
useEffect(() => {
112-
createDisplayPages(false)
113-
}, [props.page]) // eslint-disable-line react-hooks/exhaustive-deps
53+
setDisplayPages(pages)
54+
}, [totalPages, props.page, isMobile]) // eslint-disable-line react-hooks/exhaustive-deps
11455

11556
const createHandlePageClick = (p: number) => () => {
11657
if (p === 0 || p > totalPages || p === props.page) {
@@ -148,7 +89,7 @@ const Pagination: FC<PaginationProps> = (props: PaginationProps) => {
14889
className={styles.previous}
14990
/>
15091
<div className={styles.pageNumbers}>
151-
{(screenWidth < 767 ? mobiledisplayPages : displayPages).map(i => (
92+
{displayPages.map(i => (
15293
<Button
15394
key={`page-${i}`}
15495
secondary

src/apps/admin/src/lib/services/challenge-management.service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ export const getChallengeResources = async (
8888
export const getResourceEmails = async (
8989
users: ChallengeResource[],
9090
): Promise<ResourceEmail[]> => {
91+
if (!users.length) {
92+
return Promise.resolve([])
93+
}
94+
9195
let qs: string
9296
if (users.length > 1) {
9397
qs = users.map(usr => `userIds=${usr.memberId}`)

src/apps/admin/src/lib/services/user.service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ import {
1818
export const getMemberSuggestionsByHandle = async (
1919
handle: string,
2020
): Promise<Array<{ handle: string; userId: number }>> => {
21+
if (!handle) {
22+
return []
23+
}
24+
2125
type v3Response<T> = { result: { content: T } }
2226
const data = await xhrGetAsync<
2327
v3Response<Array<{ handle: string; userId: number }>>

src/apps/admin/src/lib/utils/api.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ export const createChallengeQueryString = (
4949

5050
if (filterCriteria.status) filter += `&status=${filterCriteria.status}`
5151

52+
filter += '&sortBy=created&sortOrder=desc'
53+
5254
return filter
5355
}
5456

0 commit comments

Comments
 (0)