1
1
import { Button } from "@/client/components/Button" ;
2
- import { DynamicParameter } from "@/client/components/DynamicParameter" ;
2
+ import {
3
+ DynamicParameter ,
4
+ useValidationSchemaForDynamicParameters ,
5
+ } from "@/client/components/DynamicParameter" ;
3
6
import {
4
7
ResizableHandle ,
5
8
ResizablePanel ,
@@ -491,6 +494,7 @@ const LogsEmptyState = () => {
491
494
492
495
type LogProps = { log : ParserLog } ;
493
496
const Log : FC < LogProps > = ( { log } ) => {
497
+ const [ open , setIsOpen ] = useState ( ( ) => false ) ;
494
498
const data = Object . entries ( log ) . reduce < Record < string , unknown > > (
495
499
( acc , [ key , value ] ) => {
496
500
acc [ key ] = value ;
@@ -500,8 +504,9 @@ const Log: FC<LogProps> = ({ log }) => {
500
504
) ;
501
505
502
506
return (
503
- < TableDrawer data = { data } >
507
+ < TableDrawer data = { data } open = { open } onOpenChange = { setIsOpen } >
504
508
< button
509
+ onClick = { ( ) => setIsOpen ( ( ) => true ) }
505
510
className = { cn (
506
511
"group grid h-fit min-h-10 w-full grid-cols-8 items-center border-b border-l-4 border-l-content-destructive hover:bg-surface-primary" ,
507
512
log . level . toLowerCase ( ) === "info" && "border-l-content-link" ,
@@ -585,26 +590,24 @@ const UserSelect: FC = () => {
585
590
type TableDrawerProps = {
586
591
data : Record < string , unknown > ;
587
592
headers ?: [ string , string ] ;
588
- } & PropsWithChildren ;
593
+ } & PropsWithChildren &
594
+ Dialog . DialogProps ;
589
595
590
596
const TableDrawer : FC < TableDrawerProps > = ( {
591
597
data,
592
598
headers = [ "field" , "value" ] ,
593
599
children,
600
+ open,
601
+ onOpenChange,
602
+ ...rest
594
603
} ) => {
595
- const [ showTable , setShowTable ] = useState ( ( ) => false ) ;
596
-
597
604
return (
598
- < Dialog . Root
599
- modal = { true }
600
- open = { showTable }
601
- onOpenChange = { ( show ) => setShowTable ( ( ) => show ) }
602
- >
603
- < Dialog . Trigger asChild = { true } > { children } </ Dialog . Trigger >
605
+ < Dialog . Root { ...rest } modal = { true } open = { open } onOpenChange = { onOpenChange } >
606
+ { children }
604
607
605
608
< Dialog . Portal forceMount = { true } >
606
609
< AnimatePresence propagate = { true } >
607
- { showTable ? (
610
+ { open ? (
608
611
< >
609
612
< Dialog . Overlay asChild = { true } >
610
613
< motion . div
@@ -686,11 +689,34 @@ const TableDrawer: FC<TableDrawerProps> = ({
686
689
687
690
const ViewOutput : FC = ( ) => {
688
691
const $parameters = useStore ( ( state ) => state . parameters ) ;
692
+ const [ isOpen , setIsOpen ] = useState ( ( ) => false ) ;
689
693
690
- const isInvalid = useMemo (
691
- ( ) => $parameters . length === 0 || $parameters . some ( ( p ) => ! p . value . valid ) ,
692
- [ $parameters ] ,
693
- ) ;
694
+ const onView = async ( ) => {
695
+ const invalidParameter = $parameters . find ( ( p ) => {
696
+ try {
697
+ if ( ! p . value . valid ) {
698
+ return true ;
699
+ }
700
+
701
+ const schema = useValidationSchemaForDynamicParameters ( [ p ] ) ;
702
+ schema . validateSync ( [ { name : p . name , value : p . value . value } ] ) ;
703
+
704
+ return false ;
705
+ } catch {
706
+ return true ;
707
+ }
708
+ } ) ;
709
+
710
+ if ( invalidParameter ) {
711
+ const parameterFormElement = document . getElementById (
712
+ invalidParameter . name ,
713
+ ) ;
714
+ parameterFormElement ?. scrollIntoView ( { behavior : "smooth" } ) ;
715
+ return ;
716
+ }
717
+
718
+ setIsOpen ( ( ) => true ) ;
719
+ } ;
694
720
695
721
const data = useMemo (
696
722
( ) =>
@@ -702,8 +728,17 @@ const ViewOutput: FC = () => {
702
728
) ;
703
729
704
730
return (
705
- < TableDrawer data = { data } headers = { [ "Parameter" , "Value" ] } >
706
- < Button variant = "default" disabled = { isInvalid } >
731
+ < TableDrawer
732
+ data = { data }
733
+ headers = { [ "Parameter" , "Value" ] }
734
+ open = { isOpen }
735
+ onOpenChange = { ( open ) => setIsOpen ( ( ) => open ) }
736
+ >
737
+ < Button
738
+ variant = "default"
739
+ disabled = { $parameters . length === 0 }
740
+ onClick = { onView }
741
+ >
707
742
< SearchCodeIcon />
708
743
View output
709
744
</ Button >
0 commit comments