@@ -460,10 +460,12 @@ function CellValueWrapper({
460460 value,
461461 column,
462462 prettyFormatting,
463+ row,
463464} : {
464465 value : unknown ;
465466 column : OutputColumnMetadata ;
466467 prettyFormatting : boolean ;
468+ row ?: Record < string , unknown > ;
467469} ) {
468470 const [ hovered , setHovered ] = useState ( false ) ;
469471
@@ -478,6 +480,7 @@ function CellValueWrapper({
478480 column = { column }
479481 prettyFormatting = { prettyFormatting }
480482 hovered = { hovered }
483+ row = { row }
481484 />
482485 </ span >
483486 ) ;
@@ -491,11 +494,13 @@ function CellValue({
491494 column,
492495 prettyFormatting = true ,
493496 hovered = false ,
497+ row,
494498} : {
495499 value : unknown ;
496500 column : OutputColumnMetadata ;
497501 prettyFormatting ?: boolean ;
498502 hovered ?: boolean ;
503+ row ?: Record < string , unknown > ;
499504} ) {
500505 // Plain text mode - render everything as monospace text with truncation
501506 if ( ! prettyFormatting ) {
@@ -562,12 +567,20 @@ function CellValue({
562567 switch ( column . customRenderType ) {
563568 case "runId" : {
564569 if ( typeof value === "string" ) {
570+ const spanId = row ?. [ "span_id" ] ;
571+ const runPath = v3RunPathFromFriendlyId ( value ) ;
572+ const href = typeof spanId === "string" && spanId
573+ ? `${ runPath } ?span=${ spanId } `
574+ : runPath ;
575+ const tooltip = typeof spanId === "string" && spanId
576+ ? "Jump to span"
577+ : "Jump to run" ;
565578 return (
566579 < SimpleTooltip
567- content = "Jump to run"
580+ content = { tooltip }
568581 disableHoverableContent
569582 hidden = { ! hovered }
570- button = { < TextLink to = { v3RunPathFromFriendlyId ( value ) } > { value } </ TextLink > }
583+ button = { < TextLink to = { href } > { value } </ TextLink > }
571584 />
572585 ) ;
573586 }
@@ -1010,13 +1023,16 @@ export const TSQLResultsTable = memo(function TSQLResultsTable({
10101023 prettyFormatting = true ,
10111024 sorting : defaultSorting = [ ] ,
10121025 showHeaderOnEmpty = false ,
1026+ hiddenColumns,
10131027} : {
10141028 rows : Record < string , unknown > [ ] ;
10151029 columns : OutputColumnMetadata [ ] ;
10161030 prettyFormatting ?: boolean ;
10171031 sorting ?: SortingState ;
10181032 /** When true, show column headers + "No results" on empty data. When false, show a blank state icon. */
10191033 showHeaderOnEmpty ?: boolean ;
1034+ /** Column names to hide from display but keep in row data (useful for linking) */
1035+ hiddenColumns ?: string [ ] ;
10201036} ) {
10211037 const tableContainerRef = useRef < HTMLDivElement > ( null ) ;
10221038
@@ -1030,9 +1046,13 @@ export const TSQLResultsTable = memo(function TSQLResultsTable({
10301046
10311047 // Create TanStack Table column definitions from OutputColumnMetadata
10321048 // Calculate column widths based on content
1049+ const visibleColumns = useMemo (
1050+ ( ) => hiddenColumns ?. length ? columns . filter ( ( col ) => ! hiddenColumns . includes ( col . name ) ) : columns ,
1051+ [ columns , hiddenColumns ]
1052+ ) ;
10331053 const columnDefs = useMemo < ColumnDef < RowData , unknown > [ ] > (
10341054 ( ) =>
1035- columns . map ( ( col ) => ( {
1055+ visibleColumns . map ( ( col ) => ( {
10361056 id : col . name ,
10371057 accessorKey : col . name ,
10381058 header : ( ) => col . name ,
@@ -1041,6 +1061,7 @@ export const TSQLResultsTable = memo(function TSQLResultsTable({
10411061 value = { info . getValue ( ) }
10421062 column = { col }
10431063 prettyFormatting = { prettyFormatting }
1064+ row = { info . row . original }
10441065 />
10451066 ) ,
10461067 meta : {
@@ -1050,7 +1071,7 @@ export const TSQLResultsTable = memo(function TSQLResultsTable({
10501071 size : calculateColumnWidth ( col . name , rows , col ) ,
10511072 filterFn : fuzzyFilter ,
10521073 } ) ) ,
1053- [ columns , rows , prettyFormatting ]
1074+ [ visibleColumns , rows , prettyFormatting ]
10541075 ) ;
10551076
10561077 // Initialize TanStack Table
0 commit comments