import {Fragment, useMemo, useRef} from 'react'; import EmptyStateWarning from 'sentry/components/emptyStateWarning'; import {GridResizer} from 'sentry/components/gridEditable/styles'; import LoadingIndicator from 'sentry/components/loadingIndicator'; import Pagination from 'sentry/components/pagination'; import {Tooltip} from 'sentry/components/tooltip'; import {IconArrow} from 'sentry/icons/iconArrow'; import {IconWarning} from 'sentry/icons/iconWarning'; import {t} from 'sentry/locale'; import {defined} from 'sentry/utils'; import {fieldAlignment, prettifyTagKey} from 'sentry/utils/discover/fields'; import { Table, TableBody, TableBodyCell, TableHead, TableHeadCell, TableHeadCellContent, TableRow, TableStatus, useTableStyles, } from 'sentry/views/explore/components/table'; import { useExploreFields, useExploreSortBys, useSetExploreSortBys, } from 'sentry/views/explore/contexts/pageParamsContext'; import {useSpanTags} from 'sentry/views/explore/contexts/spanTagsContext'; import type {SpansTableResult} from 'sentry/views/explore/hooks/useExploreSpansTable'; import {FieldRenderer} from './fieldRenderer'; interface SpansTableProps { spansTableResult: SpansTableResult; } export function SpansTable({spansTableResult}: SpansTableProps) { const fields = useExploreFields(); const sortBys = useExploreSortBys(); const setSortBys = useSetExploreSortBys(); const visibleFields = useMemo( () => (fields.includes('id') ? fields : ['id', ...fields]), [fields] ); const {result, eventView} = spansTableResult; const columnsFromEventView = useMemo(() => eventView.getColumns(), [eventView]); const tableRef = useRef(null); const {initialTableStyles, onResizeMouseDown} = useTableStyles( visibleFields, tableRef, { minimumColumnWidth: 50, } ); const meta = result.meta ?? {}; const numberTags = useSpanTags('number'); const stringTags = useSpanTags('string'); return ( {visibleFields.map((field, i) => { // Hide column names before alignment is determined if (result.isPending) { return ; } const fieldType = meta.fields?.[field]; const align = fieldAlignment(field, fieldType); const tag = stringTags[field] ?? numberTags[field] ?? null; const direction = sortBys.find(s => s.field === field)?.kind; function updateSort() { const kind = direction === 'desc' ? 'asc' : 'desc'; setSortBys([{field, kind}]); } const label = tag?.name ?? prettifyTagKey(field); return ( {label} {defined(direction) && ( )} {i !== visibleFields.length - 1 && ( onResizeMouseDown(e, i)} /> )} ); })} {result.isPending ? ( ) : result.isError ? ( ) : result.isFetched && result.data?.length ? ( result.data?.map((row, i) => ( {visibleFields.map((field, j) => { return ( ); })} )) ) : (

{t('No spans found')}

)}
); }