import Location from '../../components/Location.vue'; import { Badge } from '../../components/ui/badge'; import { Button } from '../../components/ui/button'; import { Tooltip, TooltipContent, TooltipTrigger } from '../../components/ui/tooltip'; import { ArrowUpDown, FileText, Trash2, X } from 'lucide-vue-next'; import { storeToRefs } from 'pinia'; import { formatDateFilter, openExternalLink } from '../../shared/utils'; import { i18n } from '../../plugin'; import { useInstanceStore, useUiStore, useUserStore, useWorldStore } from '../../stores'; const { t } = i18n.global; const UNACTIONABLE_TYPES = new Set([ 'OnPlayerJoined', 'OnPlayerLeft', 'Location', 'PortalSpawn' ]); export const createColumns = ({ getCreatedAt, onDelete, onDeletePrompt }) => { const { showWorldDialog } = useWorldStore(); const { lookupUser } = useUserStore(); const { showPreviousInstancesInfoDialog } = useInstanceStore(); const { shiftHeld } = storeToRefs(useUiStore()); return [ { id: 'spacer', header: () => null, enableSorting: false, size: 20, minSize: 0, maxSize: 20, cell: () => null }, { accessorFn: (row) => getCreatedAt(row), id: 'created_at', size: 140, header: ({ column }) => ( ), cell: ({ row }) => { const createdAt = getCreatedAt(row.original); const shortText = formatDateFilter(createdAt, 'short'); const longText = formatDateFilter(createdAt, 'long'); return ( {shortText} {longText} ); } }, { accessorKey: 'type', size: 150, header: () => t('table.gameLog.type'), cell: ({ row }) => { const original = row.original; const label = t(`view.game_log.filters.${original.type}`); const isLink = Boolean(original.location) && original.type !== 'Location'; return ( isLink && showWorldDialog(original.location) } > {label} ); } }, { accessorKey: 'displayName', size: 200, header: () => t('table.gameLog.user'), cell: ({ row }) => { const original = row.original; const isFriend = original.isFriend; const isFavorite = original.isFavorite; return ( {original.displayName ? ( lookupUser(original)} > {original.displayName} ) : null} {isFriend ? ( {isFavorite ? '⭐' : '💚'} ) : null} ); } }, { id: 'detail', header: () => t('table.gameLog.detail'), enableSorting: false, minSize: 150, meta: { stretch: true }, cell: ({ row }) => { const original = row.original; if (original.type === 'Location') { return (
); } if (original.type === 'PortalSpawn') { return (
); } if (original.type === 'Event') { return ( {original.data} ); } if (original.type === 'External') { return ( {original.message} ); } if (original.type === 'VideoPlay') { const showLink = original.videoId !== 'LSMedia' && original.videoId !== 'PopcornPalace'; const label = original.videoName || original.videoUrl; return ( {original.videoId ? ( {original.videoId}: ) : null} {showLink ? ( openExternalLink(original.videoUrl) } > {label} ) : ( {original.videoName} )} ); } if ( original.type === 'ImageLoad' || original.type === 'StringLoad' ) { return ( openExternalLink(original.resourceUrl) } > {original.resourceUrl} ); } if ( original.type === 'Notification' || original.type === 'OnPlayerJoined' || original.type === 'OnPlayerLeft' ) { return null; } return ( {original.data} ); } }, { id: 'action', meta: { class: 'text-right' }, size: 90, minSize: 90, maxSize: 90, header: () => t('table.gameLog.action'), enableSorting: false, cell: ({ row }) => { const original = row.original; const canDelete = !UNACTIONABLE_TYPES.has(original.type); const canShowPrevious = original.type === 'Location'; if (!canDelete && !canShowPrevious) { return null; } return (
{canDelete ? ( ) : null} {canShowPrevious ? ( {t('dialog.previous_instances.info')} ) : null}
); } } ]; };