Skip to content

Commit 59d3534

Browse files
committed
Topcoder Admin App - Misc Bug Fix
1 parent 26ef81c commit 59d3534

File tree

7 files changed

+39
-88
lines changed

7 files changed

+39
-88
lines changed

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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const ChallengeUserFilters: FC<ChallengeUserFiltersProps> = props => {
3939
label: item.name,
4040
value: item.id,
4141
})
42-
const emptyOption: InputSelectOption = { label: '', value: '' }
42+
const emptyOption: InputSelectOption = { label: 'All', value: '' }
4343
const o: InputSelectOption | undefined = _.filter(resourceRoles, {
4444
name: DEFAULT_ROLE_FILTER_NAME,
4545
})

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)