diff --git a/apps/start/src/components/events/table/index.tsx b/apps/start/src/components/events/table/index.tsx index 95ed8e2d..c545ee80 100644 --- a/apps/start/src/components/events/table/index.tsx +++ b/apps/start/src/components/events/table/index.tsx @@ -1,3 +1,17 @@ +import type { IServiceEvent } from '@openpanel/db'; +import type { UseInfiniteQueryResult } from '@tanstack/react-query'; +import type { Table } from '@tanstack/react-table'; +import { getCoreRowModel, useReactTable } from '@tanstack/react-table'; +import { useWindowVirtualizer } from '@tanstack/react-virtual'; +import type { TRPCInfiniteData } from '@trpc/tanstack-react-query'; +import { format } from 'date-fns'; +import { CalendarIcon, Loader2Icon } from 'lucide-react'; +import { parseAsIsoDateTime, useQueryState } from 'nuqs'; +import { last } from 'ramda'; +import { memo, useCallback, useEffect, useMemo, useRef } from 'react'; +import { useInViewport } from 'react-in-viewport'; +import EventListener from '../event-listener'; +import { useColumns } from './columns'; import { FullPageEmptyState } from '@/components/full-page-empty-state'; import { OverviewFilterButton, @@ -12,20 +26,6 @@ import { useAppParams } from '@/hooks/use-app-params'; import { pushModal } from '@/modals'; import type { RouterInputs, RouterOutputs } from '@/trpc/client'; import { cn } from '@/utils/cn'; -import type { IServiceEvent } from '@openpanel/db'; -import type { UseInfiniteQueryResult } from '@tanstack/react-query'; -import type { Table } from '@tanstack/react-table'; -import { getCoreRowModel, useReactTable } from '@tanstack/react-table'; -import { useWindowVirtualizer } from '@tanstack/react-virtual'; -import type { TRPCInfiniteData } from '@trpc/tanstack-react-query'; -import { format } from 'date-fns'; -import { CalendarIcon, FilterIcon, Loader2Icon } from 'lucide-react'; -import { parseAsIsoDateTime, useQueryState } from 'nuqs'; -import { last } from 'ramda'; -import { memo, useEffect, useMemo, useRef } from 'react'; -import { useInViewport } from 'react-in-viewport'; -import EventListener from '../event-listener'; -import { useColumns } from './columns'; type Props = { query: UseInfiniteQueryResult< @@ -54,6 +54,7 @@ interface VirtualRowProps { scrollMargin: number; isLoading: boolean; headerColumnsHash: string; + onRowClick?: (row: any) => void; } const VirtualRow = memo( @@ -63,12 +64,26 @@ const VirtualRow = memo( headerColumns, scrollMargin, isLoading, + onRowClick, }: VirtualRowProps) { return (
{ + if ((e.target as HTMLElement).closest('a, button')) { + return; + } + onRowClick(row); + } + : undefined + } ref={virtualRow.measureElement} - className="absolute top-0 left-0 w-full border-b hover:bg-muted/50 transition-colors group/row" style={{ transform: `translateY(${virtualRow.start - scrollMargin}px)`, display: 'grid', @@ -83,8 +98,8 @@ const VirtualRow = memo( const width = `${cell.column.getSize()}px`; return (
{ + onRowClick, +}: VirtualizedEventsTableProps & { onRowClick?: (row: any) => void }) => { const parentRef = useRef(null); const headerColumns = table.getAllLeafColumns().filter((col) => { @@ -145,12 +162,12 @@ const VirtualizedEventsTable = ({ const headerColumnsHash = headerColumns.map((col) => col.id).join(','); return (
{/* Table Header */}
)} @@ -194,20 +211,23 @@ const VirtualizedEventsTable = ({ > {virtualRows.map((virtualRow) => { const row = table.getRowModel().rows[virtualRow.index]; - if (!row) return null; + if (!row) { + return null; + } return ( ); })} @@ -220,6 +240,14 @@ export const EventsTable = ({ query, showEventListener = false }: Props) => { const { isLoading } = query; const columns = useColumns(); + const handleRowClick = useCallback((row: any) => { + pushModal('EventDetails', { + id: row.original.id, + createdAt: row.original.createdAt, + projectId: row.original.projectId, + }); + }, []); + const data = useMemo(() => { if (isLoading) { return LOADING_DATA; @@ -273,13 +301,22 @@ export const EventsTable = ({ query, showEventListener = false }: Props) => { return ( <> - - -
+ + +
@@ -301,17 +338,17 @@ function EventsTableToolbar({ const { projectId } = useAppParams(); const [startDate, setStartDate] = useQueryState( 'startDate', - parseAsIsoDateTime, + parseAsIsoDateTime ); const [endDate, setEndDate] = useQueryState('endDate', parseAsIsoDateTime); return (
- {showEventListener && query.refetch()} />} + {showEventListener && ( + query.refetch()} /> + )}