このコミットが含まれているのは:
2026-10-26 19:16:19 +09:00
コミット c61d9d76e3
12個のファイルの変更、138行の追加、54行の削除
+14 -5
ファイルの表示
@@ -3,7 +3,9 @@ import CountsRowNumber from '@/components/counts/CountsRowNumber'
import CountsSelectableTable from '@/components/counts/CountsSelectableTable'
import CountsSortHeader from '@/components/counts/CountsSortHeader'
import { changeCountSort, countsRequestParams, readCountSort, writeCountSort } from '@/lib/counts'
import { countsFieldLabel, readCountsJSON } from '@/lib/countsDefinitions'
import { countsAxisLabel, countsFieldLabel, readCountsJSON, useCountsDefinition }
from '@/lib/countsDefinitions'
import { useLocale } from '@/lib/useLocale'
import { useUITranslation } from '@/lib/useUITranslation'
import type { CountsResource, CountsResult } from '@/lib/counts'
@@ -15,6 +17,8 @@ const CountsSummaryResults = (
resource: CountsResource; data: CountsResult; params: URLSearchParams
pending: boolean; update: (key: string, value: string) => void },
) => {
const definition = useCountsDefinition ()
const locale = useLocale ()
const { label, message } = useUITranslation ('counts')
const rowNumbers = params.get ('row_numbers') === '1'
const rows = data.rows ?? []
@@ -28,8 +32,10 @@ const CountsSummaryResults = (
if (cols.length === 0 && columnKeys.length === 0) columnKeys.push ('[]')
const sorts = readCountSort (params.get ('sort'))
const display = (value: string | number | null, axis: CountsAxis, index: number): string => {
if (value == null) return ''
if (value == null) return axis.field === 'user' ? message ('bot').text : ''
const logical = data.axisLabels?.[`a${index}`]?.[String (value)]
if (axis.field === 'user') return message ('actorWithId', {
name: logical || message ('notRegistered').text, id: value }).text
if (logical != null) return logical
if (['tags', 'user', 'language_code', 'source_language_code'].includes (axis.field))
return message ('notRegistered').text
@@ -57,13 +63,13 @@ const CountsSummaryResults = (
<thead className="sticky top-0 z-20"><tr>
{rowNumbers && <CountsRowNumber/>}
{rows.map ((axis, index) => <CountsSortHeader key={axis.field} field={`a${index}`}
label={message (countsFieldLabel (axis.field))} sorts={sorts}
label={countsAxisLabel (axis, definition, locale)} sorts={sorts}
change={(key, additive) => update ('sort', writeCountSort (
changeCountSort (sorts, key, additive)))}/>)}
{columnKeys.map ((key, index) => {
const values = JSON.parse (key) as (string | number | null)[]
const name = values.map ((value, position) =>
`${message (countsFieldLabel (cols[position].field)).text}: ${
`${countsAxisLabel (cols[position], definition, locale).text}: ${
display (value, cols[position], rows.length + position)}`).join (' / ')
const sortKey = cols.length === 0 ? 'count' : `measure_${[
...new TextEncoder ().encode (key)].map (byte =>
@@ -83,7 +89,10 @@ const CountsSummaryResults = (
{rowNumbers && <CountsRowNumber value={(data.page - 1) * data.limit + rowIndex + 1}/>}
{rowValues.map ((value, index) => <td key={index}
className="overflow-hidden break-words border px-2 py-1 dark:border-slate-700"
data-counts-copy={display (value, rows[index], index)}>
data-counts-copy={display (value, rows[index], index)}
lang={(value == null && rows[index].field === 'user')
? message ('bot').language : (rows[index].field === 'event_type'
? message (`events.${value}`).language : undefined)}>
{display (value, rows[index], index)}</td>)}
{columnKeys.map (columnKey => {
const columnValues = JSON.parse (columnKey) as (string | number | null)[]