This is an automated email from the ASF dual-hosted git repository. rusackas pushed a commit to branch live-edits in repository https://gitbox.apache.org/repos/asf/superset.git
commit 3cfd75f5f3a8a5b6b2d14c0ea8376271f0c580be Author: Evan Rusackas <[email protected]> AuthorDate: Fri Jan 9 11:27:46 2026 -0800 fix(dashboard): make EditableTitle respond immediately to editing prop - Use editing prop directly: isEditing = editing || isEditingInternal - This ensures the component enters edit mode immediately when prop changes - Simplify state syncing and onEditingChange notification logic 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]> --- .../src/components/EditableTitle/index.tsx | 23 +++++++++++----------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/components/EditableTitle/index.tsx b/superset-frontend/packages/superset-ui-core/src/components/EditableTitle/index.tsx index a0077a4f721..1fd36aefac8 100644 --- a/superset-frontend/packages/superset-ui-core/src/components/EditableTitle/index.tsx +++ b/superset-frontend/packages/superset-ui-core/src/components/EditableTitle/index.tsx @@ -89,7 +89,10 @@ export function EditableTitle({ onEditingChange, ...rest }: EditableTitleProps) { - const [isEditing, setIsEditing] = useState(editing); + const [isEditingInternal, setIsEditingInternal] = useState(editing); + // Use editing prop directly when provided, otherwise use internal state + const isEditing = editing || isEditingInternal; + const setIsEditing = setIsEditingInternal; const [currentTitle, setCurrentTitle] = useState(title); const [lastTitle, setLastTitle] = useState(title); const [inputWidth, setInputWidth] = useState<number>(0); @@ -123,12 +126,12 @@ export function EditableTitle({ } }, [title]); - // Support controlled editing mode - sync isEditing when editing prop changes to true + // Sync internal state when editing prop changes (for controlled mode) useEffect(() => { - if (editing && !isEditing) { - setIsEditing(true); + if (editing) { + setIsEditingInternal(true); } - }, [editing, isEditing]); + }, [editing]); useEffect(() => { if (isEditing && contentRef.current) { @@ -140,16 +143,12 @@ export function EditableTitle({ textArea.scrollTop = textArea.scrollHeight; } } - // Skip notification only when entering controlled mode - // (editing=true, isEditing=false, and isEditing was already false before) - // This distinguishes from exiting edit mode (where prevIsEditing was true) - const isEnteringControlledMode = - editing && !isEditing && !prevIsEditingRef.current; - if (!isEnteringControlledMode) { + // Notify parent of editing state changes + if (prevIsEditingRef.current !== isEditing) { onEditingChange?.(isEditing); } prevIsEditingRef.current = isEditing; - }, [isEditing, editing, onEditingChange]); + }, [isEditing, onEditingChange]); function handleClick() { if (!canEdit || isEditing) return;
