@@ -61,6 +61,7 @@ import { docsPath, EnvironmentParamSchema, v3BillingPath } from "~/utils/pathBui
6161import { PauseEnvironmentService } from "~/v3/services/pauseEnvironment.server" ;
6262import { PauseQueueService } from "~/v3/services/pauseQueue.server" ;
6363import { useCurrentPlan } from "../_app.orgs.$organizationSlug/route" ;
64+ import { Header3 } from "~/components/primitives/Headers" ;
6465
6566const SearchParamsSchema = z . object ( {
6667 page : z . coerce . number ( ) . min ( 1 ) . default ( 1 ) ,
@@ -310,6 +311,36 @@ export default function Page() {
310311 < TableHeaderCell > Name</ TableHeaderCell >
311312 < TableHeaderCell alignment = "right" > Queued</ TableHeaderCell >
312313 < TableHeaderCell alignment = "right" > Running/limit</ TableHeaderCell >
314+ < TableHeaderCell
315+ alignment = "right"
316+ tooltip = {
317+ < div className = "max-w-xs space-y-2 p-1 text-left" >
318+ < div className = "space-y-0.5" >
319+ < Header3 > Environment</ Header3 >
320+ < Paragraph
321+ variant = "small"
322+ className = "!text-wrap text-text-dimmed"
323+ spacing
324+ >
325+ This queue is limited by your environment's concurrency limit of{ " " }
326+ { environment . concurrencyLimit } .
327+ </ Paragraph >
328+ </ div >
329+ < div className = "space-y-0.5" >
330+ < Header3 > User</ Header3 >
331+ < Paragraph
332+ variant = "small"
333+ className = "!text-wrap text-text-dimmed"
334+ spacing
335+ >
336+ This queue is limited by a concurrency limit set in your code.
337+ </ Paragraph >
338+ </ div >
339+ </ div >
340+ }
341+ >
342+ Limited by
343+ </ TableHeaderCell >
313344 < TableHeaderCell
314345 alignment = "right"
315346 tooltip = {
@@ -343,88 +374,103 @@ export default function Page() {
343374 </ TableHeader >
344375 < TableBody >
345376 { queues . length > 0 ? (
346- queues . map ( ( queue ) => (
347- < TableRow key = { queue . name } >
348- < TableCell >
349- < span className = "flex items-center gap-2" >
350- { queue . type === "task" ? (
351- < SimpleTooltip
352- button = {
353- < TaskIconSmall
354- className = { cn (
355- "size-[1.125rem] text-blue-500" ,
356- queue . paused && "opacity-50"
357- ) }
358- />
359- }
360- content = { `This queue was automatically created from your "${ queue . name } " task` }
361- />
362- ) : (
363- < SimpleTooltip
364- button = {
365- < RectangleStackIcon
366- className = { cn (
367- "size-[1.125rem] text-purple-500" ,
368- queue . paused && "opacity-50"
369- ) }
370- />
371- }
372- content = { `This is a custom queue you added in your code.` }
373- />
374- ) }
375- < span className = { queue . paused ? "opacity-50" : undefined } >
376- { queue . name }
377+ queues . map ( ( queue ) => {
378+ const limit = queue . concurrencyLimit ?? environment . concurrencyLimit ;
379+ const isAtLimit = queue . running === limit ;
380+ return (
381+ < TableRow key = { queue . name } >
382+ < TableCell >
383+ < span className = "flex items-center gap-2" >
384+ { queue . type === "task" ? (
385+ < SimpleTooltip
386+ button = {
387+ < TaskIconSmall
388+ className = { cn (
389+ "size-[1.125rem] text-blue-500" ,
390+ queue . paused && "opacity-50"
391+ ) }
392+ />
393+ }
394+ content = { `This queue was automatically created from your "${ queue . name } " task` }
395+ />
396+ ) : (
397+ < SimpleTooltip
398+ button = {
399+ < RectangleStackIcon
400+ className = { cn (
401+ "size-[1.125rem] text-purple-500" ,
402+ queue . paused && "opacity-50"
403+ ) }
404+ />
405+ }
406+ content = { `This is a custom queue you added in your code.` }
407+ />
408+ ) }
409+ < span className = { queue . paused ? "opacity-50" : undefined } >
410+ { queue . name }
411+ </ span >
412+ { queue . paused ? (
413+ < Badge variant = "extra-small" className = "text-warning" >
414+ Paused
415+ </ Badge >
416+ ) : null }
417+ { isAtLimit ? (
418+ < Badge variant = "extra-small" className = "text-warning" >
419+ At concurrency limit
420+ </ Badge >
421+ ) : null }
377422 </ span >
378- { queue . paused ? (
379- < Badge variant = "extra-small" className = "text-warning" >
380- Paused
381- </ Badge >
382- ) : null }
383- { queue . running === queue . concurrencyLimit ? (
384- < Badge variant = "extra-small" className = "text-warning" >
385- At concurrency limit
386- </ Badge >
387- ) : null }
388- </ span >
389- </ TableCell >
390- < TableCell
391- alignment = "right"
392- className = { queue . paused ? "opacity-50" : undefined }
393- >
394- { queue . queued }
395- </ TableCell >
396- < TableCell
397- alignment = "right"
398- className = { cn (
399- queue . paused ? "opacity-50" : undefined ,
400- queue . running === queue . concurrencyLimit && "text-warning"
401- ) }
402- >
403- { queue . running } /
404- { queue . concurrencyLimit ?? (
423+ </ TableCell >
424+ < TableCell
425+ alignment = "right"
426+ className = { queue . paused ? "opacity-50" : undefined }
427+ >
428+ { queue . queued }
429+ </ TableCell >
430+ < TableCell
431+ alignment = "right"
432+ className = { cn (
433+ queue . paused ? "tabular-nums opacity-50" : undefined ,
434+ isAtLimit && "text-warning"
435+ ) }
436+ >
437+ { queue . running } /
405438 < span
406439 className = { cn (
407- "text-text-dimmed" ,
408- queue . running === queue . concurrencyLimit && "text-warning"
440+ "tabular-nums text-text-dimmed" ,
441+ isAtLimit && "text-warning"
409442 ) }
410443 >
411- { environment . concurrencyLimit } (Max)
444+ { limit }
412445 </ span >
413- ) }
414- </ TableCell >
415- < TableCell
416- alignment = "right"
417- className = { queue . paused ? "opacity-50" : undefined }
418- >
419- { queue . releaseConcurrencyOnWaitpoint ? "Yes" : "No" }
420- </ TableCell >
421- < TableCellMenu
422- isSticky
423- visibleButtons = { queue . paused && < QueuePauseResumeButton queue = { queue } /> }
424- hiddenButtons = { ! queue . paused && < QueuePauseResumeButton queue = { queue } /> }
425- />
426- </ TableRow >
427- ) )
446+ </ TableCell >
447+ < TableCell
448+ alignment = "right"
449+ className = { cn (
450+ queue . paused ? "opacity-50" : undefined ,
451+ isAtLimit && "text-warning"
452+ ) }
453+ >
454+ { queue . concurrencyLimit ? "User" : "Environment" }
455+ </ TableCell >
456+ < TableCell
457+ alignment = "right"
458+ className = { queue . paused ? "opacity-50" : undefined }
459+ >
460+ { queue . releaseConcurrencyOnWaitpoint ? "Yes" : "No" }
461+ </ TableCell >
462+ < TableCellMenu
463+ isSticky
464+ visibleButtons = {
465+ queue . paused && < QueuePauseResumeButton queue = { queue } />
466+ }
467+ hiddenButtons = {
468+ ! queue . paused && < QueuePauseResumeButton queue = { queue } />
469+ }
470+ />
471+ </ TableRow >
472+ ) ;
473+ } )
428474 ) : (
429475 < TableRow >
430476 < TableCell colSpan = { 6 } >
0 commit comments