Skip to content

Commit b730a4c

Browse files
committed
feat: properly handle validation and scroll to problem
1 parent 2190bee commit b730a4c

File tree

2 files changed

+54
-18
lines changed

2 files changed

+54
-18
lines changed

src/client/Preview.tsx

Lines changed: 53 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import { Button } from "@/client/components/Button";
2-
import { DynamicParameter } from "@/client/components/DynamicParameter";
2+
import {
3+
DynamicParameter,
4+
useValidationSchemaForDynamicParameters,
5+
} from "@/client/components/DynamicParameter";
36
import {
47
ResizableHandle,
58
ResizablePanel,
@@ -491,6 +494,7 @@ const LogsEmptyState = () => {
491494

492495
type LogProps = { log: ParserLog };
493496
const Log: FC<LogProps> = ({ log }) => {
497+
const [open, setIsOpen] = useState(() => false);
494498
const data = Object.entries(log).reduce<Record<string, unknown>>(
495499
(acc, [key, value]) => {
496500
acc[key] = value;
@@ -500,8 +504,9 @@ const Log: FC<LogProps> = ({ log }) => {
500504
);
501505

502506
return (
503-
<TableDrawer data={data}>
507+
<TableDrawer data={data} open={open} onOpenChange={setIsOpen}>
504508
<button
509+
onClick={() => setIsOpen(() => true)}
505510
className={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",
507512
log.level.toLowerCase() === "info" && "border-l-content-link",
@@ -585,26 +590,24 @@ const UserSelect: FC = () => {
585590
type TableDrawerProps = {
586591
data: Record<string, unknown>;
587592
headers?: [string, string];
588-
} & PropsWithChildren;
593+
} & PropsWithChildren &
594+
Dialog.DialogProps;
589595

590596
const TableDrawer: FC<TableDrawerProps> = ({
591597
data,
592598
headers = ["field", "value"],
593599
children,
600+
open,
601+
onOpenChange,
602+
...rest
594603
}) => {
595-
const [showTable, setShowTable] = useState(() => false);
596-
597604
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}
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

687690
const ViewOutput: FC = () => {
688691
const $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

695721
const data = useMemo(
696722
() =>
@@ -702,8 +728,17 @@ const ViewOutput: FC = () => {
702728
);
703729

704730
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+
>
707742
<SearchCodeIcon />
708743
View output
709744
</Button>

src/client/components/DynamicParameter.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ export const DynamicParameter: FC<DynamicParameterProps> = ({
7878
<div
7979
className="flex w-full flex-col gap-2"
8080
data-testid={`parameter-field-${parameter.name}`}
81+
id={parameter.name}
8182
>
8283
<ParameterLabel
8384
id={id}

0 commit comments

Comments
 (0)