From 4090e96738ec6500a089784552b2a23f81842c26 Mon Sep 17 00:00:00 2001
From: Sean Yang <53060248+shawseanyang@users.noreply.github.com>
Date: Mon, 16 Oct 2023 09:45:50 -0400
Subject: [PATCH] Add minimum rows requirement for autofilling

---
 chainforge/react-server/src/TextFieldsNode.js | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/chainforge/react-server/src/TextFieldsNode.js b/chainforge/react-server/src/TextFieldsNode.js
index b23d1bd..fecaa35 100644
--- a/chainforge/react-server/src/TextFieldsNode.js
+++ b/chainforge/react-server/src/TextFieldsNode.js
@@ -207,6 +207,12 @@ const TextFieldsNode = ({ data, id }) => {
     return true;
   }
 
+  // At least 2 non-empty rows are needed for suggestions.
+  function enoughRowsForSuggestions() {
+    const rows = Object.values(textfieldsValues);
+    return rows.filter((row) => row !== '').length >= 2;
+  }
+
   /**
    * Returns true `a` is a subset of `b`, skipping over empty strings.
    * @param {Array} a
@@ -226,6 +232,7 @@ const TextFieldsNode = ({ data, id }) => {
   const autofillEffect = useCallback(() => {
     if (isSuggestionsLoading) return;
     const base = Object.values(textfieldsValues);
+    if (!enoughRowsForSuggestions()) return;
     if (!match(base, expectedRows) || suggestedRows.length === 0) {
       setIsSuggestionsLoading(true);
       autofill(base, SUGGESTIONS_TO_PRELOAD).then((suggestions) => {
@@ -318,7 +325,8 @@ const TextFieldsNode = ({ data, id }) => {
           <Popover.Dropdown>
             <Stack gap={1}>
               <NumberInput label="Rows" min={1} max={10} defaultValue={3} value={commandFillNumber} onChange={setCommandFillNumber}/>
-              <Button size="sm" variant="light" fullWidth onClick={handleCommandFill}>Generate</Button>
+              <Button size="sm" variant="light" fullWidth onClick={handleCommandFill} disabled={!enoughRowsForSuggestions()}>Generate</Button>
+              {enoughRowsForSuggestions() ? <></> : <Text>Enter at least 2 rows to generate suggestions.</Text>}
             </Stack>
           </Popover.Dropdown>
         </Popover>