Creating records in side panel not working (#10999)

Fixes https://github.com/twentyhq/core-team-issues/issues/624

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Guillim
2025-03-18 19:34:50 +01:00
committed by GitHub
parent 9e83d902d8
commit 841d48b704
6 changed files with 29 additions and 138 deletions

View File

@ -1,12 +1,7 @@
import { Key } from 'ts-key-enum'; import { Key } from 'ts-key-enum';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { getDropdownFocusIdForRecordField } from '@/object-record/utils/getDropdownFocusIdForRecordField';
import { activeDropdownFocusIdState } from '@/ui/layout/dropdown/states/activeDropdownFocusIdState';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
import { useContext } from 'react';
import { useRecoilValue } from 'recoil';
import { isDefined } from 'twenty-shared'; import { isDefined } from 'twenty-shared';
export const useRegisterInputEvents = <T>({ export const useRegisterInputEvents = <T>({
@ -30,32 +25,9 @@ export const useRegisterInputEvents = <T>({
onClickOutside?: (event: MouseEvent | TouchEvent, inputValue: T) => void; onClickOutside?: (event: MouseEvent | TouchEvent, inputValue: T) => void;
hotkeyScope: string; hotkeyScope: string;
}) => { }) => {
const activeDropdownFocusId = useRecoilValue(activeDropdownFocusIdState);
const { recordId, fieldDefinition } = useContext(FieldContext);
useListenClickOutside({ useListenClickOutside({
refs: [inputRef, copyRef].filter(isDefined), refs: [inputRef, copyRef].filter(isDefined),
callback: (event) => { callback: (event) => {
const fieldDropdownFocusIdTableCell = getDropdownFocusIdForRecordField(
recordId,
fieldDefinition.fieldMetadataId,
'table-cell',
);
const fieldDropdownFocusIdInlineCell = getDropdownFocusIdForRecordField(
recordId,
fieldDefinition.fieldMetadataId,
'inline-cell',
);
if (
activeDropdownFocusId !== fieldDropdownFocusIdTableCell &&
activeDropdownFocusId !== fieldDropdownFocusIdInlineCell
) {
return;
}
onClickOutside?.(event, inputValue); onClickOutside?.(event, inputValue);
}, },
enabled: isDefined(onClickOutside), enabled: isDefined(onClickOutside),

View File

@ -21,10 +21,7 @@ import { isFieldSelect } from '@/object-record/record-field/types/guards/isField
import { MultipleRecordPickerHotkeyScope } from '@/object-record/record-picker/multiple-record-picker/types/MultipleRecordPickerHotkeyScope'; import { MultipleRecordPickerHotkeyScope } from '@/object-record/record-picker/multiple-record-picker/types/MultipleRecordPickerHotkeyScope';
import { SingleRecordPickerHotkeyScope } from '@/object-record/record-picker/single-record-picker/types/SingleRecordPickerHotkeyScope'; import { SingleRecordPickerHotkeyScope } from '@/object-record/record-picker/single-record-picker/types/SingleRecordPickerHotkeyScope';
import { SelectFieldHotkeyScope } from '@/object-record/select/types/SelectFieldHotkeyScope'; import { SelectFieldHotkeyScope } from '@/object-record/select/types/SelectFieldHotkeyScope';
import { getDropdownFocusIdForRecordField } from '@/object-record/utils/getDropdownFocusIdForRecordField';
import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId'; import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId';
import { activeDropdownFocusIdState } from '@/ui/layout/dropdown/states/activeDropdownFocusIdState';
import { useRecoilCallback } from 'recoil';
import { RelationDefinitionType } from '~/generated-metadata/graphql'; import { RelationDefinitionType } from '~/generated-metadata/graphql';
import { RecordInlineCellContainer } from './RecordInlineCellContainer'; import { RecordInlineCellContainer } from './RecordInlineCellContainer';
import { import {
@ -83,30 +80,15 @@ export const RecordInlineCell = ({ loading }: RecordInlineCellProps) => {
closeInlineCell(); closeInlineCell();
}; };
const handleClickOutside: FieldInputClickOutsideEvent = useRecoilCallback( const handleClickOutside: FieldInputClickOutsideEvent = (
({ snapshot }) => persistField,
(persistField, event) => { event,
const recordFieldDropdownId = getDropdownFocusIdForRecordField( ) => {
recordId, event.stopImmediatePropagation();
fieldDefinition.fieldMetadataId,
'inline-cell',
);
const activeDropdownFocusId = snapshot persistField();
.getLoadable(activeDropdownFocusIdState) closeInlineCell();
.getValue(); };
if (recordFieldDropdownId !== activeDropdownFocusId) {
return;
}
event.stopImmediatePropagation();
persistField();
closeInlineCell();
},
[closeInlineCell, fieldDefinition.fieldMetadataId, recordId],
);
const { getIcon } = useIcons(); const { getIcon } = useIcons();
const { openFieldInput, closeFieldInput } = useOpenFieldInputEditMode(); const { openFieldInput, closeFieldInput } = useOpenFieldInputEditMode();

View File

@ -5,10 +5,7 @@ import { FieldContext } from '@/object-record/record-field/contexts/FieldContext
import { useIsFieldValueReadOnly } from '@/object-record/record-field/hooks/useIsFieldValueReadOnly'; import { useIsFieldValueReadOnly } from '@/object-record/record-field/hooks/useIsFieldValueReadOnly';
import { FieldInputEvent } from '@/object-record/record-field/types/FieldInputEvent'; import { FieldInputEvent } from '@/object-record/record-field/types/FieldInputEvent';
import { useRecordTableBodyContextOrThrow } from '@/object-record/record-table/contexts/RecordTableBodyContext'; import { useRecordTableBodyContextOrThrow } from '@/object-record/record-table/contexts/RecordTableBodyContext';
import { getDropdownFocusIdForRecordField } from '@/object-record/utils/getDropdownFocusIdForRecordField';
import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId'; import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId';
import { activeDropdownFocusIdState } from '@/ui/layout/dropdown/states/activeDropdownFocusIdState';
import { useRecoilCallback } from 'recoil';
export const RecordTableCellFieldInput = () => { export const RecordTableCellFieldInput = () => {
const { recordId, fieldDefinition } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
@ -43,35 +40,20 @@ export const RecordTableCellFieldInput = () => {
onCloseTableCell(); onCloseTableCell();
}; };
const handleClickOutside = useRecoilCallback( const handleClickOutside = (
({ snapshot }) => persistField: () => void,
(persistField: () => void, event: MouseEvent | TouchEvent) => { event: MouseEvent | TouchEvent,
const dropdownFocusId = getDropdownFocusIdForRecordField( ) => {
recordId, event.stopImmediatePropagation();
fieldDefinition.fieldMetadataId,
'table-cell',
);
const activeDropdownFocusId = snapshot onUpsertRecord({
.getLoadable(activeDropdownFocusIdState) persistField,
.getValue(); recordId,
fieldName: fieldDefinition.metadata.fieldName,
});
if (activeDropdownFocusId !== dropdownFocusId) { onCloseTableCell();
return; };
}
event.stopImmediatePropagation();
onUpsertRecord({
persistField,
recordId,
fieldName: fieldDefinition.metadata.fieldName,
});
onCloseTableCell();
},
[fieldDefinition, onCloseTableCell, onUpsertRecord, recordId],
);
const handleEscape: FieldInputEvent = (persistField) => { const handleEscape: FieldInputEvent = (persistField) => {
onUpsertRecord({ onUpsertRecord({

View File

@ -15,10 +15,7 @@ import {
} from '@/object-record/record-title-cell/components/RecordTitleCellContext'; } from '@/object-record/record-title-cell/components/RecordTitleCellContext';
import { RecordTitleCellFieldDisplay } from '@/object-record/record-title-cell/components/RecordTitleCellFieldDisplay'; import { RecordTitleCellFieldDisplay } from '@/object-record/record-title-cell/components/RecordTitleCellFieldDisplay';
import { RecordTitleCellFieldInput } from '@/object-record/record-title-cell/components/RecordTitleCellFieldInput'; import { RecordTitleCellFieldInput } from '@/object-record/record-title-cell/components/RecordTitleCellFieldInput';
import { getDropdownFocusIdForRecordField } from '@/object-record/utils/getDropdownFocusIdForRecordField';
import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId'; import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId';
import { activeDropdownFocusIdState } from '@/ui/layout/dropdown/states/activeDropdownFocusIdState';
import { useRecoilCallback } from 'recoil';
type RecordTitleCellProps = { type RecordTitleCellProps = {
loading?: boolean; loading?: boolean;
@ -54,30 +51,15 @@ export const RecordTitleCell = ({
closeInlineCell(); closeInlineCell();
}; };
const handleClickOutside: FieldInputClickOutsideEvent = useRecoilCallback( const handleClickOutside: FieldInputClickOutsideEvent = (
({ snapshot }) => persistField,
(persistField, event) => { event,
const recordFieldDropdownId = getDropdownFocusIdForRecordField( ) => {
recordId, event.stopImmediatePropagation();
fieldDefinition.fieldMetadataId,
'inline-cell',
);
const activeDropdownFocusId = snapshot persistField();
.getLoadable(activeDropdownFocusIdState) closeInlineCell();
.getValue(); };
if (recordFieldDropdownId !== activeDropdownFocusId) {
return;
}
event.stopImmediatePropagation();
persistField();
closeInlineCell();
},
[closeInlineCell, fieldDefinition.fieldMetadataId, recordId],
);
const recordTitleCellContextValue: RecordTitleCellContextProps = { const recordTitleCellContextValue: RecordTitleCellContextProps = {
editModeContent: ( editModeContent: (

View File

@ -65,6 +65,7 @@ export const RecordTitleCellTextFieldInput = ({
return ( return (
<TextInputV2 <TextInputV2
ref={wrapperRef}
autoGrow autoGrow
sizeVariant={sizeVariant} sizeVariant={sizeVariant}
inheritFontStyles inheritFontStyles

View File

@ -1,8 +1,6 @@
import React, { useEffect } from 'react'; import React, { useEffect } from 'react';
import { useRecoilCallback } from 'recoil'; import { useRecoilCallback } from 'recoil';
import { activeDropdownFocusIdState } from '@/ui/layout/dropdown/states/activeDropdownFocusIdState';
import { previousDropdownFocusIdState } from '@/ui/layout/dropdown/states/previousDropdownFocusIdState';
import { internalHotkeysEnabledScopesState } from '@/ui/utilities/hotkey/states/internal/internalHotkeysEnabledScopesState'; import { internalHotkeysEnabledScopesState } from '@/ui/utilities/hotkey/states/internal/internalHotkeysEnabledScopesState';
import { useClickOustideListenerStates } from '@/ui/utilities/pointer-event/hooks/useClickOustideListenerStates'; import { useClickOustideListenerStates } from '@/ui/utilities/pointer-event/hooks/useClickOustideListenerStates';
@ -190,32 +188,6 @@ export const useListenClickOutside = <T extends Element>({
!isMouseDownInside && !isMouseDownInside &&
!isClickedOnExcluded; !isClickedOnExcluded;
if (CLICK_OUTSIDE_DEBUG_MODE) {
const activeDropdownFocusId = snapshot
.getLoadable(activeDropdownFocusIdState)
.getValue();
const previousDropdownFocusId = snapshot
.getLoadable(previousDropdownFocusIdState)
.getValue();
// eslint-disable-next-line no-console
console.log('click outside compare refs', {
listenerId,
shouldTrigger,
isListening,
hasMouseDownHappened,
clickedOnAtLeastOneRef,
isMouseDownInside,
isClickedOnExcluded,
activeDropdownFocusId,
previousDropdownFocusId,
hotkeyScope,
enabled,
event,
});
}
if (shouldTrigger) { if (shouldTrigger) {
callback(event); callback(event);
} }