RetroPoints: A measurement of rarity and estimated difficulty.
-Derived from points, number of achievers, and number of players.
-+ {unfilteredTotal && unfilteredTotal !== table.options.rowCount ? ( + <> + {formatNumber(table.options.rowCount ?? 0)} of {formatNumber(unfilteredTotal)}{' '} + {unfilteredTotal === 1 ? 'game' : 'games'} + > + ) : ( + <> + {formatNumber(table.options.rowCount ?? 0)}{' '} + {table.options.rowCount === 1 ? 'game' : 'games'} + > + )} +
+ ++ {isInBacklog ? 'Remove from Want to Play Games' : 'Add to Want to Play Games'} +
+Remove
-{achievementsPublished}
- ); - }, - }, - - { - id: 'pointsTotal', - accessorKey: 'game', - meta: { label: 'Points', align: 'right' }, - header: ({ column, table }) => ( -{pointsTotal}
; - } - - return ( -
- {formatNumber(pointsTotal)}{' '}
-
none
; - } - - const pointsWeighted = row.original.game?.pointsWeighted ?? 0; - - const result = pointsWeighted / pointsTotal; - - return×{(Math.round((result + Number.EPSILON) * 100) / 100).toFixed(2)}
; - }, - }, - - { - id: 'lastUpdated', - accessorKey: 'game', - meta: { label: 'Last Updated' }, - header: ({ column, table }) => ( -{formatDate(dayjs.utc(date), 'll')}
; - }, - }, - - { - id: 'releasedAt', - accessorKey: 'game', - meta: { label: 'Release Date' }, - header: ({ column, table }) => ( -unknown
; - } - - const dayjsDate = dayjs.utc(date); - let formattedDate; - if (granularity === 'day') { - formattedDate = formatDate(dayjsDate, 'll'); - } else if (granularity === 'month') { - formattedDate = dayjsDate.format('MMM YYYY'); - } else { - formattedDate = dayjsDate.format('YYYY'); - } - - return{formattedDate}
; - }, - }, - - { - id: 'playersTotal', - accessorKey: 'game', - meta: { label: 'Players', align: 'right' }, - header: ({ column, table }) => ( -{formatNumber(playersTotal)}
- ); - }, - }, - - { - id: 'numVisibleLeaderboards', - accessorKey: 'game', - meta: { label: 'Leaderboards', align: 'right' }, - header: ({ column, table }) => ( -- {numVisibleLeaderboards} -
- ); - }, - }, + buildTitleColumnDef({ tableApiRouteName, forUsername: options.forUsername }), + buildSystemColumnDef({ tableApiRouteName }), + buildAchievementsPublishedColumnDef({ tableApiRouteName }), + buildPointsTotalColumnDef({ tableApiRouteName }), + buildRetroRatioColumnDef({ tableApiRouteName }), + buildLastUpdatedColumnDef({ tableApiRouteName }), + buildReleasedAtColumnDef({ tableApiRouteName }), + buildPlayersTotalColumnDef({ tableApiRouteName }), + buildNumVisibleLeaderboardsColumnDef({ tableApiRouteName }), ]; if (options.canSeeOpenTicketsColumn) { - columnDefinitions.push({ - id: 'numUnresolvedTickets', - accessorKey: 'game', - meta: { label: 'Tickets', align: 'right' }, - header: ({ column, table }) => ( -{achievementsPublished}
+ ); + }, + }; +} diff --git a/resources/js/features/game-list/utils/column-definitions/buildLastUpdatedColumnDef.tsx b/resources/js/features/game-list/utils/column-definitions/buildLastUpdatedColumnDef.tsx new file mode 100644 index 0000000000..2fd6346116 --- /dev/null +++ b/resources/js/features/game-list/utils/column-definitions/buildLastUpdatedColumnDef.tsx @@ -0,0 +1,39 @@ +import type { ColumnDef } from '@tanstack/react-table'; +import dayjs from 'dayjs'; +import localizedFormat from 'dayjs/plugin/localizedFormat'; +import utc from 'dayjs/plugin/utc'; +import type { RouteName } from 'ziggy-js'; + +import { formatDate } from '@/common/utils/l10n/formatDate'; + +import { DataTableColumnHeader } from '../../components/DataTableColumnHeader'; + +dayjs.extend(utc); +dayjs.extend(localizedFormat); + +interface BuildLastUpdatedColumnDefProps { + tableApiRouteName?: RouteName; +} + +export function buildLastUpdatedColumnDef({ + tableApiRouteName = 'api.game.index', +}: BuildLastUpdatedColumnDefProps): ColumnDef{formatDate(dayjs.utc(date), 'll')}
; + }, + }; +} diff --git a/resources/js/features/game-list/utils/column-definitions/buildNumUnresolvedTicketsColumnDef.tsx b/resources/js/features/game-list/utils/column-definitions/buildNumUnresolvedTicketsColumnDef.tsx new file mode 100644 index 0000000000..256e860bdb --- /dev/null +++ b/resources/js/features/game-list/utils/column-definitions/buildNumUnresolvedTicketsColumnDef.tsx @@ -0,0 +1,41 @@ +import type { ColumnDef } from '@tanstack/react-table'; +import type { RouteName } from 'ziggy-js'; + +import { formatNumber } from '@/common/utils/l10n/formatNumber'; + +import { DataTableColumnHeader } from '../../components/DataTableColumnHeader'; + +interface BuildNumUnresolvedTicketsColumnDefProps { + tableApiRouteName?: RouteName; +} + +export function buildNumUnresolvedTicketsColumnDef({ + tableApiRouteName = 'api.game.index', +}: BuildNumUnresolvedTicketsColumnDefProps): ColumnDef+ {formatNumber(numVisibleLeaderboards)} +
+ ); + }, + }; +} diff --git a/resources/js/features/game-list/utils/column-definitions/buildPlayerGameProgressColumnDef.tsx b/resources/js/features/game-list/utils/column-definitions/buildPlayerGameProgressColumnDef.tsx new file mode 100644 index 0000000000..c69ae7cab9 --- /dev/null +++ b/resources/js/features/game-list/utils/column-definitions/buildPlayerGameProgressColumnDef.tsx @@ -0,0 +1,33 @@ +import type { ColumnDef } from '@tanstack/react-table'; +import type { RouteName } from 'ziggy-js'; + +import { PlayerGameProgressBar } from '@/common/components/PlayerGameProgressBar'; + +import { DataTableColumnHeader } from '../../components/DataTableColumnHeader'; + +interface BuildPlayerGameProgressColumnDefProps { + tableApiRouteName?: RouteName; +} + +export function buildPlayerGameProgressColumnDef({ + tableApiRouteName = 'api.game.index', +}: BuildPlayerGameProgressColumnDefProps): ColumnDef{formatNumber(playersTotal)}
; + }, + }; +} diff --git a/resources/js/features/game-list/utils/column-definitions/buildPointsTotalColumnDef.tsx b/resources/js/features/game-list/utils/column-definitions/buildPointsTotalColumnDef.tsx new file mode 100644 index 0000000000..66a3ec494d --- /dev/null +++ b/resources/js/features/game-list/utils/column-definitions/buildPointsTotalColumnDef.tsx @@ -0,0 +1,44 @@ +import type { ColumnDef } from '@tanstack/react-table'; +import type { RouteName } from 'ziggy-js'; + +import { WeightedPointsContainer } from '@/common/components/WeightedPointsContainer'; +import { formatNumber } from '@/common/utils/l10n/formatNumber'; + +import { DataTableColumnHeader } from '../../components/DataTableColumnHeader'; + +interface BuildPointsTotalColumnDefProps { + tableApiRouteName?: RouteName; +} + +export function buildPointsTotalColumnDef({ + tableApiRouteName = 'api.game.index', +}: BuildPointsTotalColumnDefProps): ColumnDef{pointsTotal}
; + } + + return ( +unknown
; + } + + const dayjsDate = dayjs.utc(date); + let formattedDate; + if (granularity === 'day') { + formattedDate = formatDate(dayjsDate, 'll'); + } else if (granularity === 'month') { + formattedDate = dayjsDate.format('MMM YYYY'); + } else { + formattedDate = dayjsDate.format('YYYY'); + } + + return{formattedDate}
; + }, + }; +} diff --git a/resources/js/features/game-list/utils/column-definitions/buildRetroRatioColumnDef.tsx b/resources/js/features/game-list/utils/column-definitions/buildRetroRatioColumnDef.tsx new file mode 100644 index 0000000000..54f740674f --- /dev/null +++ b/resources/js/features/game-list/utils/column-definitions/buildRetroRatioColumnDef.tsx @@ -0,0 +1,39 @@ +import type { ColumnDef } from '@tanstack/react-table'; +import type { RouteName } from 'ziggy-js'; + +import { DataTableColumnHeader } from '../../components/DataTableColumnHeader'; + +interface BuildRetroRatioColumnDefProps { + tableApiRouteName?: RouteName; +} + +export function buildRetroRatioColumnDef({ + tableApiRouteName = 'api.game.index', +}: BuildRetroRatioColumnDefProps): ColumnDefnone
; + } + + const pointsWeighted = row.original.game?.pointsWeighted ?? 0; + + const result = pointsWeighted / pointsTotal; + + return×{(Math.round((result + Number.EPSILON) * 100) / 100).toFixed(2)}
; + }, + }; +} diff --git a/resources/js/features/game-list/utils/column-definitions/buildRowActionsColumnDef.tsx b/resources/js/features/game-list/utils/column-definitions/buildRowActionsColumnDef.tsx new file mode 100644 index 0000000000..ab2d1eb01b --- /dev/null +++ b/resources/js/features/game-list/utils/column-definitions/buildRowActionsColumnDef.tsx @@ -0,0 +1,15 @@ +import type { ColumnDef } from '@tanstack/react-table'; + +import { DataTableRowActions } from '../../components/DataTableRowActions'; + +export function buildRowActionsColumnDef(): ColumnDef