Skip to content

Commit 77370fa

Browse files
committed
GAME-167 #pagination for member assignments
1 parent d4a04cd commit 77370fa

File tree

8 files changed

+72
-21
lines changed

8 files changed

+72
-21
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
export interface InfinitePageDao<T> {
22
count: number
3+
limit: number
4+
offset: number
35
// TODO: rename this 'items' so it can be used in a grid/card view
46
rows: ReadonlyArray<T>
57
}

src-ts/tools/gamification-admin/game-lib/use-gamification-breadcrumb.hook.tsx renamed to src-ts/tools/gamification-admin/game-lib/hooks/use-gamification-breadcrumb.hook.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { BreadcrumbItemModel } from '../../../lib'
2-
import { basePath } from '../gamification-admin.routes'
3-
import { toolTitle } from '../GamificationAdmin'
1+
import { BreadcrumbItemModel } from '../../../../lib'
2+
import { basePath } from '../../gamification-admin.routes'
3+
import { toolTitle } from '../../GamificationAdmin'
44

55
export function useGamificationBreadcrumb(items: Array<BreadcrumbItemModel>): Array<BreadcrumbItemModel> {
66

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { EnvironmentConfig } from '../../../../config'
2+
import { InfinitePageDao, InfinitePageHandler, Sort, useGetInfinitePage } from '../../../../lib'
3+
import { GamificationConfig } from '../../game-config'
4+
import { GameBadge, MemberBadgeAward } from '../game-badge.model'
5+
6+
export function useGetGameBadgeAssigneesPage(badge: GameBadge, sort: Sort): InfinitePageHandler<MemberBadgeAward> {
7+
8+
function getKey(index: number, previousPageData: InfinitePageDao<MemberBadgeAward>): string | undefined {
9+
10+
// reached the end
11+
if (!!previousPageData && !previousPageData.rows.length) {
12+
return undefined
13+
}
14+
15+
const params: Record<string, string> = {
16+
limit: `${GamificationConfig.PAGE_SIZE}`,
17+
offset: `${index * GamificationConfig.PAGE_SIZE}`,
18+
order_by: sort.fieldName,
19+
order_type: sort.direction,
20+
}
21+
22+
const badgeEndpointUrl: URL = new URL(`${EnvironmentConfig.API.V5}/gamification/badges/${badge.id}/assignees?${new URLSearchParams(params)}`)
23+
24+
return badgeEndpointUrl.toString()
25+
}
26+
27+
return useGetInfinitePage(getKey)
28+
}

src-ts/tools/gamification-admin/game-lib/use-get-game-badge-details.hook.ts renamed to src-ts/tools/gamification-admin/game-lib/hooks/use-get-game-badge-details.hook.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import useSWR, { KeyedMutator, SWRResponse } from 'swr'
22

3-
import { EnvironmentConfig } from '../../../config'
4-
5-
import { GameBadge } from './game-badge.model'
3+
import { EnvironmentConfig } from '../../../../config'
4+
import { GameBadge } from '../game-badge.model'
65

76
export interface BadgeDetailPageHandler<T> {
87
data?: Readonly<T>

src-ts/tools/gamification-admin/game-lib/use-get-game-badges-page.hook.ts renamed to src-ts/tools/gamification-admin/game-lib/hooks/use-get-game-badges-page.hook.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import { EnvironmentConfig } from '../../../config'
2-
import { InfinitePageDao, InfinitePageHandler, Sort, useGetInfinitePage } from '../../../lib'
3-
import { GamificationConfig } from '../game-config'
4-
5-
import { GameBadge } from './game-badge.model'
1+
import { EnvironmentConfig } from '../../../../config'
2+
import { InfinitePageDao, InfinitePageHandler, Sort, useGetInfinitePage } from '../../../../lib'
3+
import { GamificationConfig } from '../../game-config'
4+
import { GameBadge } from '../game-badge.model'
65

76
export function useGetGameBadgesPage(sort: Sort): InfinitePageHandler<GameBadge> {
87

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
export * from './game-badge.model'
2-
export * from './use-get-game-badges-page.hook'
3-
export * from './use-gamification-breadcrumb.hook'
4-
export * from './use-get-game-badge-details.hook'
2+
export * from './hooks/use-get-game-badges-page.hook'
3+
export * from './hooks/use-gamification-breadcrumb.hook'
4+
export * from './hooks/use-get-game-badge-details.hook'

src-ts/tools/gamification-admin/pages/badge-detail/AwardedMembersTab/AwardedMembersTab.tsx

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
import { Dispatch, FC, SetStateAction, useState } from 'react'
1+
import { Dispatch, FC, SetStateAction, useEffect, useState } from 'react'
22

33
import { InfinitePageHandler, Sort, Table, TableColumn, tableGetDefaultSort } from '../../../../../lib'
44
import { GameBadge, MemberBadgeAward } from '../../../game-lib'
5+
import { useGetGameBadgeAssigneesPage } from '../../../game-lib/hooks/use-get-game-badge-assignees-page.hook'
56

67
import { awardedMembersColumns } from './awarded-members-table/awarded-members-table.config'
78
import styles from './AwardedMembersTab.module.scss'
89

910
export interface AwardedMembersTabProps {
1011
badge: GameBadge
12+
forceRefresh?: boolean
1113
}
1214

1315
const AwardedMembersTab: FC<AwardedMembersTabProps> = (props: AwardedMembersTabProps) => {
@@ -19,20 +21,31 @@ const AwardedMembersTab: FC<AwardedMembersTabProps> = (props: AwardedMembersTabP
1921
]
2022
= useState<ReadonlyArray<TableColumn<MemberBadgeAward>>>([...awardedMembersColumns])
2123

24+
const pageHandler: InfinitePageHandler<MemberBadgeAward> = useGetGameBadgeAssigneesPage(props.badge, sort)
25+
26+
useEffect(() => {
27+
if (props.forceRefresh && pageHandler) {
28+
pageHandler.mutate()
29+
}
30+
}, [
31+
props.forceRefresh,
32+
pageHandler,
33+
])
34+
2235
function onSortClick(newSort: Sort): void {
2336
setSort({ ...newSort })
2437
}
2538

2639
return (
2740
<div className={styles.tabWrap}>
2841
{
29-
props.badge.member_badges?.length ? (
42+
pageHandler.data?.length ? (
3043
<Table
3144
columns={columns}
32-
data={props.badge.member_badges}
33-
// onLoadMoreClick={pageHandler.getAndSetNext}
34-
// moreToLoad={pageHandler.hasMore}
35-
// onToggleSort={onSortClick}
45+
data={pageHandler.data}
46+
onLoadMoreClick={pageHandler.getAndSetNext}
47+
moreToLoad={pageHandler.hasMore}
48+
onToggleSort={onSortClick}
3649
/>
3750
) : undefined
3851
}

src-ts/tools/gamification-admin/pages/badge-detail/BadgeDetailPage.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ const BadgeDetailPage: FC = () => {
7979

8080
const [showActivatedModal, setShowActivatedModal]: [boolean, Dispatch<SetStateAction<boolean>>] = useState<boolean>(false)
8181

82+
const [forceAwardedMembersTabRefresh, setForceAwardedMembersTabRefresh]: [boolean | undefined, Dispatch<SetStateAction<boolean | undefined>>]
83+
= useState<boolean | undefined>()
84+
8285
useEffect(() => {
8386
if (newImageFile && newImageFile.length) {
8487
const fileReader: FileReader = new FileReader()
@@ -261,15 +264,22 @@ const BadgeDetailPage: FC = () => {
261264
}
262265
}
263266

267+
function onManualAssign(): void {
268+
// refresh awardedMembers data
269+
setForceAwardedMembersTabRefresh(true)
270+
setActiveTab(BadgeDetailsTabViews.awardedMembers)
271+
}
272+
264273
// default tab
265274
let activeTabElement: JSX.Element
266275
= <AwardedMembersTab
267276
badge={badgeDetailsHandler.data as GameBadge}
277+
forceRefresh={forceAwardedMembersTabRefresh}
268278
/>
269279
if (activeTab === BadgeDetailsTabViews.manualAward) {
270280
activeTabElement = <ManualAwardTab
271281
badge={badgeDetailsHandler.data as GameBadge}
272-
onManualAssign={() => setActiveTab(BadgeDetailsTabViews.awardedMembers)}
282+
onManualAssign={onManualAssign}
273283
/>
274284
}
275285
if (activeTab === BadgeDetailsTabViews.batchAward) {

0 commit comments

Comments
 (0)