Change how parameters are displayed in task node (#827)

This commit is contained in:
Kerem Yilmaz
2024-09-13 07:47:57 -07:00
committed by GitHub
parent a5adfd3ead
commit d435f1bffa
2 changed files with 71 additions and 48 deletions

View File

@@ -5,18 +5,13 @@ import {
AccordionItem, AccordionItem,
AccordionTrigger, AccordionTrigger,
} from "@/components/ui/accordion"; } from "@/components/ui/accordion";
import { Button } from "@/components/ui/button";
import { Checkbox } from "@/components/ui/checkbox"; import { Checkbox } from "@/components/ui/checkbox";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@/components/ui/popover";
import { Switch } from "@/components/ui/switch"; import { Switch } from "@/components/ui/switch";
import { CodeEditor } from "@/routes/workflows/components/CodeEditor"; import { CodeEditor } from "@/routes/workflows/components/CodeEditor";
import { ListBulletIcon, MixerVerticalIcon } from "@radix-ui/react-icons"; import { useDeleteNodeCallback } from "@/routes/workflows/hooks/useDeleteNodeCallback";
import { ListBulletIcon } from "@radix-ui/react-icons";
import { import {
Edge, Edge,
Handle, Handle,
@@ -27,14 +22,13 @@ import {
useReactFlow, useReactFlow,
} from "@xyflow/react"; } from "@xyflow/react";
import { useState } from "react"; import { useState } from "react";
import { AppNode } from "..";
import { getOutputParameterKey } from "../../workflowEditorUtils";
import { EditableNodeTitle } from "../components/EditableNodeTitle"; import { EditableNodeTitle } from "../components/EditableNodeTitle";
import { NodeActionMenu } from "../NodeActionMenu"; import { NodeActionMenu } from "../NodeActionMenu";
import { TaskNodeDisplayModeSwitch } from "./TaskNodeDisplayModeSwitch"; import { TaskNodeDisplayModeSwitch } from "./TaskNodeDisplayModeSwitch";
import { TaskNodeParametersPanel } from "./TaskNodeParametersPanel"; import { TaskNodeParametersPanel } from "./TaskNodeParametersPanel";
import type { TaskNode, TaskNodeDisplayMode } from "./types"; import type { TaskNode, TaskNodeDisplayMode } from "./types";
import { useDeleteNodeCallback } from "@/routes/workflows/hooks/useDeleteNodeCallback";
import { AppNode } from "..";
import { getOutputParameterKey } from "../../workflowEditorUtils";
function getPreviousNodeIds( function getPreviousNodeIds(
nodes: Array<AppNode>, nodes: Array<AppNode>,
@@ -131,6 +125,15 @@ function TaskNode({ id, data }: NodeProps<TaskNode>) {
className="nopan" className="nopan"
/> />
</div> </div>
<div className="space-y-1">
<TaskNodeParametersPanel
availableOutputParameters={outputParameterKeys}
parameters={data.parameterKeys}
onParametersChange={(parameterKeys) => {
updateNodeData(id, { parameterKeys });
}}
/>
</div>
</> </>
); );
@@ -172,6 +175,15 @@ function TaskNode({ id, data }: NodeProps<TaskNode>) {
className="nopan" className="nopan"
/> />
</div> </div>
<div className="space-y-1">
<TaskNodeParametersPanel
availableOutputParameters={outputParameterKeys}
parameters={data.parameterKeys}
onParametersChange={(parameterKeys) => {
updateNodeData(id, { parameterKeys });
}}
/>
</div>
</div> </div>
</AccordionContent> </AccordionContent>
</AccordionItem> </AccordionItem>
@@ -419,28 +431,10 @@ function TaskNode({ id, data }: NodeProps<TaskNode>) {
}} }}
/> />
</div> </div>
<div className="flex justify-between"> <TaskNodeDisplayModeSwitch
<TaskNodeDisplayModeSwitch value={displayMode}
value={displayMode} onChange={setDisplayMode}
onChange={setDisplayMode} />
/>
<Popover>
<PopoverTrigger asChild>
<Button size="icon" variant="outline">
<MixerVerticalIcon />
</Button>
</PopoverTrigger>
<PopoverContent className="w-72">
<TaskNodeParametersPanel
availableOutputParameters={outputParameterKeys}
parameters={data.parameterKeys}
onParametersChange={(parameterKeys) => {
updateNodeData(id, { parameterKeys });
}}
/>
</PopoverContent>
</Popover>
</div>
{displayMode === "basic" && basicContent} {displayMode === "basic" && basicContent}
{displayMode === "advanced" && advancedContent} {displayMode === "advanced" && advancedContent}

View File

@@ -1,5 +1,13 @@
import { Checkbox } from "@/components/ui/checkbox"; import { Checkbox } from "@/components/ui/checkbox";
import { useWorkflowParametersState } from "../../useWorkflowParametersState"; import { useWorkflowParametersState } from "../../useWorkflowParametersState";
import { Label } from "@/components/ui/label";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
import { QuestionMarkCircledIcon } from "@radix-ui/react-icons";
type Props = { type Props = {
availableOutputParameters: Array<string>; availableOutputParameters: Array<string>;
@@ -16,34 +24,55 @@ function TaskNodeParametersPanel({
const keys = workflowParameters const keys = workflowParameters
.map((parameter) => parameter.key) .map((parameter) => parameter.key)
.concat(availableOutputParameters); .concat(availableOutputParameters);
function toggleParameter(key: string) {
if (parameters.includes(key)) {
onParametersChange(
parameters.filter((parameterKey) => parameterKey !== key),
);
} else {
onParametersChange([...parameters, key]);
}
}
return ( return (
<div className="space-y-4"> <div className="space-y-4">
<header className="space-y-1"> <header className="flex gap-2">
<h1>Parameters</h1> <h1 className="text-xs text-slate-300">Parameters</h1>
<span className="text-xs text-slate-300"> <TooltipProvider>
Check off the parameters you want to use in this task. <Tooltip>
</span> <TooltipTrigger>
<QuestionMarkCircledIcon className="h-4 w-4" />
</TooltipTrigger>
<TooltipContent>
Select the parameters that will be passed to the task.
</TooltipContent>
</Tooltip>
</TooltipProvider>
</header> </header>
<div className="space-y-2"> <div className="flex flex-wrap gap-2">
{keys.map((key) => { {keys.map((key) => {
return ( return (
<div <div
key={key} key={key}
className="flex items-center gap-2 rounded-sm bg-slate-elevation1 px-3 py-2" className="flex cursor-pointer items-center gap-2 rounded-sm bg-slate-elevation1 px-3 py-2"
id={key}
> >
<Checkbox <Checkbox
checked={parameters.includes(key)} checked={parameters.includes(key)}
onCheckedChange={(checked) => { onCheckedChange={() => {
if (checked) { toggleParameter(key);
onParametersChange([...parameters, key]);
} else {
onParametersChange(
parameters.filter((parameterKey) => parameterKey !== key),
);
}
}} }}
/> />
<span className="text-xs">{key}</span> <Label
htmlFor={key}
className="cursor-pointer text-xs"
onClick={() => {
toggleParameter(key);
}}
>
{key}
</Label>
</div> </div>
); );
})} })}