@@ -32,7 +32,7 @@ import {
3232 type NextRunListItem ,
3333} from "~/presenters/v3/NextRunListPresenter.server" ;
3434import { formatCurrencyAccurate } from "~/utils/numberFormatter" ;
35- import { docsPath , v3RunSpanPath , v3TestPath , v3TestTaskPath } from "~/utils/pathBuilder" ;
35+ import { docsPath , v3RunSpanPath } from "~/utils/pathBuilder" ;
3636import { DateTime } from "../../primitives/DateTime" ;
3737import { Paragraph } from "../../primitives/Paragraph" ;
3838import { Spinner } from "../../primitives/Spinner" ;
@@ -62,7 +62,8 @@ import { TaskTriggerSourceIcon } from "./TaskTriggerSource";
6262import { useOptimisticLocation } from "~/hooks/useOptimisticLocation" ;
6363import { useSearchParams } from "~/hooks/useSearchParam" ;
6464import type { TaskTriggerSource } from "@trigger.dev/database" ;
65- import { BeakerIcon } from "~/assets/icons/BeakerIcon" ;
65+ import { BlankState , NoRuns } from "./TaskRunsTableBlankState" ;
66+ import { useLoaderDisconnected } from "~/hooks/useLoaderDisconnected" ;
6667import { SmartColumnIcon } from "~/assets/icons/SmartColumnIcon" ;
6768import {
6869 parseColumnParams ,
@@ -604,6 +605,8 @@ export function TaskRunsTable({
604605 canCancelRuns = true ,
605606 canReplayRuns = true ,
606607} : RunsTableProps ) {
608+ const disconnected = useLoaderDisconnected ( ) ;
609+ const showLoading = isLoading && ! disconnected ;
607610 const regions = useRegions ( ) ;
608611 const regionByMasterQueue = new Map ( regions . map ( ( r ) => [ r . masterQueue , r ] as const ) ) ;
609612 const organization = useOrganization ( ) ;
@@ -727,10 +730,10 @@ export function TaskRunsTable({
727730 < TableBody >
728731 { total === 0 && ! hasFilters ? (
729732 < TableBlankRow colSpan = { totalColSpan } >
730- { ! isLoading && < NoRuns title = "No runs found" /> }
733+ { ! showLoading && < NoRuns title = "No runs found" /> }
731734 </ TableBlankRow >
732735 ) : runs . length === 0 ? (
733- < BlankState isLoading = { isLoading } filters = { filters } colSpan = { totalColSpan } />
736+ < BlankState isLoading = { showLoading } filters = { filters } colSpan = { totalColSpan } />
734737 ) : (
735738 runs . map ( ( run , index ) => {
736739 const searchParams = new URLSearchParams ( ) ;
@@ -781,7 +784,7 @@ export function TaskRunsTable({
781784 ) ;
782785 } )
783786 ) }
784- { isLoading && (
787+ { showLoading && (
785788 < TableBlankRow
786789 colSpan = { totalColSpan }
787790 className = "absolute left-0 top-0 flex h-full w-full items-center justify-center gap-2 bg-background-dimmed"
@@ -948,73 +951,3 @@ function RunActionsCell({
948951 />
949952 ) ;
950953}
951-
952- function NoRuns ( { title } : { title : string } ) {
953- return (
954- < div className = "flex items-center justify-center" >
955- < Paragraph className = "w-auto" > { title } </ Paragraph >
956- </ div >
957- ) ;
958- }
959-
960- function BlankState ( {
961- isLoading,
962- filters,
963- colSpan,
964- } : Pick < RunsTableProps , "isLoading" | "filters" > & { colSpan : number } ) {
965- const organization = useOrganization ( ) ;
966- const project = useProject ( ) ;
967- const environment = useEnvironment ( ) ;
968- if ( isLoading ) return < TableBlankRow colSpan = { colSpan } /> ;
969-
970- const { tasks, from, to, ...otherFilters } = filters ;
971- const singleTaskFromFilters = filters . tasks . length === 1 ? filters . tasks [ 0 ] : null ;
972- const testPath = singleTaskFromFilters
973- ? v3TestTaskPath ( organization , project , environment , { taskIdentifier : singleTaskFromFilters } )
974- : v3TestPath ( organization , project , environment ) ;
975-
976- if (
977- filters . tasks . length === 1 &&
978- filters . from === undefined &&
979- filters . to === undefined &&
980- Object . values ( otherFilters ) . every ( ( filterArray ) => filterArray . length === 0 )
981- ) {
982- return (
983- < TableBlankRow colSpan = { colSpan } >
984- < Paragraph className = "w-auto" variant = "base/bright" spacing >
985- There are no runs for { filters . tasks [ 0 ] }
986- </ Paragraph >
987- </ TableBlankRow >
988- ) ;
989- }
990-
991- return (
992- < TableBlankRow colSpan = { colSpan } >
993- < div className = "flex flex-col items-center justify-center gap-6" >
994- < Paragraph className = "w-auto" variant = "base/bright" >
995- No runs match your filters. Try refreshing, modifying your filters or run a test.
996- </ Paragraph >
997- < div className = "flex items-center gap-2" >
998- < Button
999- LeadingIcon = { ArrowPathIcon }
1000- variant = "secondary/medium"
1001- onClick = { ( ) => {
1002- window . location . reload ( ) ;
1003- } }
1004- >
1005- Refresh
1006- </ Button >
1007- < Paragraph > or</ Paragraph >
1008- < LinkButton
1009- LeadingIcon = { BeakerIcon }
1010- leadingIconClassName = "text-tests"
1011- variant = "secondary/medium"
1012- to = { testPath }
1013- >
1014- Run a test
1015- </ LinkButton >
1016- </ div >
1017- </ div >
1018- </ TableBlankRow >
1019- ) ;
1020- }
0 commit comments