feat: radix table

This commit is contained in:
TrèsAbhi committed 2023-11-14 12:40:49 -06:00
1 parent deb9e463e1
commit f18b6ee754
2 files changed
+52 -89

No files matched your search

+50 -89
View File
@@ -17,7 +17,6 @@ import { ChangeEvent, useEffect, useRef, useState } from 'react';
import { create } from 'zustand'; import { create } from 'zustand';
import { BlitzkriegRatingsLeaderboardEntry } from '../../../../scripts/buildRatingsLeaderboard'; import { BlitzkriegRatingsLeaderboardEntry } from '../../../../scripts/buildRatingsLeaderboard';
import { RatingsInfo, RatingsPlayer } from '../../../commands/ratings'; import { RatingsInfo, RatingsPlayer } from '../../../commands/ratings';
import * as Leaderboard from '../../../components/Leaderboard';
import PageWrapper from '../../../components/PageWrapper'; import PageWrapper from '../../../components/PageWrapper';
import { LEAGUES } from '../../../constants/leagues'; import { LEAGUES } from '../../../constants/leagues';
import { FIRST_ARCHIVED_RATINGS_SEASON } from '../../../constants/ratings'; import { FIRST_ARCHIVED_RATINGS_SEASON } from '../../../constants/ratings';
@@ -36,6 +35,7 @@ import {
import { getArchivedLatestSeasonNumber } from '../../../core/blitzkrieg/getArchivedLatestSeasonNumber'; import { getArchivedLatestSeasonNumber } from '../../../core/blitzkrieg/getArchivedLatestSeasonNumber';
import getArchivedRatingsInfo from '../../../core/blitzkrieg/getArchivedRatingsInfo'; import getArchivedRatingsInfo from '../../../core/blitzkrieg/getArchivedRatingsInfo';
import { getArchivedRatingsLeaderboard } from '../../../core/blitzkrieg/getArchivedRatingsLeaderboard'; import { getArchivedRatingsLeaderboard } from '../../../core/blitzkrieg/getArchivedRatingsLeaderboard';
import { theme } from '../../../stitches.config';
import { PageTurner } from './components/PageTurner'; import { PageTurner } from './components/PageTurner';
const ROWS_PER_PAGE = 30; const ROWS_PER_PAGE = 30;
@@ -490,38 +490,8 @@ export default function Page() {
} }
} }
const highlightedId = highlightedPlayer
? highlightedPlayer.type === 'id'
? highlightedPlayer.id
: players[region][season][highlightedPlayer.position]?.id
: undefined;
const highlightedUsername =
(highlightedPlayer && highlightedId
? names[region][highlightedId]?.nickname
: undefined) ?? '--';
const highlightedClan =
highlightedPlayer && highlightedId
? names[region][highlightedId]?.clan
: undefined;
const highlightedPosition = highlightedPlayer
? highlightedPlayer.type === 'position'
? highlightedPlayer.position
: (() => {
const stringId = Object.entries(players[region][season]).find(
([, player]) => player.id === highlightedId,
)?.[0];
return stringId === undefined ? undefined : parseInt(stringId);
})()
: undefined;
const totalPlayers = const totalPlayers =
!ratingsInfo?.detail && ratingsInfo?.count ? ratingsInfo.count : undefined; !ratingsInfo?.detail && ratingsInfo?.count ? ratingsInfo.count : undefined;
const highlightedPercentile =
highlightedPosition && totalPlayers
? Math.ceil((highlightedPosition / totalPlayers) * 100)
: undefined;
const highlightedScore = highlightedPosition
? players[region][season][highlightedPosition]?.score
: undefined;
return ( return (
<PageWrapper color="orange"> <PageWrapper color="orange">
@@ -923,39 +893,6 @@ export default function Page() {
</Flex> </Flex>
</Flex> </Flex>
<Table.Root variant="surface">
<Table.Header>
<Table.Row>
<Table.ColumnHeaderCell>Selected player</Table.ColumnHeaderCell>
<Table.ColumnHeaderCell>Position</Table.ColumnHeaderCell>
<Table.ColumnHeaderCell>Percentile</Table.ColumnHeaderCell>
<Table.ColumnHeaderCell>Score</Table.ColumnHeaderCell>
</Table.Row>
</Table.Header>
<Table.Body>
<Table.Row>
<Table.Cell>
{highlightedUsername}
{highlightedClan ? ` [${highlightedClan}]` : ''}
</Table.Cell>
<Table.Cell>
{highlightedPosition
? (highlightedPosition + 1).toLocaleString()
: '--'}
{' / '}
{totalPlayers?.toLocaleString() ?? '--'}
</Table.Cell>
<Table.Cell>
{highlightedPercentile ? `Top ${highlightedPercentile}%` : '--'}
</Table.Cell>
<Table.Cell>
{highlightedScore?.toLocaleString() ?? '--'}
</Table.Cell>
</Table.Row>
</Table.Body>
</Table.Root>
<PageTurner <PageTurner
page={page} page={page}
pages={pages} pages={pages}
@@ -964,11 +901,19 @@ export default function Page() {
} }
/> />
<Leaderboard.Root> <Table.Root variant="surface">
{players === null ? ( <Table.Header>
<Leaderboard.Gap message="Loading players..." /> <Table.Row>
) : ( <Table.ColumnHeaderCell width="0">Position</Table.ColumnHeaderCell>
range( <Table.ColumnHeaderCell>Player</Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0">
Percentile
</Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0">Score</Table.ColumnHeaderCell>
</Table.Row>
</Table.Header>
{range(
page * ROWS_PER_PAGE, page * ROWS_PER_PAGE,
Math.min( Math.min(
page * ROWS_PER_PAGE + ROWS_PER_PAGE, page * ROWS_PER_PAGE + ROWS_PER_PAGE,
@@ -976,33 +921,49 @@ export default function Page() {
), ),
).map((index) => { ).map((index) => {
const id = players[region][season]?.[index]?.id; const id = players[region][season]?.[index]?.id;
const clan = id ? names[region][id]?.clan : undefined;
return ( const highlight = highlightedPlayer
<Leaderboard.Item
nickname={
names[region][id] === null
? `Deleted player ${id}`
: names[region][id]?.nickname ?? `Loading player...`
}
position={index + 1}
score={players[region][season]?.[index]?.score}
clan={id ? names[region][id]?.clan : undefined}
key={index}
highlight={
highlightedPlayer
? highlightedPlayer.type === 'id' ? highlightedPlayer.type === 'id'
? highlightedPlayer.id === id ? highlightedPlayer.id === id
: highlightedPlayer.position === index : highlightedPlayer.position === index
: undefined : false;
} const row = (
<Table.Row
style={{
backgroundColor: highlight
? theme.colors.componentInteractiveActive_orange
: 'unset',
cursor: 'pointer',
}}
key={index}
onClick={() => { onClick={() => {
setHighlightedPlayer({ type: 'position', position: index }); setHighlightedPlayer({ type: 'position', position: index });
}} }}
/> >
<Table.Cell key={index}>
{(index + 1).toLocaleString()}.
</Table.Cell>
<Table.Cell key={index}>
{names[region][id] === null
? `Deleted player ${id}`
: names[region][id]?.nickname ?? `Loading player...`}
<Text color="gray">{clan ? ` [${clan}]` : ''}</Text>
</Table.Cell>
<Table.Cell key={index} align="right">
{totalPlayers
? Math.ceil(((index + 1) / totalPlayers) * 100)
: '--'}
%
</Table.Cell>
<Table.Cell key={index} align="right">
{players[region][season]?.[index]?.score.toLocaleString()}
</Table.Cell>
</Table.Row>
); );
})
)} return row;
</Leaderboard.Root> })}
</Table.Root>
<PageTurner <PageTurner
page={page} page={page}
+2
View File
@@ -1,6 +1,7 @@
import { import {
amberDark, amberDark,
blueDark, blueDark,
orangeDark,
slate, slate,
slateDark, slateDark,
tealDark, tealDark,
@@ -16,6 +17,7 @@ export const theme = {
...createColors(slate, 'light'), ...createColors(slate, 'light'),
...createColors(amberDark, 'amber'), ...createColors(amberDark, 'amber'),
...createColors(orangeDark, 'orange'),
...createColors(blueDark, 'blue'), ...createColors(blueDark, 'blue'),
...createColors(tealDark, 'teal'), ...createColors(tealDark, 'teal'),
}, },