@@ -61,6 +61,7 @@ import { docsPath, EnvironmentParamSchema, v3BillingPath } from "~/utils/pathBui
61
61
import { PauseEnvironmentService } from "~/v3/services/pauseEnvironment.server" ;
62
62
import { PauseQueueService } from "~/v3/services/pauseQueue.server" ;
63
63
import { useCurrentPlan } from "../_app.orgs.$organizationSlug/route" ;
64
+ import { Header3 } from "~/components/primitives/Headers" ;
64
65
65
66
const SearchParamsSchema = z . object ( {
66
67
page : z . coerce . number ( ) . min ( 1 ) . default ( 1 ) ,
@@ -310,6 +311,36 @@ export default function Page() {
310
311
< TableHeaderCell > Name</ TableHeaderCell >
311
312
< TableHeaderCell alignment = "right" > Queued</ TableHeaderCell >
312
313
< 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 >
313
344
< TableHeaderCell
314
345
alignment = "right"
315
346
tooltip = {
@@ -343,88 +374,103 @@ export default function Page() {
343
374
</ TableHeader >
344
375
< TableBody >
345
376
{ 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 }
377
422
</ 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 } /
405
438
< span
406
439
className = { cn (
407
- "text-text-dimmed" ,
408
- queue . running === queue . concurrencyLimit && "text-warning"
440
+ "tabular-nums text-text-dimmed" ,
441
+ isAtLimit && "text-warning"
409
442
) }
410
443
>
411
- { environment . concurrencyLimit } (Max)
444
+ { limit }
412
445
</ 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
+ } )
428
474
) : (
429
475
< TableRow >
430
476
< TableCell colSpan = { 6 } >
0 commit comments