@@ -469,8 +469,8 @@ function StandardTaskForm({
469469 </ ResizablePanel >
470470 < ResizableHandle id = "test-task-handle" />
471471 < ResizablePanel id = "test-task-options" min = "285px" default = "285px" max = "360px" >
472- < div className = "h-full" >
473- < Fieldset className = "grow overflow-y-scroll px-3 py-3" >
472+ < div className = "h-full overflow-y-scroll " >
473+ < Fieldset className = "px-3 py-3" >
474474 < InputGroup >
475475 < Label > Delay</ Label >
476476 < DurationPicker name = { delaySeconds . name } id = { delaySeconds . id } />
@@ -484,23 +484,9 @@ function StandardTaskForm({
484484 value = { ttlValue }
485485 onChange = { setTtlValue }
486486 />
487+ < Hint > The run will expire if it hasn't started within the TTL (time to live).</ Hint >
487488 < FormError id = { ttlSeconds . errorId } > { ttlSeconds . error } </ FormError >
488489 </ InputGroup >
489- < InputGroup >
490- < Label htmlFor = { idempotencyKey . id } > Idempotency key</ Label >
491- < Input { ...conform . input ( idempotencyKey , { type : "text" } ) } variant = "small" />
492- < FormError id = { idempotencyKey . errorId } > { idempotencyKey . error } </ FormError >
493- </ InputGroup >
494- < InputGroup >
495- < Label > Idempotency key TTL</ Label >
496- < DurationPicker
497- name = { idempotencyKeyTTLSeconds . name }
498- id = { idempotencyKeyTTLSeconds . id }
499- />
500- < FormError id = { idempotencyKeyTTLSeconds . errorId } >
501- { idempotencyKeyTTLSeconds . error }
502- </ FormError >
503- </ InputGroup >
504490 < InputGroup >
505491 < Label htmlFor = { queue . id } > Queue</ Label >
506492 < Select
@@ -543,14 +529,16 @@ function StandardTaskForm({
543529 < FormError id = { queue . errorId } > { queue . error } </ FormError >
544530 </ InputGroup >
545531 < InputGroup >
546- < Label htmlFor = { concurrencyKey . id } > Concurrency key</ Label >
547- < Input
548- { ...conform . input ( concurrencyKey , { type : "text" } ) }
532+ < Label htmlFor = { tags . id } > Tags</ Label >
533+ < RunTagInput
534+ name = { tags . name }
535+ id = { tags . id }
549536 variant = "small"
550- value = { concurrencyKeyValue ?? "" }
551- onChange = { ( e ) => setConcurrencyKeyValue ( e . target . value ) }
537+ tags = { tagsValue }
538+ onTagsChange = { setTagsValue }
552539 />
553- < FormError id = { concurrencyKey . errorId } > { concurrencyKey . error } </ FormError >
540+ < Hint > Tags enable you to easily filter runs.</ Hint >
541+ < FormError id = { tags . errorId } > { tags . error } </ FormError >
554542 </ InputGroup >
555543 < InputGroup >
556544 < Label htmlFor = { maxAttempts . id } > Max attempts</ Label >
@@ -588,17 +576,6 @@ function StandardTaskForm({
588576 />
589577 < FormError id = { maxDurationSeconds . errorId } > { maxDurationSeconds . error } </ FormError >
590578 </ InputGroup >
591- < InputGroup >
592- < Label htmlFor = { tags . id } > Tags</ Label >
593- < RunTagInput
594- name = { tags . name }
595- id = { tags . id }
596- variant = "small"
597- tags = { tagsValue }
598- onTagsChange = { setTagsValue }
599- />
600- < FormError id = { tags . errorId } > { tags . error } </ FormError >
601- </ InputGroup >
602579 < InputGroup >
603580 < Label htmlFor = { version . id } > Version</ Label >
604581 < Select
@@ -620,6 +597,40 @@ function StandardTaskForm({
620597 ) }
621598 < FormError id = { version . errorId } > { version . error } </ FormError >
622599 </ InputGroup >
600+ < InputGroup >
601+ < Label htmlFor = { idempotencyKey . id } > Idempotency key</ Label >
602+ < Input { ...conform . input ( idempotencyKey , { type : "text" } ) } variant = "small" />
603+ < FormError id = { idempotencyKey . errorId } > { idempotencyKey . error } </ FormError >
604+ < Hint >
605+ Specify an idempotency key to ensure that a task is only triggered once with the
606+ same key.
607+ </ Hint >
608+ </ InputGroup >
609+ < InputGroup >
610+ < Label > Idempotency key TTL</ Label >
611+ < DurationPicker
612+ name = { idempotencyKeyTTLSeconds . name }
613+ id = { idempotencyKeyTTLSeconds . id }
614+ />
615+ < Hint > By default, idempotency keys expire after 30 days.</ Hint >
616+ < FormError id = { idempotencyKeyTTLSeconds . errorId } >
617+ { idempotencyKeyTTLSeconds . error }
618+ </ FormError >
619+ </ InputGroup >
620+ < InputGroup >
621+ < Label htmlFor = { concurrencyKey . id } > Concurrency key</ Label >
622+ < Input
623+ { ...conform . input ( concurrencyKey , { type : "text" } ) }
624+ variant = "small"
625+ value = { concurrencyKeyValue ?? "" }
626+ onChange = { ( e ) => setConcurrencyKeyValue ( e . target . value ) }
627+ />
628+ < Hint >
629+ Concurrency keys enable you limit concurrency by creating a separate queue for
630+ each value of the key.
631+ </ Hint >
632+ < FormError id = { concurrencyKey . errorId } > { concurrencyKey . error } </ FormError >
633+ </ InputGroup >
623634 < FormError > { form . error } </ FormError >
624635 </ Fieldset >
625636 </ div >
0 commit comments