diff --git a/src/components/TeamFieldingTable.vue b/src/components/TeamFieldingTable.vue index b54d663..8768007 100644 --- a/src/components/TeamFieldingTable.vue +++ b/src/components/TeamFieldingTable.vue @@ -5,22 +5,23 @@ - - - - - - - - - - + + + + + + + + + + @@ -57,6 +58,10 @@ import { aggregateFieldingStats, fetchFieldingStatsBySeasonAndTeamId, totaledFieldingStats, type FieldingStat } from '@/services/fieldingStatsService' import { POS_MAP } from '@/services/utilities' +interface ExtendedFieldingStat extends FieldingStat { + playerName: string +} + export default { name: 'TeamFieldingTable', props: { @@ -66,7 +71,9 @@ export default { }, data() { return { - fieldingStats: [] as FieldingStat[] + fieldingStats: [] as ExtendedFieldingStat[], + sortKey: 'xCheckCount' as keyof ExtendedFieldingStat, + sortOrder: -1 } }, computed: { @@ -97,7 +104,9 @@ export default { methods: { async fetchData(): Promise { const unsortedFieldingStats: FieldingStat[] = await fetchFieldingStatsBySeasonAndTeamId(this.seasonNumber, this.teamId, this.isRegularSeason) - this.fieldingStats = unsortedFieldingStats.sort((s1, s2) => s2.xCheckCount - s1.xCheckCount) + this.fieldingStats = unsortedFieldingStats + .map(s => ({ ...s, playerName: s.player.name })) + .sort((s1, s2) => s2.xCheckCount - s1.xCheckCount) }, formatCaughtStealingPercent(stat: FieldingStat): string { if (stat.stolenBaseCheckCount === 0 || Number.isNaN(stat.caughtStealingPercent)) { @@ -108,7 +117,41 @@ export default { }, formatWeightedFieldingPercent(stat: FieldingStat): string { return stat.weightedFieldingPercent.toFixed(3) + }, + sortBy(stat: keyof ExtendedFieldingStat): void { + this.setKey(stat) + + this.fieldingStats.sort((s1, s2) => s2[stat] < s1[stat] ? this.sortOrder : -1 * this.sortOrder) + }, + setKey(stat: keyof ExtendedFieldingStat): void { + if (this.sortKey === stat) { + // if key currently selected, flip sort order + this.sortOrder *= -1 + } else { + this.sortKey = stat + this.sortOrder = stat === 'playerName' ? 1 : -1 + } + }, + getArrow(stat: keyof ExtendedFieldingStat): string { + if (this.sortKey !== stat) return 'faux-arrow' + + return this.sortOrder > 0 ? 'up' : 'down' } } } + +
SeasonPosXChXHEPBSBaCScCS%wF%PlayerPosXChXHEPBSBaCScCS%wF%
- + {{ stat.player.name }}