From 26491ecdc62be3d3d542f90c4ca8633e8e691675 Mon Sep 17 00:00:00 2001 From: avonian <5542980+avonian@users.noreply.github.com> Date: Sat, 4 Jul 2026 15:09:21 +0200 Subject: [PATCH] fix(front): don't blank record title when the title cell is untouched (#22293) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem On a record show page, the record title (label identifier) can be silently blanked. Repro: 1. Create a record, set its name, set a relation field (e.g. a one-to-one/many relation). 2. Reload the page. 3. Click the **edit** affordance on the relation field. → The record's name clears to “Untitled”, and it persists (an `updateOne` fires with `input: { name: "" }`). ## Root cause `RecordTitleCellTextFieldInput` registers `onClickOutside` / `onEnter` / `onTab` / `onShiftTab` and always forwards `draftValue ?? ''` to be persisted. When the title cell is in edit mode but the user never typed in it, `draftValue` is `undefined`, so the forwarded value is `""`. Opening another field's input counts as a click-outside on the title cell, which then persists `{ name: "" }` over the existing label identifier. ## Fix Skip persisting when the title draft is untouched (`draftValue === undefined`) by passing `skipPersist` on the blur-style events. An unedited title can no longer overwrite the existing label identifier; genuine edits set the draft and persist exactly as before. ## Test plan - Repro above: name no longer clears when editing a relation after reload. - Creating a new record and naming it still works. - Renaming an existing record via its title still works. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Review in cubic --------- Co-authored-by: Charles Bochet --- .../hooks/useOpenNewRecordTitleCell.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/twenty-front/src/modules/object-record/record-title-cell/hooks/useOpenNewRecordTitleCell.ts b/packages/twenty-front/src/modules/object-record/record-title-cell/hooks/useOpenNewRecordTitleCell.ts index 5e1f518e95..c712d44571 100644 --- a/packages/twenty-front/src/modules/object-record/record-title-cell/hooks/useOpenNewRecordTitleCell.ts +++ b/packages/twenty-front/src/modules/object-record/record-title-cell/hooks/useOpenNewRecordTitleCell.ts @@ -1,6 +1,8 @@ +import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/ui/states/recordFieldInputDraftValueComponentState'; import { isTitleCellInEditModeComponentState } from '@/object-record/record-title-cell/states/isTitleCellInEditModeComponentState'; import { RecordTitleCellContainerType } from '@/object-record/record-title-cell/types/RecordTitleCellContainerType'; import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId'; +import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack'; import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType'; import { useStore } from 'jotai'; @@ -36,6 +38,15 @@ export const useOpenNewRecordTitleCell = () => { }), true, ); + + const recordFieldValue = store.get( + recordStoreFamilySelector.selectorFamily({ recordId, fieldName }), + ); + + store.set( + recordFieldInputDraftValueComponentState.atomFamily({ instanceId }), + recordFieldValue, + ); }, [pushFocusItemToFocusStack, store], );