import SortableColumns from '@/components/common/SortableColumns' import LocalisedText from '@/components/LocalisedText' import PrefetchLink from '@/components/PrefetchLink' import CountsRowNumber from '@/components/counts/CountsRowNumber' import CountsNestedTable from '@/components/counts/CountsNestedTable' import CountsSortHeader from '@/components/counts/CountsSortHeader' import CountsResizeHandle from '@/components/counts/CountsResizeHandle' import CountsSelectableTable from '@/components/counts/CountsSelectableTable' import PostThumbnailPreview from '@/components/posts/PostThumbnailPreview' import { changeCountSort, countColumns, countsRequestParams, fieldsForCounts, readCountSort, selectedCountColumns, writeCountSort } from '@/lib/counts' import { countsCellCopy, countsCellText, countsDetailClipboardTable, countsImageURL, countsNestedRows } from '@/lib/countsDisplay' import useDialogue from '@/lib/dialogues/useDialogue' import { useLocale } from '@/lib/useLocale' import { useCountsDefinition } from '@/lib/countsDefinitions' import { useUITranslation } from '@/lib/useUITranslation' import type { CountColumn, CountsResource, CountsResult, CountsVersion } from '@/lib/counts' const CountsResults = ( { resource, data, params, pending, update }: { resource: CountsResource data: CountsResult params: URLSearchParams pending: boolean update: (key: string, value: string) => void }, ) => { const definition = useCountsDefinition () const { label, message } = useUITranslation ('counts') const locale = useLocale () const dialogue = useDialogue () const columns = selectedCountColumns (resource, params, definition) const rowNumbers = params.get ('row_numbers') === '1' const fields = fieldsForCounts (resource, definition) const sorts = readCountSort (params.get ('sort') ?? 'created_at:desc') const sort = (key: string, additive: boolean) => update ('sort', writeCountSort (changeCountSort (sorts, key, additive))) const cell = (row: CountsVersion, column: CountColumn) => { const field = fields.find (field => field.key === column)! const value = countsCellText (row, column, locale, params) if (field.children != null) { return } switch (column) { case 'resource_id': if (resource === 'nico_tags') return row.name ? ( {row.resourceId}) : row.resourceId if (resource === 'tag_groups') return {row.resourceId} return {row.resourceId} case 'name': return resource === 'nico_tags' && row.name ? ( {value}) : value case 'thumbnail': { const url = countsImageURL (row.thumbnailBase) return url == null ? null : ( ) } case 'url': case 'thumbnail_base': return {value} case 'is_latest': return {value} case 'user': return row.createdByUser?.name ? value : ( {value}) case 'event_type': return {value} case 'category': return {value} default: return value } } return message (fields.find (field => field.key === key)!.label)} onChange={next => { const all = fields.map (field => field.key) const other = (params.get ('order') ?? '').split (' ').filter (key => !all.includes (key)) update ('order', [...next, ...all.filter (key => !next.includes (key)), ...other].join (' ')) }}>{columns => { const tableColumns = rowNumbers ? ['row_number', ...columns] : columns return (
{tableColumns.length === 0 ?

{label ('nested.noColumns')}

: ( countsDetailClipboardTable (data.versions ?? [], columns.map (column => fields.find (field => field.key === column)!), params, locale, rowNumbers ? (data.page - 1) * data.limit + 1 : null)} identity={`${resource}:${countsRequestParams (params)}:${tableColumns.join (' ')}:${ (data.versions ?? []).map (row => row.id)}`} className="text-left text-sm"> {rowNumbers && } {columns.map (column => column === 'thumbnail' ? {label (countColumns[column])} : field.key === column)!.label)} dragId={column} sorts={sorts} change={sort} structured={fields.find ( field => field.key === column)?.children != null}/>)} {(data.versions ?? []).map ((row, index) => ( {rowNumbers && } {columns.map (column => ( field.key === column)!, params, locale)}> {cell (row, column)}))} ))} )} {(data.versions?.length ?? 0) === 0 &&

{label ('empty')}

}
) }}
} export default CountsResults