From 0e683a3253d06df345422af2c57bab56412d58ee Mon Sep 17 00:00:00 2001 From: Nikhil-Doye Date: Mon, 27 Oct 2025 16:00:51 -0400 Subject: [PATCH] Add optimization preview and undo functionality in NodeConfiguration component - Introduced state management for optimization preview, allowing users to preview optimized prompts before applying changes. - Added functionality to save original prompts and maintain a history of prompt changes for undo operations. - Enhanced the UI to include buttons for applying optimized prompts and undoing the last change, improving user experience and flexibility in prompt management. - Implemented cancelation of optimization previews, ensuring users can easily revert to the original state if needed. --- src/components/NodeConfiguration.tsx | 84 ++++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 10 deletions(-) diff --git a/src/components/NodeConfiguration.tsx b/src/components/NodeConfiguration.tsx index 84378fc..715e234 100644 --- a/src/components/NodeConfiguration.tsx +++ b/src/components/NodeConfiguration.tsx @@ -403,6 +403,12 @@ export const NodeConfiguration: React.FC = ({ const config = nodeTypeConfigs[data.type]; const [isOptimizing, setIsOptimizing] = useState(false); const [optimizationResult, setOptimizationResult] = useState(""); + const [isPreviewingOptimization, setIsPreviewingOptimization] = + useState(false); + const [originalPrompt, setOriginalPrompt] = useState( + (currentData.config && currentData.config.prompt) || "" + ); + const [promptHistory, setPromptHistory] = useState([]); // State for label change dialog const [showLabelDialog, setShowLabelDialog] = useState(false); @@ -489,6 +495,7 @@ export const NodeConfiguration: React.FC = ({ setIsOptimizing(true); setOptimizationResult(""); + setOriginalPrompt(currentData.config.prompt); try { // Extract intent from the prompt itself @@ -594,6 +601,7 @@ Return only the optimized prompt:`, } setOptimizationResult(cleanedResult); + setIsPreviewingOptimization(true); } catch (error) { console.error("Error optimizing prompt:", error); setOptimizationResult("Error optimizing prompt. Please try again."); @@ -604,11 +612,26 @@ Return only the optimized prompt:`, const applyOptimizedPrompt = () => { if (optimizationResult) { + // Save to history for undo + setPromptHistory((prev) => [originalPrompt, ...prev].slice(0, 20)); handleConfigChange("prompt", optimizationResult); setOptimizationResult(""); + setIsPreviewingOptimization(false); } }; + const cancelOptimizationPreview = () => { + setOptimizationResult(""); + setIsPreviewingOptimization(false); + }; + + const undoLastPromptChange = () => { + if (promptHistory.length === 0) return; + const [last, ...rest] = promptHistory; + handleConfigChange("prompt", last); + setPromptHistory(rest); + }; + const renderField = (field: FieldConfig) => { const value = currentData.config[field.key] || field.defaultValue || ""; @@ -628,16 +651,57 @@ Return only the optimized prompt:`, nodeType={data.type} /> {data.type === "llmTask" && field.key === "prompt" && ( -
- +
+
+ + +
+ {isPreviewingOptimization && optimizationResult && ( +
+
+ Optimized Preview +
+
+ {optimizationResult} +
+
+ + +
+
+ )}
)}