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