webapp/components/tool-configuration-dialog.tsx (97 lines of code) (raw):
import React from "react";
import { Button } from "@/components/ui/button";
import {
Dialog,
DialogContent,
DialogFooter,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { Textarea } from "@/components/ui/textarea";
import { toolTemplates } from "@/lib/tool-templates";
import { BackendTag } from "./backend-tag";
interface ToolConfigurationDialogProps {
open: boolean;
onOpenChange: (open: boolean) => void;
editingIndex: number | null;
selectedTemplate: string;
editingSchemaStr: string;
isJsonValid: boolean;
onTemplateChange: (val: string) => void;
onSchemaChange: (val: string) => void;
onSave: () => void;
backendTools: any[]; // schemas returned from the server
}
export const ToolConfigurationDialog: React.FC<
ToolConfigurationDialogProps
> = ({
open,
onOpenChange,
editingIndex,
selectedTemplate,
editingSchemaStr,
isJsonValid,
onTemplateChange,
onSchemaChange,
onSave,
backendTools,
}) => {
// Combine local templates and backend templates
const localTemplateOptions = toolTemplates.map((template) => ({
...template,
source: "local",
}));
const backendTemplateOptions = backendTools.map((t: any) => ({
...t,
source: "backend",
}));
const allTemplates = [...localTemplateOptions, ...backendTemplateOptions];
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="sm:max-w-lg">
<DialogHeader>
<DialogTitle>
{editingIndex === null ? "Add Tool" : "Edit Tool"}
</DialogTitle>
</DialogHeader>
<div className="space-y-4 py-4">
<Select value={selectedTemplate} onValueChange={onTemplateChange}>
<SelectTrigger>
<SelectValue placeholder="Select a template (optional)" />
</SelectTrigger>
<SelectContent>
{allTemplates.map((template) => (
<SelectItem key={template.name} value={template.name}>
<span className="flex items-center">
{template.name}
{template.source === "backend" && <BackendTag />}
</span>
</SelectItem>
))}
</SelectContent>
</Select>
<Textarea
className="min-h-[200px] font-mono text-sm"
value={editingSchemaStr}
onChange={(e) => onSchemaChange(e.target.value)}
placeholder="Enter tool JSON schema"
/>
</div>
<DialogFooter>
<Button variant="outline" onClick={() => onOpenChange(false)}>
Cancel
</Button>
<Button onClick={onSave} disabled={!isJsonValid}>
Save Changes
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
);
};