From 292073eb4a15bcfa3853bda9e8769bbcb3a257fb Mon Sep 17 00:00:00 2001 From: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com> Date: Thu, 17 Jul 2025 10:48:54 -0400 Subject: [PATCH] feat: make Salesforce WriteToObjectSettings entries editable with save/cancel functionality (#22440) * feat: make Salesforce WriteToObjectSettings entries editable with save/cancel functionality - Add editingRows and editingData state to track which rows are being edited - Implement startEditing, cancelEditing, and saveEditing functions for row-level edit management - Replace read-only existing entries with editable fields when in edit mode - Add save/cancel buttons with appropriate icons (check/x) for each row - Include field name validation to prevent duplicate entries - Maintain existing delete functionality alongside new edit capabilities - Update action column width to accommodate save/cancel buttons Co-Authored-By: joe@cal.com * fix: address Code Rabbit review feedback for WriteToObjectSettings - Fix spread operator usage to use editData instead of prev[key] - Add validation for empty field names - Implement single-row editing for better UX Co-Authored-By: joe@cal.com --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../components/WriteToObjectSettings.tsx | 331 ++++++++++++++---- 1 file changed, 264 insertions(+), 67 deletions(-) diff --git a/packages/app-store/salesforce/components/components/WriteToObjectSettings.tsx b/packages/app-store/salesforce/components/components/WriteToObjectSettings.tsx index 742610a117..b051da1091 100644 --- a/packages/app-store/salesforce/components/components/WriteToObjectSettings.tsx +++ b/packages/app-store/salesforce/components/components/WriteToObjectSettings.tsx @@ -71,6 +71,10 @@ const WriteToObjectSettings = ({ checkboxFieldValueOptions[0] ); const [whenToWriteSelectedOption, setWhenToWriteSelectedOption] = useState(whenToWriteToRecordOptions[0]); + const [editingRows, setEditingRows] = useState>({}); + const [editingData, setEditingData] = useState>>( + {} + ); const [newOnWriteToRecordEntry, setNewOnWriteToRecordEntry] = useState< z.infer >({ @@ -80,6 +84,63 @@ const WriteToObjectSettings = ({ whenToWrite: whenToWriteSelectedOption.value, }); + const startEditing = (key: string) => { + Object.keys(editingRows).forEach((rowKey) => { + if (editingRows[rowKey] && rowKey !== key) { + cancelEditing(rowKey); + } + }); + setEditingRows((prev) => ({ ...prev, [key]: true })); + setEditingData((prev) => ({ + ...prev, + [key]: { + field: key, + fieldType: writeToObjectData[key].fieldType, + value: writeToObjectData[key].value, + whenToWrite: writeToObjectData[key].whenToWrite, + }, + })); + }; + + const cancelEditing = (key: string) => { + setEditingRows((prev) => ({ ...prev, [key]: false })); + setEditingData((prev) => { + const newData = { ...prev }; + delete newData[key]; + return newData; + }); + }; + + const saveEditing = (key: string) => { + const editData = editingData[key]; + if (!editData) return; + + if (!editData.field.trim()) { + showToast("Field name cannot be empty", "error"); + return; + } + + if (editData.field !== key && Object.keys(writeToObjectData).includes(editData.field.trim())) { + showToast("Field already exists", "error"); + return; + } + + const newWriteToObjectData = { ...writeToObjectData }; + + if (editData.field !== key) { + delete newWriteToObjectData[key]; + } + + newWriteToObjectData[editData.field.trim()] = { + fieldType: editData.fieldType, + value: editData.value, + whenToWrite: editData.whenToWrite, + }; + + updateWriteToObjectData(newWriteToObjectData); + cancelEditing(key); + }; + return ( <> @@ -98,77 +159,213 @@ const WriteToObjectSettings = ({
{t("field_type")}
{t("value")}
{t("when_to_write")}
-
+
- {Object.keys(writeToObjectData).map((key) => ( -
-
- -
-
- option.value === writeToObjectData[key].value - )} - isDisabled={true} - /> - ) : writeToObjectData[key].fieldType === SalesforceFieldType.CHECKBOX ? ( - option.value === writeToObjectData[key].whenToWrite +
+
+ {isEditing ? ( + option.value === writeToObjectData[key].fieldType + )} + isDisabled={true} + /> )} - isDisabled={true} - /> +
+
+ {isEditing ? ( + editData?.fieldType === SalesforceFieldType.DATE ? ( + option.value === editData.value)} + onChange={(e) => { + if (e) { + setEditingData((prev) => ({ + ...prev, + [key]: { ...editData, value: e.value }, + })); + } + }} + /> + ) : ( + + setEditingData((prev) => ({ + ...prev, + [key]: { ...editData, value: e.target.value }, + })) + } + size="sm" + className="w-full" + /> + ) + ) : writeToObjectData[key].fieldType === SalesforceFieldType.DATE ? ( + option.value === writeToObjectData[key].value + )} + isDisabled={true} + /> + ) : ( + + )} +
+
+ {isEditing ? ( + option.value === writeToObjectData[key].whenToWrite + )} + isDisabled={true} + /> + )} +
+
+ {isEditing ? ( + <> +
-
-
-
- ))} + ); + })}
-
+