diff --git a/src/features/ServerPage/features/WarStatsPage/WarStatsPage.tsx b/src/features/ServerPage/features/WarStatsPage/WarStatsPage.tsx index e5077a4..e4961ab 100644 --- a/src/features/ServerPage/features/WarStatsPage/WarStatsPage.tsx +++ b/src/features/ServerPage/features/WarStatsPage/WarStatsPage.tsx @@ -64,10 +64,10 @@ function WarStatsPage() { handleChangePlayers: sideTwoHandleChangePlayers, handleChangeTribes: sideTwoHandleChangeTribes, } = useSide(server.key, { paramNamePrefix: 'sideTwo' }); - const selectedPlayersIDs = useMemo(() => { + const selectedPlayerIDs = useMemo(() => { return [...sideOnePlayers.map(p => p.id), ...sideTwoPlayers.map(p => p.id)]; }, [sideOnePlayers, sideTwoPlayers]); - const selectedTribesIDs = useMemo(() => { + const selectedTribeIDs = useMemo(() => { return [...sideOneTribes.map(p => p.id), ...sideTwoTribes.map(p => p.id)]; }, [sideOneTribes, sideTwoTribes]); const loading = sideTwoLoading || sideOneLoading; @@ -80,6 +80,15 @@ function WarStatsPage() { players: Player[] = [], tribes: Tribe[] = [] ): SideResult => { + let totalVillages = 0; + tribes.forEach(t => { + totalVillages += t.totalVillages; + }); + players + .filter(p => !p.tribe || !tribes.some(t => t.id === p.tribe?.id)) + .forEach(p => { + totalVillages += p.totalVillages; + }); return { gained: totalGained, lost: totalLost, @@ -87,6 +96,7 @@ function WarStatsPage() { difference: totalGained - totalLost, players, tribes, + totalVillages, }; }; @@ -279,8 +289,8 @@ function WarStatsPage() { onChangePlayers={sideOneHandleChangePlayers} onChangeTribes={sideOneHandleChangeTribes} server={server.key} - tribeIDNEQ={selectedTribesIDs} - playerIDNEQ={selectedPlayersIDs} + selectedTribeIDs={selectedTribeIDs} + selectedPlayerIDs={selectedPlayerIDs} className={classes.formGroup} disabled={isSubmitting} /> @@ -293,8 +303,8 @@ function WarStatsPage() { onChangePlayers={sideTwoHandleChangePlayers} onChangeTribes={sideTwoHandleChangeTribes} server={server.key} - tribeIDNEQ={selectedTribesIDs} - playerIDNEQ={selectedPlayersIDs} + selectedTribeIDs={selectedTribeIDs} + selectedPlayerIDs={selectedPlayerIDs} className={classes.formGroup} disabled={isSubmitting} /> diff --git a/src/features/ServerPage/features/WarStatsPage/components/OneSide/OneSide.tsx b/src/features/ServerPage/features/WarStatsPage/components/OneSide/OneSide.tsx index 8207181..347de20 100644 --- a/src/features/ServerPage/features/WarStatsPage/components/OneSide/OneSide.tsx +++ b/src/features/ServerPage/features/WarStatsPage/components/OneSide/OneSide.tsx @@ -28,8 +28,8 @@ export interface Props { ) => void; onChangeTribes: (_e: React.ChangeEvent<{}>, tribes: Tribe[] | null) => void; server: string; - playerIDNEQ: number[]; - tribeIDNEQ: number[]; + selectedPlayerIDs: number[]; + selectedTribeIDs: number[]; disabled?: boolean; className?: string; } @@ -41,8 +41,8 @@ function OneSide({ onChangePlayers, onChangeTribes, server, - tribeIDNEQ, - playerIDNEQ, + selectedTribeIDs, + selectedPlayerIDs, className, disabled, }: Props) { @@ -96,7 +96,7 @@ function OneSide({ filter: { exists: true, nameIEQ: searchValue + '%', - idNEQ: playerIDNEQ, + idNEQ: selectedPlayerIDs, }, server, offset: 0, @@ -124,7 +124,7 @@ function OneSide({ filter: { exists: true, tagIEQ: searchValue + '%', - idNEQ: tribeIDNEQ, + idNEQ: selectedTribeIDs, }, server, offset: 0, @@ -145,7 +145,7 @@ function OneSide({ return v1 && v2 ? v1.id === v2.id : false; }; - const isDisabled = (id: number, blacklist: number[]) => { + const isSelected = (id: number, blacklist: number[]) => { return blacklist.some(id2 => id === id2); }; @@ -169,12 +169,17 @@ function OneSide({ !isSelected(s.id, selectedPlayerIDs) + ), + ...players, + ]} getOptionLabel={opt => { return opt ? opt.name : ''; }} disabled={disabled} - getOptionDisabled={opt => isDisabled(opt.id, playerIDNEQ)} + getOptionDisabled={opt => isSelected(opt.id, selectedPlayerIDs)} onChange={handleChangePlayers} renderInput={params => ( isDisabled(opt.id, tribeIDNEQ)} + options={[ + ...tribeSuggestions.filter( + s => !isSelected(s.id, selectedTribeIDs) + ), + ...tribes, + ]} + getOptionDisabled={opt => isSelected(opt.id, selectedTribeIDs)} getOptionLabel={opt => { return opt ? opt.tag : ''; }} diff --git a/src/features/ServerPage/features/WarStatsPage/components/Results/OneSideResult.tsx b/src/features/ServerPage/features/WarStatsPage/components/Results/OneSideResult.tsx index ab07c7d..1872023 100644 --- a/src/features/ServerPage/features/WarStatsPage/components/Results/OneSideResult.tsx +++ b/src/features/ServerPage/features/WarStatsPage/components/Results/OneSideResult.tsx @@ -23,31 +23,39 @@ function OneSideResult({ data, t, server, title }: Props) { {data.players.length > 0 && ( {t('players')}:{' '} - {data.players.map(player => ( - - {player.name}{' '} - + {data.players.map((player, index) => ( + + + {player.name} + + {index !== data.players.length - 1 ? ', ' : ''} + ))} )} {data.tribes.length > 0 && ( {t('tribes')}:{' '} - {data.tribes.map(tribe => ( - - {tribe.tag}{' '} - + {data.tribes.map((tribe, index) => ( + + + {tribe.tag} + + {index !== data.tribes.length - 1 ? ', ' : ''} + ))} )} + + {t('results.villages')}:{' '} + {formatNumber('commas', data.totalVillages)} + {t('results.gained')}:{' '} {formatNumber('commas', data.gained)} diff --git a/src/features/ServerPage/features/WarStatsPage/queries.ts b/src/features/ServerPage/features/WarStatsPage/queries.ts index 4bca048..022da20 100644 --- a/src/features/ServerPage/features/WarStatsPage/queries.ts +++ b/src/features/ServerPage/features/WarStatsPage/queries.ts @@ -18,6 +18,10 @@ export const PLAYERS = gql` items { id name + totalVillages + tribe { + id + } } } } @@ -41,6 +45,7 @@ export const TRIBES = gql` items { id tag + totalVillages } } } @@ -65,45 +70,57 @@ export const ENNOBLEMENTS = gql` sideOneTotalGained: ennoblements( server: $server filter: $sideOneTotalGainedFilter + limit: 1 ) { total } sideOneTotalLost: ennoblements( server: $server filter: $sideOneTotalLostFilter + limit: 1 ) { total } sideOnePlayers: ennoblements( server: $server filter: $sideOnePlayersFilter + limit: 1 ) @skip(if: $skipSideOnePlayers) { total } - sideOneTribes: ennoblements(server: $server, filter: $sideOneTribesFilter) - @skip(if: $skipSideOneTribes) { + sideOneTribes: ennoblements( + server: $server + filter: $sideOneTribesFilter + limit: 1 + ) @skip(if: $skipSideOneTribes) { total } sideTwoTotalGained: ennoblements( server: $server filter: $sideTwoTotalGainedFilter + limit: 1 ) { total } sideTwoTotalLost: ennoblements( server: $server filter: $sideTwoTotalLostFilter + limit: 1 ) { total } sideTwoPlayers: ennoblements( server: $server filter: $sideTwoPlayersFilter + limit: 1 ) @skip(if: $skipSideTwoPlayers) { total } - sideTwoTribes: ennoblements(server: $server, filter: $sideTwoTribesFilter) - @skip(if: $skipSideTwoTribes) { + sideTwoTribes: ennoblements( + server: $server + filter: $sideTwoTribesFilter + limit: 1 + ) @skip(if: $skipSideTwoTribes) { total } } diff --git a/src/features/ServerPage/features/WarStatsPage/types.ts b/src/features/ServerPage/features/WarStatsPage/types.ts index 1c340cf..fcc1415 100644 --- a/src/features/ServerPage/features/WarStatsPage/types.ts +++ b/src/features/ServerPage/features/WarStatsPage/types.ts @@ -3,6 +3,7 @@ import { List, EnnoblementFilter } from '@libs/graphql/types'; export type Tribe = { id: number; tag: string; + totalVillages: number; }; export type TribeList = { @@ -12,6 +13,10 @@ export type TribeList = { export type Player = { id: number; name: string; + totalVillages: number; + tribe?: { + id: number; + }; }; export type PlayerList = { @@ -68,6 +73,7 @@ export type SideResult = { againstOppositeSide: number; players: Player[]; tribes: Tribe[]; + totalVillages: number; }; export type Results = { diff --git a/src/libs/i18n/en/server-page/war-stats-page.ts b/src/libs/i18n/en/server-page/war-stats-page.ts index 92ac368..7e9b166 100644 --- a/src/libs/i18n/en/server-page/war-stats-page.ts +++ b/src/libs/i18n/en/server-page/war-stats-page.ts @@ -21,6 +21,7 @@ const translations = { sideOne: 'Side one', sideTwo: 'Side two', lost: 'Lost', + villages: 'Villages', gained: 'Gained', difference: 'Difference', ennoblementsAgainstOppositeSide: 'Ennoblements against opposite side', diff --git a/src/libs/i18n/pl/server-page/war-stats-page.ts b/src/libs/i18n/pl/server-page/war-stats-page.ts index 304a23f..eef6bfc 100644 --- a/src/libs/i18n/pl/server-page/war-stats-page.ts +++ b/src/libs/i18n/pl/server-page/war-stats-page.ts @@ -20,6 +20,7 @@ const translations = { results: { sideOne: 'Strona pierwsza', sideTwo: 'Strona druga', + villages: 'Wioski', lost: 'Stracone', gained: 'Zdobyte', difference: 'Różnica', diff --git a/src/libs/i18n/pt/server-page/war-stats-page.ts b/src/libs/i18n/pt/server-page/war-stats-page.ts index ff273b1..ca61a18 100644 --- a/src/libs/i18n/pt/server-page/war-stats-page.ts +++ b/src/libs/i18n/pt/server-page/war-stats-page.ts @@ -20,6 +20,7 @@ const translations = { results: { sideOne: 'Primeiro lado', sideTwo: 'Segundo lado', + villages: 'Aldeias', lost: 'Perdas', gained: 'Ganhos', difference: 'Diferença', diff --git a/src/libs/i18n/pt_br/server-page/war-stats-page.ts b/src/libs/i18n/pt_br/server-page/war-stats-page.ts index 3bdc6e7..417717c 100644 --- a/src/libs/i18n/pt_br/server-page/war-stats-page.ts +++ b/src/libs/i18n/pt_br/server-page/war-stats-page.ts @@ -20,6 +20,7 @@ const translations = { results: { sideOne: 'Primeiro lado', sideTwo: 'Segundo lado', + villages: 'Aldeias', lost: 'Perda', gained: 'Ganho', difference: 'Diferença',