11import  {  Button  }  from  "@/client/components/Button" ; 
2- import  {  DynamicParameter  }  from  "@/client/components/DynamicParameter" ; 
2+ import  { 
3+ DynamicParameter , 
4+ useValidationSchemaForDynamicParameters , 
5+ }  from  "@/client/components/DynamicParameter" ; 
36import  { 
47ResizableHandle , 
58ResizablePanel , 
@@ -491,6 +494,7 @@ const LogsEmptyState = () => {
491494
492495type  LogProps  =  {  log : ParserLog  } ; 
493496const  Log : FC < LogProps >  =  ( {  log } )  =>  { 
497+ const  [ open ,  setIsOpen ]  =  useState ( ( )  =>  false ) ; 
494498const  data  =  Object . entries ( log ) . reduce < Record < string ,  unknown > > ( 
495499( acc ,  [ key ,  value ] )  =>  { 
496500acc [ key ]  =  value ; 
@@ -500,8 +504,9 @@ const Log: FC<LogProps> = ({ log }) => {
500504) ; 
501505
502506return  ( 
503- < TableDrawer  data = { data } > 
507+ < TableDrawer  data = { data }   open = { open }   onOpenChange = { setIsOpen } > 
504508< button 
509+ onClick = { ( )  =>  setIsOpen ( ( )  =>  true ) } 
505510className = { cn ( 
506511"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" , 
507512log . level . toLowerCase ( )  ===  "info"  &&  "border-l-content-link" , 
@@ -585,26 +590,24 @@ const UserSelect: FC = () => {
585590type  TableDrawerProps  =  { 
586591data : Record < string ,  unknown > ; 
587592headers ?: [ string ,  string ] ; 
588- }  &  PropsWithChildren ; 
593+ }  &  PropsWithChildren  & 
594+ Dialog . DialogProps ; 
589595
590596const  TableDrawer : FC < TableDrawerProps >  =  ( { 
591597data, 
592598headers =  [ "field" ,  "value" ] , 
593599children, 
600+ open, 
601+ onOpenChange, 
602+ ...rest 
594603} )  =>  { 
595- const  [ showTable ,  setShowTable ]  =  useState ( ( )  =>  false ) ; 
596- 
597604return  ( 
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 } 
604607
605608< Dialog . Portal  forceMount = { true } > 
606609< AnimatePresence  propagate = { true } > 
607- { showTable  ? ( 
610+ { open  ? ( 
608611< > 
609612< Dialog . Overlay  asChild = { true } > 
610613< motion . div 
@@ -686,11 +689,34 @@ const TableDrawer: FC<TableDrawerProps> = ({
686689
687690const  ViewOutput : FC  =  ( )  =>  { 
688691const  $parameters  =  useStore ( ( state )  =>  state . parameters ) ; 
692+ const  [ isOpen ,  setIsOpen ]  =  useState ( ( )  =>  false ) ; 
689693
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+ } ; 
694720
695721const  data  =  useMemo ( 
696722( )  => 
@@ -702,8 +728,17 @@ const ViewOutput: FC = () => {
702728) ; 
703729
704730return  ( 
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+ > 
707742< SearchCodeIcon  /> 
708743View output
709744</ Button > 
0 commit comments