Remove cell hotkey scope (#11435)

Remove FieldContext hotkey scope as:
- each Field should set its own hotkey scope (ex:
emails-field-input-{recordId} or emails-field-input for now)
- while opening a fieldInput, we should synchronously set the
corresponding hotkey scope

To cut this refactoring in half, I'm allowing all input to use
TableHotkeyScope.CellEditMode
This commit is contained in:
Charles Bochet
2025-04-08 11:18:23 +02:00
committed by GitHub
parent 3d90eb4eb9
commit 17474a0e1e
98 changed files with 316 additions and 416 deletions

View File

@ -11,10 +11,10 @@ import { RecordFieldComponentInstanceContext } from '@/object-record/record-fiel
import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell'; import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell';
import { PropertyBox } from '@/object-record/record-inline-cell/property-box/components/PropertyBox'; import { PropertyBox } from '@/object-record/record-inline-cell/property-box/components/PropertyBox';
import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId'; import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId';
import { mapArrayToObject } from '~/utils/array/mapArrayToObject';
import { beautifyPastDateRelativeToNow } from '~/utils/date-utils';
import { Chip, ChipAccent, ChipSize, ChipVariant } from 'twenty-ui/components'; import { Chip, ChipAccent, ChipSize, ChipVariant } from 'twenty-ui/components';
import { IconCalendarEvent } from 'twenty-ui/display'; import { IconCalendarEvent } from 'twenty-ui/display';
import { mapArrayToObject } from '~/utils/array/mapArrayToObject';
import { beautifyPastDateRelativeToNow } from '~/utils/date-utils';
type CalendarEventDetailsProps = { type CalendarEventDetailsProps = {
calendarEvent: CalendarEvent; calendarEvent: CalendarEvent;
@ -97,7 +97,6 @@ export const CalendarEventDetails = ({
<FieldContext.Provider <FieldContext.Provider
value={{ value={{
recordId: calendarEvent.id, recordId: calendarEvent.id,
hotkeyScope: 'calendar-event-details',
isLabelIdentifier: false, isLabelIdentifier: false,
fieldDefinition: formatFieldMetadataItemAsFieldDefinition({ fieldDefinition: formatFieldMetadataItemAsFieldDefinition({
field: fieldsByName[fieldName], field: fieldsByName[fieldName],

View File

@ -13,7 +13,6 @@ import { RecordInlineCellContainer } from '@/object-record/record-inline-cell/co
import { RecordInlineCellContext } from '@/object-record/record-inline-cell/components/RecordInlineCellContext'; import { RecordInlineCellContext } from '@/object-record/record-inline-cell/components/RecordInlineCellContext';
import { useInlineCell } from '@/object-record/record-inline-cell/hooks/useInlineCell'; import { useInlineCell } from '@/object-record/record-inline-cell/hooks/useInlineCell';
import { MultipleRecordPicker } from '@/object-record/record-picker/multiple-record-picker/components/MultipleRecordPicker'; import { MultipleRecordPicker } from '@/object-record/record-picker/multiple-record-picker/components/MultipleRecordPicker';
import { MultipleRecordPickerHotkeyScope } from '@/object-record/record-picker/multiple-record-picker/types/MultipleRecordPickerHotkeyScope';
import { IconArrowUpRight, IconPencil } from 'twenty-ui/display'; import { IconArrowUpRight, IconPencil } from 'twenty-ui/display';
type ActivityTargetsInlineCellProps = { type ActivityTargetsInlineCellProps = {
@ -65,8 +64,6 @@ export const ActivityTargetsInlineCell = ({
<RecordInlineCellContext.Provider <RecordInlineCellContext.Provider
value={{ value={{
buttonIcon: IconPencil, buttonIcon: IconPencil,
customEditHotkeyScope:
MultipleRecordPickerHotkeyScope.MultipleRecordPicker,
IconLabel: showLabel ? IconArrowUpRight : undefined, IconLabel: showLabel ? IconArrowUpRight : undefined,
showLabel: showLabel, showLabel: showLabel,
readonly: isReadOnly, readonly: isReadOnly,

View File

@ -5,6 +5,8 @@ import { useMultipleRecordPickerPerformSearch } from '@/object-record/record-pic
import { multipleRecordPickerPickableMorphItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerPickableMorphItemsComponentState'; import { multipleRecordPickerPickableMorphItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerPickableMorphItemsComponentState';
import { multipleRecordPickerSearchFilterComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerSearchFilterComponentState'; import { multipleRecordPickerSearchFilterComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerSearchFilterComponentState';
import { multipleRecordPickerSearchableObjectMetadataItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerSearchableObjectMetadataItemsComponentState'; import { multipleRecordPickerSearchableObjectMetadataItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerSearchableObjectMetadataItemsComponentState';
import { MultipleRecordPickerHotkeyScope } from '@/object-record/record-picker/multiple-record-picker/types/MultipleRecordPickerHotkeyScope';
import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
import { useRecoilCallback } from 'recoil'; import { useRecoilCallback } from 'recoil';
type OpenActivityTargetCellEditModeProps = { type OpenActivityTargetCellEditModeProps = {
@ -17,6 +19,8 @@ export const useOpenActivityTargetCellEditMode = () => {
const { performSearch: multipleRecordPickerPerformSearch } = const { performSearch: multipleRecordPickerPerformSearch } =
useMultipleRecordPickerPerformSearch(); useMultipleRecordPickerPerformSearch();
const { setHotkeyScopeAndMemorizePreviousScope } = usePreviousHotkeyScope();
const openActivityTargetCellEditMode = useRecoilCallback( const openActivityTargetCellEditMode = useRecoilCallback(
({ set, snapshot }) => ({ set, snapshot }) =>
({ ({
@ -79,8 +83,12 @@ export const useOpenActivityTargetCellEditMode = () => {
}), }),
), ),
}); });
setHotkeyScopeAndMemorizePreviousScope(
MultipleRecordPickerHotkeyScope.MultipleRecordPicker,
);
}, },
[multipleRecordPickerPerformSearch], [multipleRecordPickerPerformSearch, setHotkeyScopeAndMemorizePreviousScope],
); );
return { openActivityTargetCellEditMode }; return { openActivityTargetCellEditMode };

View File

@ -53,7 +53,6 @@ export const EventFieldDiffValue = ({
}, },
defaultValue: fieldMetadataItem.defaultValue, defaultValue: fieldMetadataItem.defaultValue,
}, },
hotkeyScope: 'field-event-diff',
isReadOnly: false, isReadOnly: false,
}} }}
> >

View File

@ -13,7 +13,6 @@ import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'
import { getFieldButtonIcon } from '@/object-record/record-field/utils/getFieldButtonIcon'; import { getFieldButtonIcon } from '@/object-record/record-field/utils/getFieldButtonIcon';
import { isFieldValueReadOnly } from '@/object-record/record-field/utils/isFieldValueReadOnly'; import { isFieldValueReadOnly } from '@/object-record/record-field/utils/isFieldValueReadOnly';
import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell'; import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell';
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId'; import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId';
import { useContext } from 'react'; import { useContext } from 'react';
@ -67,7 +66,6 @@ export const RecordBoardCardBody = ({
}), }),
}, },
useUpdateRecord: useUpdateOneRecordHook, useUpdateRecord: useUpdateOneRecordHook,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isDisplayModeFixHeight: true, isDisplayModeFixHeight: true,
}} }}
> >

View File

@ -6,7 +6,6 @@ import {
RecordUpdateHook, RecordUpdateHook,
RecordUpdateHookParams, RecordUpdateHookParams,
} from '@/object-record/record-field/contexts/FieldContext'; } from '@/object-record/record-field/contexts/FieldContext';
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
import { ReactNode } from 'react'; import { ReactNode } from 'react';
export const FieldContextProvider = ({ export const FieldContextProvider = ({
@ -72,7 +71,6 @@ export const FieldContextProvider = ({
}), }),
useUpdateRecord: useUpdateRecord:
customUseUpdateOneObjectHook ?? useUpdateOneObjectMutation, customUseUpdateOneObjectHook ?? useUpdateOneObjectMutation,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
clearable, clearable,
overridenIsFieldEmpty, overridenIsFieldEmpty,
isReadOnly: false, isReadOnly: false,

View File

@ -23,8 +23,8 @@ export type GenericFieldContextType = {
fieldDefinition: FieldDefinition<FieldMetadata>; fieldDefinition: FieldDefinition<FieldMetadata>;
useUpdateRecord?: RecordUpdateHook; useUpdateRecord?: RecordUpdateHook;
recordId: string; recordId: string;
hotkeyScope: string;
isLabelIdentifier: boolean; isLabelIdentifier: boolean;
isLabelIdentifierCompact?: boolean;
labelIdentifierLink?: string; labelIdentifierLink?: string;
clearable?: boolean; clearable?: boolean;
maxWidth?: number; maxWidth?: number;

View File

@ -6,7 +6,6 @@ import { VariablePickerComponent } from '@/object-record/record-field/form-types
import { InputLabel } from '@/ui/input/components/InputLabel'; import { InputLabel } from '@/ui/input/components/InputLabel';
import { import {
DateTimePicker, DateTimePicker,
MONTH_AND_YEAR_DROPDOWN_ID,
MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID, MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID,
MONTH_AND_YEAR_DROPDOWN_YEAR_SELECT_ID, MONTH_AND_YEAR_DROPDOWN_YEAR_SELECT_ID,
} from '@/ui/input/components/internal/date/components/InternalDatePicker'; } from '@/ui/input/components/internal/date/components/InternalDatePicker';
@ -30,8 +29,8 @@ import {
useState, useState,
} from 'react'; } from 'react';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
import { Nullable } from 'twenty-ui/utilities';
import { TEXT_INPUT_STYLE } from 'twenty-ui/theme'; import { TEXT_INPUT_STYLE } from 'twenty-ui/theme';
import { Nullable } from 'twenty-ui/utilities';
const StyledInputContainer = styled(FormFieldInputInputContainer)` const StyledInputContainer = styled(FormFieldInputInputContainer)`
display: grid; display: grid;
@ -140,7 +139,6 @@ export const FormDateTimeFieldInput = ({
} }
}; };
const { closeDropdown } = useDropdown(MONTH_AND_YEAR_DROPDOWN_ID);
const { closeDropdown: closeDropdownMonthSelect } = useDropdown( const { closeDropdown: closeDropdownMonthSelect } = useDropdown(
MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID, MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID,
); );
@ -162,7 +160,6 @@ export const FormDateTimeFieldInput = ({
closeDropdownYearSelect(); closeDropdownYearSelect();
closeDropdownMonthSelect(); closeDropdownMonthSelect();
closeDropdown();
handlePickerClickOutside(); handlePickerClickOutside();
}, },
enabled: displayDatePicker, enabled: displayDatePicker,

View File

@ -21,7 +21,6 @@ const getWrapper =
value={{ value={{
fieldDefinition, fieldDefinition,
recordId, recordId,
hotkeyScope: 'hotkeyScope',
isLabelIdentifier: false, isLabelIdentifier: false,
isReadOnly: false, isReadOnly: false,
}} }}

View File

@ -14,7 +14,6 @@ const Wrapper = ({ children }: { children: ReactNode }) => (
value={{ value={{
fieldDefinition: phonesFieldDefinition, fieldDefinition: phonesFieldDefinition,
recordId, recordId,
hotkeyScope: 'hotkeyScope',
isLabelIdentifier: false, isLabelIdentifier: false,
isReadOnly: false, isReadOnly: false,
}} }}

View File

@ -20,7 +20,6 @@ const getWrapper =
value={{ value={{
fieldDefinition, fieldDefinition,
recordId, recordId,
hotkeyScope: 'hotkeyScope',
isLabelIdentifier: false, isLabelIdentifier: false,
isReadOnly: false, isReadOnly: false,
}} }}

View File

@ -102,7 +102,6 @@ const getWrapper =
value={{ value={{
fieldDefinition, fieldDefinition,
recordId, recordId,
hotkeyScope: 'hotkeyScope',
isLabelIdentifier: false, isLabelIdentifier: false,
useUpdateRecord: useUpdateOneRecordMutation, useUpdateRecord: useUpdateOneRecordMutation,
isReadOnly: false, isReadOnly: false,

View File

@ -339,7 +339,6 @@ const Wrapper = ({ children }: { children: ReactNode }) => {
value={{ value={{
fieldDefinition: booleanFieldDefinition, fieldDefinition: booleanFieldDefinition,
recordId, recordId,
hotkeyScope: 'hotkeyScope',
isLabelIdentifier: false, isLabelIdentifier: false,
useUpdateRecord: useUpdateOneRecordMutation, useUpdateRecord: useUpdateOneRecordMutation,
isReadOnly: false, isReadOnly: false,

View File

@ -17,6 +17,8 @@ import { isFieldRelationFromManyObjects } from '@/object-record/record-field/typ
import { isFieldRelationToOneObject } from '@/object-record/record-field/types/guards/isFieldRelationToOneObject'; import { isFieldRelationToOneObject } from '@/object-record/record-field/types/guards/isFieldRelationToOneObject';
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
import { useRecoilCallback } from 'recoil'; import { useRecoilCallback } from 'recoil';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
@ -28,6 +30,8 @@ export const useOpenFieldInputEditMode = () => {
const { openActivityTargetCellEditMode } = const { openActivityTargetCellEditMode } =
useOpenActivityTargetCellEditMode(); useOpenActivityTargetCellEditMode();
const setHotkeyScope = useSetHotkeyScope();
const openFieldInput = useRecoilCallback( const openFieldInput = useRecoilCallback(
({ snapshot }) => ({ snapshot }) =>
({ ({
@ -37,13 +41,6 @@ export const useOpenFieldInputEditMode = () => {
fieldDefinition: FieldDefinition<FieldMetadata>; fieldDefinition: FieldDefinition<FieldMetadata>;
recordId: string; recordId: string;
}) => { }) => {
if (isFieldRelationToOneObject(fieldDefinition)) {
openRelationToOneFieldInput({
fieldName: fieldDefinition.metadata.fieldName,
recordId: recordId,
});
}
if ( if (
isFieldRelationFromManyObjects(fieldDefinition) && isFieldRelationFromManyObjects(fieldDefinition) &&
['taskTarget', 'noteTarget'].includes( ['taskTarget', 'noteTarget'].includes(
@ -80,6 +77,15 @@ export const useOpenFieldInputEditMode = () => {
return; return;
} }
if (isFieldRelationToOneObject(fieldDefinition)) {
openRelationToOneFieldInput({
fieldName: fieldDefinition.metadata.fieldName,
recordId: recordId,
});
return;
}
if (isFieldRelationFromManyObjects(fieldDefinition)) { if (isFieldRelationFromManyObjects(fieldDefinition)) {
if ( if (
isDefined( isDefined(
@ -92,13 +98,20 @@ export const useOpenFieldInputEditMode = () => {
fieldDefinition.metadata.relationObjectMetadataNameSingular, fieldDefinition.metadata.relationObjectMetadataNameSingular,
recordId: recordId, recordId: recordId,
}); });
return;
} }
} }
setHotkeyScope(
DEFAULT_CELL_SCOPE.scope,
DEFAULT_CELL_SCOPE.customScopes,
);
}, },
[ [
openActivityTargetCellEditMode, openActivityTargetCellEditMode,
openRelationFromManyFieldInput, openRelationFromManyFieldInput,
openRelationToOneFieldInput, openRelationToOneFieldInput,
setHotkeyScope,
], ],
); );

View File

@ -8,7 +8,7 @@ export const ChipFieldDisplay = () => {
recordValue, recordValue,
objectNameSingular, objectNameSingular,
labelIdentifierLink, labelIdentifierLink,
isLabelHidden, isLabelIdentifierCompact,
} = useChipFieldDisplay(); } = useChipFieldDisplay();
if (!isDefined(recordValue)) { if (!isDefined(recordValue)) {
@ -21,7 +21,7 @@ export const ChipFieldDisplay = () => {
record={recordValue} record={recordValue}
size={ChipSize.Small} size={ChipSize.Small}
to={labelIdentifierLink} to={labelIdentifierLink}
isLabelHidden={isLabelHidden} isLabelHidden={isLabelIdentifierCompact}
/> />
); );
}; };

View File

@ -15,12 +15,12 @@ import { ChipGeneratorsDecorator } from '~/testing/decorators/ChipGeneratorsDeco
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator'; import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
import { getProfilingStory } from '~/testing/profiling/utils/getProfilingStory'; import { getProfilingStory } from '~/testing/profiling/utils/getProfilingStory';
import { ComponentDecorator } from 'twenty-ui/testing';
import { import {
fieldValue, fieldValue,
otherPersonMock, otherPersonMock,
relationFromManyFieldDisplayMock, relationFromManyFieldDisplayMock,
} from './relationFromManyFieldDisplayMock'; } from './relationFromManyFieldDisplayMock';
import { ComponentDecorator } from 'twenty-ui/testing';
const RelationFieldValueSetterEffect = () => { const RelationFieldValueSetterEffect = () => {
const setEntity = useSetRecoilState( const setEntity = useSetRecoilState(
@ -69,7 +69,6 @@ const meta: Meta = {
fieldDefinition: { fieldDefinition: {
...relationFromManyFieldDisplayMock.fieldDefinition, ...relationFromManyFieldDisplayMock.fieldDefinition,
} as unknown as FieldDefinition<FieldMetadata>, } as unknown as FieldDefinition<FieldMetadata>,
hotkeyScope: 'hotkey-scope',
isReadOnly: false, isReadOnly: false,
}} }}
> >

View File

@ -13,7 +13,7 @@ import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldAddress } from '../../types/guards/isFieldAddress'; import { isFieldAddress } from '../../types/guards/isFieldAddress';
export const useAddressField = () => { export const useAddressField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata( assertFieldMetadata(
FieldMetadataType.ADDRESS, FieldMetadataType.ADDRESS,
@ -51,7 +51,6 @@ export const useAddressField = () => {
setFieldValue, setFieldValue,
draftValue, draftValue,
setDraftValue, setDraftValue,
hotkeyScope,
persistAddressField, persistAddressField,
}; };
}; };

View File

@ -10,7 +10,7 @@ import { useRecoilState } from 'recoil';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
export const useArrayField = () => { export const useArrayField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.ARRAY, isFieldArray, fieldDefinition); assertFieldMetadata(FieldMetadataType.ARRAY, isFieldArray, fieldDefinition);
@ -37,8 +37,8 @@ export const useArrayField = () => {
return { return {
fieldValue, fieldValue,
fieldDefinition,
setFieldValue, setFieldValue,
persistArrayField, persistArrayField,
hotkeyScope,
}; };
}; };

View File

@ -9,7 +9,7 @@ import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldBoolean } from '../../types/guards/isFieldBoolean'; import { isFieldBoolean } from '../../types/guards/isFieldBoolean';
export const useBooleanField = () => { export const useBooleanField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata( assertFieldMetadata(
FieldMetadataType.BOOLEAN, FieldMetadataType.BOOLEAN,
@ -30,6 +30,5 @@ export const useBooleanField = () => {
fieldDefinition, fieldDefinition,
fieldValue, fieldValue,
setFieldValue, setFieldValue,
hotkeyScope,
}; };
}; };

View File

@ -8,23 +8,17 @@ import { isFieldText } from '@/object-record/record-field/types/guards/isFieldTe
import { useRecordValue } from '@/object-record/record-store/contexts/RecordFieldValueSelectorContext'; import { useRecordValue } from '@/object-record/record-store/contexts/RecordFieldValueSelectorContext';
import { isFieldActor } from '@/object-record/record-field/types/guards/isFieldActor'; import { isFieldActor } from '@/object-record/record-field/types/guards/isFieldActor';
import { isRecordTableScrolledLeftComponentState } from '@/object-record/record-table/states/isRecordTableScrolledLeftComponentState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
import { useIsMobile } from 'twenty-ui/utilities';
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
export const useChipFieldDisplay = () => { export const useChipFieldDisplay = () => {
const { recordId, fieldDefinition, isLabelIdentifier, labelIdentifierLink } = const {
useContext(FieldContext); recordId,
fieldDefinition,
const isMobile = useIsMobile(); isLabelIdentifier,
const isRecordTableScrolledLeftComponent = useRecoilComponentValueV2( labelIdentifierLink,
isRecordTableScrolledLeftComponentState, isLabelIdentifierCompact,
); } = useContext(FieldContext);
const isLabelHidden =
isMobile && isLabelIdentifier && !isRecordTableScrolledLeftComponent;
const { chipGeneratorPerObjectPerField } = useContext( const { chipGeneratorPerObjectPerField } = useContext(
PreComputedChipGeneratorsContext, PreComputedChipGeneratorsContext,
@ -53,6 +47,6 @@ export const useChipFieldDisplay = () => {
recordValue, recordValue,
isLabelIdentifier, isLabelIdentifier,
labelIdentifierLink, labelIdentifierLink,
isLabelHidden, isLabelIdentifierCompact,
}; };
}; };

View File

@ -1,20 +1,19 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState, useRecoilValue } from 'recoil';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
import { FieldCurrencyValue } from '@/object-record/record-field/types/FieldMetadata';
import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata';
import { isFieldCurrency } from '@/object-record/record-field/types/guards/isFieldCurrency';
import { isFieldCurrencyValue } from '@/object-record/record-field/types/guards/isFieldCurrencyValue';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { convertCurrencyAmountToCurrencyMicros } from '~/utils/convertCurrencyToCurrencyMicros'; import { convertCurrencyAmountToCurrencyMicros } from '~/utils/convertCurrencyToCurrencyMicros';
import { FieldContext } from '../../contexts/FieldContext';
import { usePersistField } from '../../hooks/usePersistField';
import { FieldCurrencyValue } from '../../types/FieldMetadata';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldCurrency } from '../../types/guards/isFieldCurrency';
import { isFieldCurrencyValue } from '../../types/guards/isFieldCurrencyValue';
export const useCurrencyField = () => { export const useCurrencyField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata( assertFieldMetadata(
FieldMetadataType.CURRENCY, FieldMetadataType.CURRENCY,
@ -68,7 +67,6 @@ export const useCurrencyField = () => {
draftValue, draftValue,
setDraftValue, setDraftValue,
setFieldValue, setFieldValue,
hotkeyScope,
persistCurrencyField, persistCurrencyField,
defaultValue, defaultValue,
}; };

View File

@ -11,8 +11,7 @@ import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
export const useDateField = () => { export const useDateField = () => {
const { recordId, fieldDefinition, hotkeyScope, clearable } = const { recordId, fieldDefinition, clearable } = useContext(FieldContext);
useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.DATE, isFieldDate, fieldDefinition); assertFieldMetadata(FieldMetadataType.DATE, isFieldDate, fieldDefinition);
@ -32,7 +31,6 @@ export const useDateField = () => {
fieldValue, fieldValue,
setDraftValue, setDraftValue,
setFieldValue, setFieldValue,
hotkeyScope,
clearable, clearable,
}; };
}; };

View File

@ -7,8 +7,7 @@ import { FieldDateMetadata } from '@/object-record/record-field/types/FieldMetad
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
export const useDateFieldDisplay = () => { export const useDateFieldDisplay = () => {
const { recordId, fieldDefinition, hotkeyScope, clearable } = const { recordId, fieldDefinition, clearable } = useContext(FieldContext);
useContext(FieldContext);
const fieldName = fieldDefinition.metadata.fieldName; const fieldName = fieldDefinition.metadata.fieldName;
@ -23,7 +22,6 @@ export const useDateFieldDisplay = () => {
// Maybe a level above ? // Maybe a level above ?
fieldDefinition: fieldDefinition as FieldDefinition<FieldDateMetadata>, fieldDefinition: fieldDefinition as FieldDefinition<FieldDateMetadata>,
fieldValue, fieldValue,
hotkeyScope,
clearable, clearable,
}; };
}; };

View File

@ -11,8 +11,7 @@ import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldDateTime } from '../../types/guards/isFieldDateTime'; import { isFieldDateTime } from '../../types/guards/isFieldDateTime';
export const useDateTimeField = () => { export const useDateTimeField = () => {
const { recordId, fieldDefinition, hotkeyScope, clearable } = const { recordId, fieldDefinition, clearable } = useContext(FieldContext);
useContext(FieldContext);
assertFieldMetadata( assertFieldMetadata(
FieldMetadataType.DATE_TIME, FieldMetadataType.DATE_TIME,
@ -36,7 +35,6 @@ export const useDateTimeField = () => {
fieldValue, fieldValue,
setDraftValue, setDraftValue,
setFieldValue, setFieldValue,
hotkeyScope,
clearable, clearable,
}; };
}; };

View File

@ -7,8 +7,7 @@ import { FieldDateTimeMetadata } from '@/object-record/record-field/types/FieldM
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
export const useDateTimeFieldDisplay = () => { export const useDateTimeFieldDisplay = () => {
const { recordId, fieldDefinition, hotkeyScope, clearable } = const { recordId, fieldDefinition, clearable } = useContext(FieldContext);
useContext(FieldContext);
const fieldName = fieldDefinition.metadata.fieldName; const fieldName = fieldDefinition.metadata.fieldName;
@ -20,7 +19,6 @@ export const useDateTimeFieldDisplay = () => {
return { return {
fieldDefinition: fieldDefinition as FieldDefinition<FieldDateTimeMetadata>, fieldDefinition: fieldDefinition as FieldDefinition<FieldDateTimeMetadata>,
fieldValue, fieldValue,
hotkeyScope,
clearable, clearable,
}; };
}; };

View File

@ -13,7 +13,7 @@ import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
export const useEmailsField = () => { export const useEmailsField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.EMAILS, isFieldEmails, fieldDefinition); assertFieldMetadata(FieldMetadataType.EMAILS, isFieldEmails, fieldDefinition);
@ -47,7 +47,6 @@ export const useEmailsField = () => {
draftValue, draftValue,
setDraftValue, setDraftValue,
setFieldValue, setFieldValue,
hotkeyScope,
persistEmailsField, persistEmailsField,
}; };
}; };

View File

@ -6,7 +6,7 @@ import { FieldEmailsValue } from '@/object-record/record-field/types/FieldMetada
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
export const useEmailsFieldDisplay = () => { export const useEmailsFieldDisplay = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
const fieldName = fieldDefinition.metadata.fieldName; const fieldName = fieldDefinition.metadata.fieldName;
@ -18,6 +18,5 @@ export const useEmailsFieldDisplay = () => {
return { return {
fieldDefinition, fieldDefinition,
fieldValue, fieldValue,
hotkeyScope,
}; };
}; };

View File

@ -1,19 +1,18 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState, useRecoilValue } from 'recoil';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
import { FieldFullNameValue } from '@/object-record/record-field/types/FieldMetadata';
import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata';
import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName';
import { isFieldFullNameValue } from '@/object-record/record-field/types/guards/isFieldFullNameValue';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { FieldContext } from '../../contexts/FieldContext';
import { usePersistField } from '../../hooks/usePersistField';
import { FieldFullNameValue } from '../../types/FieldMetadata';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldFullName } from '../../types/guards/isFieldFullName';
import { isFieldFullNameValue } from '../../types/guards/isFieldFullNameValue';
export const useFullNameField = () => { export const useFullNameField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata( assertFieldMetadata(
FieldMetadataType.FULL_NAME, FieldMetadataType.FULL_NAME,
@ -51,7 +50,6 @@ export const useFullNameField = () => {
setFieldValue, setFieldValue,
draftValue, draftValue,
setDraftValue, setDraftValue,
hotkeyScope,
persistFullNameField, persistFullNameField,
}; };
}; };

View File

@ -12,8 +12,7 @@ import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldRawJson } from '../../types/guards/isFieldRawJson'; import { isFieldRawJson } from '../../types/guards/isFieldRawJson';
export const useJsonField = () => { export const useJsonField = () => {
const { recordId, fieldDefinition, hotkeyScope, maxWidth } = const { recordId, fieldDefinition, maxWidth } = useContext(FieldContext);
useContext(FieldContext);
assertFieldMetadata( assertFieldMetadata(
FieldMetadataType.RAW_JSON, FieldMetadataType.RAW_JSON,
@ -54,7 +53,6 @@ export const useJsonField = () => {
fieldDefinition, fieldDefinition,
fieldValue, fieldValue,
setFieldValue, setFieldValue,
hotkeyScope,
persistJsonField, persistJsonField,
}; };
}; };

View File

@ -13,7 +13,7 @@ import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
export const useLinksField = () => { export const useLinksField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.LINKS, isFieldLinks, fieldDefinition); assertFieldMetadata(FieldMetadataType.LINKS, isFieldLinks, fieldDefinition);
@ -47,7 +47,6 @@ export const useLinksField = () => {
draftValue, draftValue,
setDraftValue, setDraftValue,
setFieldValue, setFieldValue,
hotkeyScope,
persistLinksField, persistLinksField,
}; };
}; };

View File

@ -12,7 +12,7 @@ import { recordStoreFamilySelector } from '@/object-record/record-store/states/s
import { FieldMetadataType } from '~/generated/graphql'; import { FieldMetadataType } from '~/generated/graphql';
export const useMultiSelectField = () => { export const useMultiSelectField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata( assertFieldMetadata(
FieldMetadataType.MULTI_SELECT, FieldMetadataType.MULTI_SELECT,
@ -45,6 +45,5 @@ export const useMultiSelectField = () => {
draftValue, draftValue,
setDraftValue, setDraftValue,
setFieldValue, setFieldValue,
hotkeyScope,
}; };
}; };

View File

@ -18,7 +18,7 @@ import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldNumber } from '../../types/guards/isFieldNumber'; import { isFieldNumber } from '../../types/guards/isFieldNumber';
export const useNumberField = () => { export const useNumberField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.NUMBER, isFieldNumber, fieldDefinition); assertFieldMetadata(FieldMetadataType.NUMBER, isFieldNumber, fieldDefinition);
@ -65,7 +65,6 @@ export const useNumberField = () => {
draftValue, draftValue,
setDraftValue, setDraftValue,
setFieldValue, setFieldValue,
hotkeyScope,
persistNumberField, persistNumberField,
}; };
}; };

View File

@ -8,7 +8,7 @@ import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldNumber } from '../../types/guards/isFieldNumber'; import { isFieldNumber } from '../../types/guards/isFieldNumber';
export const useNumberFieldDisplay = () => { export const useNumberFieldDisplay = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.NUMBER, isFieldNumber, fieldDefinition); assertFieldMetadata(FieldMetadataType.NUMBER, isFieldNumber, fieldDefinition);
@ -18,6 +18,5 @@ export const useNumberFieldDisplay = () => {
return { return {
fieldDefinition, fieldDefinition,
fieldValue, fieldValue,
hotkeyScope,
}; };
}; };

View File

@ -13,7 +13,7 @@ import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
export const usePhonesField = () => { export const usePhonesField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.PHONES, isFieldPhones, fieldDefinition); assertFieldMetadata(FieldMetadataType.PHONES, isFieldPhones, fieldDefinition);
@ -47,7 +47,6 @@ export const usePhonesField = () => {
draftValue, draftValue,
setDraftValue, setDraftValue,
setFieldValue, setFieldValue,
hotkeyScope,
persistPhonesField, persistPhonesField,
}; };
}; };

View File

@ -10,7 +10,7 @@ import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldRating } from '../../types/guards/isFieldRating'; import { isFieldRating } from '../../types/guards/isFieldRating';
export const useRatingField = () => { export const useRatingField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.RATING, isFieldRating, fieldDefinition); assertFieldMetadata(FieldMetadataType.RATING, isFieldRating, fieldDefinition);
@ -29,6 +29,5 @@ export const useRatingField = () => {
fieldDefinition, fieldDefinition,
rating, rating,
setFieldValue, setFieldValue,
hotkeyScope,
}; };
}; };

View File

@ -7,10 +7,10 @@ import { FieldRelationValue } from '@/object-record/record-field/types/FieldMeta
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata';
import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldRelation } from '../../types/guards/isFieldRelation';
export const useRelationField = <T extends ObjectRecord | ObjectRecord[]>() => { export const useRelationField = <T extends ObjectRecord | ObjectRecord[]>() => {
const { recordId, fieldDefinition, maxWidth } = useContext(FieldContext); const { recordId, fieldDefinition, maxWidth } = useContext(FieldContext);

View File

@ -8,9 +8,9 @@ import { FIELD_EDIT_BUTTON_WIDTH } from '@/ui/field/display/constants/FieldEditB
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { generateDefaultRecordChipData } from '@/object-metadata/utils/generateDefaultRecordChipData'; import { generateDefaultRecordChipData } from '@/object-metadata/utils/generateDefaultRecordChipData';
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata';
import { isFieldRelation } from '../../types/guards/isFieldRelation'; import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
export const useRelationToOneFieldDisplay = () => { export const useRelationToOneFieldDisplay = () => {

View File

@ -15,8 +15,7 @@ import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
export const useRichTextField = () => { export const useRichTextField = () => {
const { recordId, fieldDefinition, hotkeyScope, maxWidth } = const { recordId, fieldDefinition, maxWidth } = useContext(FieldContext);
useContext(FieldContext);
assertFieldMetadata( assertFieldMetadata(
FieldMetadataType.RICH_TEXT, FieldMetadataType.RICH_TEXT,
@ -62,7 +61,6 @@ export const useRichTextField = () => {
fieldDefinition, fieldDefinition,
fieldValue: fieldRichTextValue, fieldValue: fieldRichTextValue,
setFieldValue, setFieldValue,
hotkeyScope,
persistRichTextField, persistRichTextField,
}; };
}; };

View File

@ -11,7 +11,7 @@ import { parseJson } from '~/utils/parseJson';
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
export const useRichTextFieldDisplay = () => { export const useRichTextFieldDisplay = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata( assertFieldMetadata(
FieldMetadataType.RICH_TEXT, FieldMetadataType.RICH_TEXT,
@ -31,6 +31,5 @@ export const useRichTextFieldDisplay = () => {
return { return {
fieldDefinition, fieldDefinition,
fieldValue: fieldValueParsed, fieldValue: fieldValueParsed,
hotkeyScope,
}; };
}; };

View File

@ -18,8 +18,7 @@ import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
export const useRichTextV2Field = () => { export const useRichTextV2Field = () => {
const { recordId, fieldDefinition, hotkeyScope, maxWidth } = const { recordId, fieldDefinition, maxWidth } = useContext(FieldContext);
useContext(FieldContext);
assertFieldMetadata( assertFieldMetadata(
FieldMetadataType.RICH_TEXT_V2, FieldMetadataType.RICH_TEXT_V2,
@ -67,7 +66,6 @@ export const useRichTextV2Field = () => {
fieldDefinition, fieldDefinition,
fieldValue: fieldRichTextV2Value, fieldValue: fieldRichTextV2Value,
setFieldValue, setFieldValue,
hotkeyScope,
persistRichTextField, persistRichTextField,
}; };
}; };

View File

@ -9,7 +9,7 @@ import { FieldMetadataType } from '~/generated-metadata/graphql';
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
export const useRichTextV2FieldDisplay = () => { export const useRichTextV2FieldDisplay = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata( assertFieldMetadata(
FieldMetadataType.RICH_TEXT_V2, FieldMetadataType.RICH_TEXT_V2,
@ -27,6 +27,5 @@ export const useRichTextV2FieldDisplay = () => {
return { return {
fieldDefinition, fieldDefinition,
fieldValue, fieldValue,
hotkeyScope,
}; };
}; };

View File

@ -13,7 +13,7 @@ import { isFieldSelect } from '../../types/guards/isFieldSelect';
import { isFieldSelectValue } from '../../types/guards/isFieldSelectValue'; import { isFieldSelectValue } from '../../types/guards/isFieldSelectValue';
export const useSelectField = () => { export const useSelectField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.SELECT, isFieldSelect, fieldDefinition); assertFieldMetadata(FieldMetadataType.SELECT, isFieldSelect, fieldDefinition);
@ -40,6 +40,5 @@ export const useSelectField = () => {
draftValue, draftValue,
setDraftValue, setDraftValue,
setFieldValue, setFieldValue,
hotkeyScope,
}; };
}; };

View File

@ -1,19 +1,17 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState, useRecoilValue } from 'recoil';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
import { FieldTextValue } from '@/object-record/record-field/types/FieldMetadata'; import { FieldTextValue } from '@/object-record/record-field/types/FieldMetadata';
import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata';
import { isFieldText } from '@/object-record/record-field/types/guards/isFieldText';
import { isFieldTextValue } from '@/object-record/record-field/types/guards/isFieldTextValue';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldText } from '../../types/guards/isFieldText';
import { isFieldTextValue } from '../../types/guards/isFieldTextValue';
export const useTextField = () => { export const useTextField = () => {
const { recordId, fieldDefinition, hotkeyScope, maxWidth } = const { recordId, fieldDefinition, maxWidth } = useContext(FieldContext);
useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.TEXT, isFieldText, fieldDefinition); assertFieldMetadata(FieldMetadataType.TEXT, isFieldText, fieldDefinition);
@ -39,6 +37,5 @@ export const useTextField = () => {
fieldDefinition, fieldDefinition,
fieldValue: fieldTextValue, fieldValue: fieldTextValue,
setFieldValue, setFieldValue,
hotkeyScope,
}; };
}; };

View File

@ -5,7 +5,7 @@ import { useRecordFieldValue } from '@/object-record/record-store/contexts/Recor
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
export const useTextFieldDisplay = () => { export const useTextFieldDisplay = () => {
const { recordId, fieldDefinition, hotkeyScope, displayedMaxRows } = const { recordId, fieldDefinition, displayedMaxRows } =
useContext(FieldContext); useContext(FieldContext);
const fieldName = fieldDefinition.metadata.fieldName; const fieldName = fieldDefinition.metadata.fieldName;
@ -16,7 +16,6 @@ export const useTextFieldDisplay = () => {
return { return {
fieldDefinition, fieldDefinition,
fieldValue, fieldValue,
hotkeyScope,
displayedMaxRows, displayedMaxRows,
}; };
}; };

View File

@ -1,17 +1,16 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState } from 'recoil'; import { useRecoilState } from 'recoil';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { FieldUUidValue } from '@/object-record/record-field/types/FieldMetadata'; import { FieldUUidValue } from '@/object-record/record-field/types/FieldMetadata';
import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata';
import { isFieldTextValue } from '@/object-record/record-field/types/guards/isFieldTextValue';
import { isFieldUuid } from '@/object-record/record-field/types/guards/isFieldUuid'; import { isFieldUuid } from '@/object-record/record-field/types/guards/isFieldUuid';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldTextValue } from '../../types/guards/isFieldTextValue';
export const useUuidField = () => { export const useUuidField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext); const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.UUID, isFieldUuid, fieldDefinition); assertFieldMetadata(FieldMetadataType.UUID, isFieldUuid, fieldDefinition);
@ -29,6 +28,5 @@ export const useUuidField = () => {
fieldDefinition, fieldDefinition,
fieldValue: fieldTextValue, fieldValue: fieldTextValue,
setFieldValue, setFieldValue,
hotkeyScope,
}; };
}; };

View File

@ -6,6 +6,7 @@ import {
FieldInputClickOutsideEvent, FieldInputClickOutsideEvent,
FieldInputEvent, FieldInputEvent,
} from '@/object-record/record-field/types/FieldInputEvent'; } from '@/object-record/record-field/types/FieldInputEvent';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { usePersistField } from '../../../hooks/usePersistField'; import { usePersistField } from '../../../hooks/usePersistField';
export type AddressFieldInputProps = { export type AddressFieldInputProps = {
@ -23,7 +24,7 @@ export const AddressFieldInput = ({
onTab, onTab,
onShiftTab, onShiftTab,
}: AddressFieldInputProps) => { }: AddressFieldInputProps) => {
const { hotkeyScope, draftValue, setDraftValue } = useAddressField(); const { draftValue, setDraftValue } = useAddressField();
const persistField = usePersistField(); const persistField = usePersistField();
@ -75,7 +76,7 @@ export const AddressFieldInput = ({
onClickOutside={handleClickOutside} onClickOutside={handleClickOutside}
onEnter={handleEnter} onEnter={handleEnter}
onEscape={handleEscape} onEscape={handleEscape}
hotkeyScope={hotkeyScope} hotkeyScope={DEFAULT_CELL_SCOPE.scope}
onChange={handleChange} onChange={handleChange}
onTab={handleTab} onTab={handleTab}
onShiftTab={handleShiftTab} onShiftTab={handleShiftTab}

View File

@ -1,6 +1,7 @@
import { useArrayField } from '@/object-record/record-field/meta-types/hooks/useArrayField'; import { useArrayField } from '@/object-record/record-field/meta-types/hooks/useArrayField';
import { ArrayFieldMenuItem } from '@/object-record/record-field/meta-types/input/components/ArrayFieldMenuItem'; import { ArrayFieldMenuItem } from '@/object-record/record-field/meta-types/input/components/ArrayFieldMenuItem';
import { MultiItemFieldInput } from '@/object-record/record-field/meta-types/input/components/MultiItemFieldInput'; import { MultiItemFieldInput } from '@/object-record/record-field/meta-types/input/components/MultiItemFieldInput';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { useMemo } from 'react'; import { useMemo } from 'react';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
@ -13,7 +14,7 @@ export const ArrayFieldInput = ({
onCancel, onCancel,
onClickOutside, onClickOutside,
}: ArrayFieldInputProps) => { }: ArrayFieldInputProps) => {
const { persistArrayField, hotkeyScope, fieldValue } = useArrayField(); const { persistArrayField, fieldValue, fieldDefinition } = useArrayField();
const arrayItems = useMemo<Array<string>>( const arrayItems = useMemo<Array<string>>(
() => (Array.isArray(fieldValue) ? fieldValue : []), () => (Array.isArray(fieldValue) ? fieldValue : []),
@ -22,7 +23,7 @@ export const ArrayFieldInput = ({
return ( return (
<MultiItemFieldInput <MultiItemFieldInput
hotkeyScope={hotkeyScope} hotkeyScope={DEFAULT_CELL_SCOPE.scope}
newItemLabel="Add Item" newItemLabel="Add Item"
items={arrayItems} items={arrayItems}
onPersist={persistArrayField} onPersist={persistArrayField}
@ -36,7 +37,7 @@ export const ArrayFieldInput = ({
renderItem={({ value, index, handleEdit, handleDelete }) => ( renderItem={({ value, index, handleEdit, handleDelete }) => (
<ArrayFieldMenuItem <ArrayFieldMenuItem
key={index} key={index}
dropdownId={`${hotkeyScope}-array-${index}`} dropdownId={`array-field-input-${fieldDefinition.metadata.fieldName}-${index}`}
value={value} value={value}
onEdit={handleEdit} onEdit={handleEdit}
onDelete={handleDelete} onDelete={handleDelete}

View File

@ -10,6 +10,7 @@ import {
FieldInputClickOutsideEvent, FieldInputClickOutsideEvent,
FieldInputEvent, FieldInputEvent,
} from '@/object-record/record-field/types/FieldInputEvent'; } from '@/object-record/record-field/types/FieldInputEvent';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
type CurrencyFieldInputProps = { type CurrencyFieldInputProps = {
@ -27,13 +28,8 @@ export const CurrencyFieldInput = ({
onTab, onTab,
onShiftTab, onShiftTab,
}: CurrencyFieldInputProps) => { }: CurrencyFieldInputProps) => {
const { const { draftValue, persistCurrencyField, setDraftValue, defaultValue } =
hotkeyScope, useCurrencyField();
draftValue,
persistCurrencyField,
setDraftValue,
defaultValue,
} = useCurrencyField();
const defaultCurrencyCodeWithoutSQLQuotes = ( const defaultCurrencyCodeWithoutSQLQuotes = (
defaultValue as FieldCurrencyValue defaultValue as FieldCurrencyValue
@ -129,7 +125,7 @@ export const CurrencyFieldInput = ({
onTab={handleTab} onTab={handleTab}
onChange={handleChange} onChange={handleChange}
onSelect={handleSelect} onSelect={handleSelect}
hotkeyScope={hotkeyScope} hotkeyScope={DEFAULT_CELL_SCOPE.scope}
/> />
); );
}; };

View File

@ -2,9 +2,10 @@ import { useDateField } from '@/object-record/record-field/meta-types/hooks/useD
import { DateInput } from '@/ui/field/input/components/DateInput'; import { DateInput } from '@/ui/field/input/components/DateInput';
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent'; import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
import { usePersistField } from '../../../hooks/usePersistField';
import { Nullable } from 'twenty-ui/utilities'; import { Nullable } from 'twenty-ui/utilities';
import { usePersistField } from '../../../hooks/usePersistField';
type FieldInputEvent = (persist: () => void) => void; type FieldInputEvent = (persist: () => void) => void;
@ -23,7 +24,7 @@ export const DateFieldInput = ({
onClear, onClear,
onSubmit, onSubmit,
}: DateFieldInputProps) => { }: DateFieldInputProps) => {
const { fieldValue, setDraftValue, hotkeyScope } = useDateField(); const { fieldValue, setDraftValue } = useDateField();
const persistField = usePersistField(); const persistField = usePersistField();
@ -80,7 +81,7 @@ export const DateFieldInput = ({
onChange={handleChange} onChange={handleChange}
onClear={handleClear} onClear={handleClear}
onSubmit={handleSubmit} onSubmit={handleSubmit}
hotkeyScope={hotkeyScope} hotkeyScope={DEFAULT_CELL_SCOPE.scope}
/> />
); );
}; };

View File

@ -3,9 +3,10 @@ import { DateInput } from '@/ui/field/input/components/DateInput';
import { FieldInputEvent } from '@/object-record/record-field/meta-types/input/components/NumberFieldInput'; import { FieldInputEvent } from '@/object-record/record-field/meta-types/input/components/NumberFieldInput';
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent'; import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { Nullable } from 'twenty-ui/utilities';
import { usePersistField } from '../../../hooks/usePersistField'; import { usePersistField } from '../../../hooks/usePersistField';
import { useDateTimeField } from '../../hooks/useDateTimeField'; import { useDateTimeField } from '../../hooks/useDateTimeField';
import { Nullable } from 'twenty-ui/utilities';
export type DateTimeFieldInputProps = { export type DateTimeFieldInputProps = {
onClickOutside?: FieldInputClickOutsideEvent; onClickOutside?: FieldInputClickOutsideEvent;
@ -22,7 +23,7 @@ export const DateTimeFieldInput = ({
onClear, onClear,
onSubmit, onSubmit,
}: DateTimeFieldInputProps) => { }: DateTimeFieldInputProps) => {
const { fieldValue, setDraftValue, hotkeyScope } = useDateTimeField(); const { fieldValue, setDraftValue } = useDateTimeField();
const persistField = usePersistField(); const persistField = usePersistField();
@ -76,7 +77,7 @@ export const DateTimeFieldInput = ({
isDateTimeInput isDateTimeInput
onClear={handleClear} onClear={handleClear}
onSubmit={handleSubmit} onSubmit={handleSubmit}
hotkeyScope={hotkeyScope} hotkeyScope={DEFAULT_CELL_SCOPE.scope}
/> />
); );
}; };

View File

@ -2,6 +2,7 @@ import { useEmailsField } from '@/object-record/record-field/meta-types/hooks/us
import { EmailsFieldMenuItem } from '@/object-record/record-field/meta-types/input/components/EmailsFieldMenuItem'; import { EmailsFieldMenuItem } from '@/object-record/record-field/meta-types/input/components/EmailsFieldMenuItem';
import { recordFieldInputIsFieldInErrorComponentState } from '@/object-record/record-field/states/recordFieldInputIsFieldInErrorComponentState'; import { recordFieldInputIsFieldInErrorComponentState } from '@/object-record/record-field/states/recordFieldInputIsFieldInErrorComponentState';
import { emailSchema } from '@/object-record/record-field/validation-schemas/emailSchema'; import { emailSchema } from '@/object-record/record-field/validation-schemas/emailSchema';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { useCallback, useMemo } from 'react'; import { useCallback, useMemo } from 'react';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
@ -17,7 +18,7 @@ export const EmailsFieldInput = ({
onCancel, onCancel,
onClickOutside, onClickOutside,
}: EmailsFieldInputProps) => { }: EmailsFieldInputProps) => {
const { persistEmailsField, hotkeyScope, fieldValue } = useEmailsField(); const { persistEmailsField, fieldValue } = useEmailsField();
const emails = useMemo<string[]>( const emails = useMemo<string[]>(
() => () =>
@ -75,7 +76,7 @@ export const EmailsFieldInput = ({
}) => ( }) => (
<EmailsFieldMenuItem <EmailsFieldMenuItem
key={index} key={index}
dropdownId={`${hotkeyScope}-emails-${index}`} dropdownId={`emails-${index}`}
isPrimary={isPrimaryEmail(index)} isPrimary={isPrimaryEmail(index)}
email={email} email={email}
onEdit={handleEdit} onEdit={handleEdit}
@ -84,7 +85,7 @@ export const EmailsFieldInput = ({
/> />
)} )}
onError={handleError} onError={handleError}
hotkeyScope={hotkeyScope} hotkeyScope={DEFAULT_CELL_SCOPE.scope}
/> />
); );
}; };

View File

@ -25,7 +25,7 @@ export const FullNameFieldInput = ({
onTab, onTab,
onShiftTab, onShiftTab,
}: FullNameFieldInputProps) => { }: FullNameFieldInputProps) => {
const { hotkeyScope, draftValue, setDraftValue, persistFullNameField } = const { draftValue, setDraftValue, persistFullNameField, fieldDefinition } =
useFullNameField(); useFullNameField();
const convertToFullName = (newDoubleText: FieldDoubleText) => { const convertToFullName = (newDoubleText: FieldDoubleText) => {
@ -93,7 +93,7 @@ export const FullNameFieldInput = ({
onShiftTab={handleShiftTab} onShiftTab={handleShiftTab}
onTab={handleTab} onTab={handleTab}
onPaste={handlePaste} onPaste={handlePaste}
hotkeyScope={hotkeyScope} hotkeyScope={`full-name-field-input-${fieldDefinition.metadata.fieldName}`}
onChange={handleChange} onChange={handleChange}
/> />
); );

View File

@ -1,6 +1,7 @@
import { useLinksField } from '@/object-record/record-field/meta-types/hooks/useLinksField'; import { useLinksField } from '@/object-record/record-field/meta-types/hooks/useLinksField';
import { LinksFieldMenuItem } from '@/object-record/record-field/meta-types/input/components/LinksFieldMenuItem'; import { LinksFieldMenuItem } from '@/object-record/record-field/meta-types/input/components/LinksFieldMenuItem';
import { recordFieldInputIsFieldInErrorComponentState } from '@/object-record/record-field/states/recordFieldInputIsFieldInErrorComponentState'; import { recordFieldInputIsFieldInErrorComponentState } from '@/object-record/record-field/states/recordFieldInputIsFieldInErrorComponentState';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { useMemo } from 'react'; import { useMemo } from 'react';
import { absoluteUrlSchema, isDefined } from 'twenty-shared/utils'; import { absoluteUrlSchema, isDefined } from 'twenty-shared/utils';
@ -16,7 +17,7 @@ export const LinksFieldInput = ({
onCancel, onCancel,
onClickOutside, onClickOutside,
}: LinksFieldInputProps) => { }: LinksFieldInputProps) => {
const { persistLinksField, hotkeyScope, fieldValue } = useLinksField(); const { persistLinksField, fieldValue, fieldDefinition } = useLinksField();
const links = useMemo<{ url: string; label: string }[]>( const links = useMemo<{ url: string; label: string }[]>(
() => () =>
@ -83,7 +84,7 @@ export const LinksFieldInput = ({
}) => ( }) => (
<LinksFieldMenuItem <LinksFieldMenuItem
key={index} key={index}
dropdownId={`${hotkeyScope}-links-${index}`} dropdownId={`links-field-input-${fieldDefinition.metadata.fieldName}-${index}`}
isPrimary={isPrimaryLink(index)} isPrimary={isPrimaryLink(index)}
label={link.label} label={link.label}
onEdit={handleEdit} onEdit={handleEdit}
@ -92,7 +93,7 @@ export const LinksFieldInput = ({
url={link.url} url={link.url}
/> />
)} )}
hotkeyScope={hotkeyScope} hotkeyScope={DEFAULT_CELL_SCOPE.scope}
/> />
); );
}; };

View File

@ -1,5 +1,6 @@
import { useMultiSelectField } from '@/object-record/record-field/meta-types/hooks/useMultiSelectField'; import { useMultiSelectField } from '@/object-record/record-field/meta-types/hooks/useMultiSelectField';
import { SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID } from '@/object-record/record-field/meta-types/input/constants/SelectFieldInputSelectableListComponentInstanceId'; import { SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID } from '@/object-record/record-field/meta-types/input/constants/SelectFieldInputSelectableListComponentInstanceId';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { MultiSelectInput } from '@/ui/field/input/components/MultiSelectInput'; import { MultiSelectInput } from '@/ui/field/input/components/MultiSelectInput';
type MultiSelectFieldInputProps = { type MultiSelectFieldInputProps = {
@ -9,15 +10,14 @@ type MultiSelectFieldInputProps = {
export const MultiSelectFieldInput = ({ export const MultiSelectFieldInput = ({
onCancel, onCancel,
}: MultiSelectFieldInputProps) => { }: MultiSelectFieldInputProps) => {
const { persistField, fieldDefinition, fieldValues, hotkeyScope } = const { persistField, fieldDefinition, fieldValues } = useMultiSelectField();
useMultiSelectField();
return ( return (
<MultiSelectInput <MultiSelectInput
selectableListComponentInstanceId={ selectableListComponentInstanceId={
SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID
} }
hotkeyScope={hotkeyScope} hotkeyScope={DEFAULT_CELL_SCOPE.scope}
options={fieldDefinition.metadata.options} options={fieldDefinition.metadata.options}
onCancel={onCancel} onCancel={onCancel}
onOptionSelected={persistField} onOptionSelected={persistField}

View File

@ -1,6 +1,7 @@
import { TextInput } from '@/ui/field/input/components/TextInput'; import { TextInput } from '@/ui/field/input/components/TextInput';
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent'; import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { FieldInputContainer } from '@/ui/field/input/components/FieldInputContainer'; import { FieldInputContainer } from '@/ui/field/input/components/FieldInputContainer';
import { useNumberField } from '../../hooks/useNumberField'; import { useNumberField } from '../../hooks/useNumberField';
@ -21,13 +22,8 @@ export const NumberFieldInput = ({
onTab, onTab,
onShiftTab, onShiftTab,
}: NumberFieldInputProps) => { }: NumberFieldInputProps) => {
const { const { fieldDefinition, draftValue, setDraftValue, persistNumberField } =
fieldDefinition, useNumberField();
draftValue,
setDraftValue,
hotkeyScope,
persistNumberField,
} = useNumberField();
const handleEnter = (newText: string) => { const handleEnter = (newText: string) => {
onEnter?.(() => persistNumberField(newText)); onEnter?.(() => persistNumberField(newText));
@ -67,7 +63,7 @@ export const NumberFieldInput = ({
onEscape={handleEscape} onEscape={handleEscape}
onShiftTab={handleShiftTab} onShiftTab={handleShiftTab}
onTab={handleTab} onTab={handleTab}
hotkeyScope={hotkeyScope} hotkeyScope={DEFAULT_CELL_SCOPE.scope}
onChange={handleChange} onChange={handleChange}
/> />
</FieldInputContainer> </FieldInputContainer>

View File

@ -9,11 +9,12 @@ import { MultiItemFieldInput } from './MultiItemFieldInput';
import { createPhonesFromFieldValue } from '@/object-record/record-field/meta-types/input/utils/phonesUtils'; import { createPhonesFromFieldValue } from '@/object-record/record-field/meta-types/input/utils/phonesUtils';
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent'; import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { PhoneCountryPickerDropdownButton } from '@/ui/input/components/internal/phone/components/PhoneCountryPickerDropdownButton'; import { PhoneCountryPickerDropdownButton } from '@/ui/input/components/internal/phone/components/PhoneCountryPickerDropdownButton';
import { css } from '@emotion/react'; import { css } from '@emotion/react';
import { TEXT_INPUT_STYLE } from 'twenty-ui/theme';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { stripSimpleQuotesFromString } from '~/utils/string/stripSimpleQuotesFromString'; import { stripSimpleQuotesFromString } from '~/utils/string/stripSimpleQuotesFromString';
import { TEXT_INPUT_STYLE } from 'twenty-ui/theme';
export const DEFAULT_PHONE_CALLING_CODE = '1'; export const DEFAULT_PHONE_CALLING_CODE = '1';
@ -69,8 +70,7 @@ export const PhonesFieldInput = ({
onCancel, onCancel,
onClickOutside, onClickOutside,
}: PhonesFieldInputProps) => { }: PhonesFieldInputProps) => {
const { persistPhonesField, hotkeyScope, fieldValue, fieldDefinition } = const { persistPhonesField, fieldValue, fieldDefinition } = usePhonesField();
usePhonesField();
const phones = createPhonesFromFieldValue(fieldValue); const phones = createPhonesFromFieldValue(fieldValue);
@ -128,7 +128,7 @@ export const PhonesFieldInput = ({
}) => ( }) => (
<PhonesFieldMenuItem <PhonesFieldMenuItem
key={index} key={index}
dropdownId={`${hotkeyScope}-phones-${index}`} dropdownId={`phones-field-input-${fieldDefinition.metadata.fieldName}-${index}`}
isPrimary={isPrimaryPhone(index)} isPrimary={isPrimaryPhone(index)}
phone={phone} phone={phone}
onEdit={handleEdit} onEdit={handleEdit}
@ -152,7 +152,7 @@ export const PhonesFieldInput = ({
</StyledCustomPhoneInputContainer> </StyledCustomPhoneInputContainer>
); );
}} }}
hotkeyScope={hotkeyScope} hotkeyScope={DEFAULT_CELL_SCOPE.scope}
/> />
); );
}; };

View File

@ -4,6 +4,7 @@ import {
FieldInputClickOutsideEvent, FieldInputClickOutsideEvent,
FieldInputEvent, FieldInputEvent,
} from '@/object-record/record-field/types/FieldInputEvent'; } from '@/object-record/record-field/types/FieldInputEvent';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { useJsonField } from '../../hooks/useJsonField'; import { useJsonField } from '../../hooks/useJsonField';
type RawJsonFieldInputProps = { type RawJsonFieldInputProps = {
@ -21,13 +22,8 @@ export const RawJsonFieldInput = ({
onTab, onTab,
onShiftTab, onShiftTab,
}: RawJsonFieldInputProps) => { }: RawJsonFieldInputProps) => {
const { const { fieldDefinition, draftValue, setDraftValue, persistJsonField } =
fieldDefinition, useJsonField();
draftValue,
hotkeyScope,
setDraftValue,
persistJsonField,
} = useJsonField();
const handleEnter = (newText: string) => { const handleEnter = (newText: string) => {
onEnter?.(() => persistJsonField(newText)); onEnter?.(() => persistJsonField(newText));
@ -66,7 +62,7 @@ export const RawJsonFieldInput = ({
onEscape={handleEscape} onEscape={handleEscape}
onShiftTab={handleShiftTab} onShiftTab={handleShiftTab}
onTab={handleTab} onTab={handleTab}
hotkeyScope={hotkeyScope} hotkeyScope={DEFAULT_CELL_SCOPE.scope}
onChange={handleChange} onChange={handleChange}
maxRows={25} maxRows={25}
/> />

View File

@ -3,6 +3,7 @@ import { FieldContext } from '@/object-record/record-field/contexts/FieldContext
import { useRichTextField } from '@/object-record/record-field/meta-types/hooks/useRichTextField'; import { useRichTextField } from '@/object-record/record-field/meta-types/hooks/useRichTextField';
import { useRegisterInputEvents } from '@/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents'; import { useRegisterInputEvents } from '@/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents';
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent'; import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { BlockEditor } from '@/ui/input/editor/components/BlockEditor'; import { BlockEditor } from '@/ui/input/editor/components/BlockEditor';
import { BlockEditorComponentInstanceContext } from '@/ui/input/editor/contexts/BlockEditorCompoponeInstanceContext'; import { BlockEditorComponentInstanceContext } from '@/ui/input/editor/contexts/BlockEditorCompoponeInstanceContext';
import { PartialBlock } from '@blocknote/core'; import { PartialBlock } from '@blocknote/core';
@ -27,7 +28,7 @@ export const RichTextFieldInput = ({
}: RichTextFieldInputProps) => { }: RichTextFieldInputProps) => {
const containerRef = useRef<HTMLDivElement>(null); const containerRef = useRef<HTMLDivElement>(null);
const { recordId } = useContext(FieldContext); const { recordId } = useContext(FieldContext);
const { draftValue, hotkeyScope, persistRichTextField, fieldDefinition } = const { draftValue, persistRichTextField, fieldDefinition } =
useRichTextField(); useRichTextField();
const editor = useCreateBlockNote({ const editor = useCreateBlockNote({
@ -44,7 +45,7 @@ export const RichTextFieldInput = ({
inputRef: containerRef, inputRef: containerRef,
inputValue: draftValue, inputValue: draftValue,
onClickOutside: handleClickOutside, onClickOutside: handleClickOutside,
hotkeyScope, hotkeyScope: DEFAULT_CELL_SCOPE.scope,
}); });
return ( return (

View File

@ -2,6 +2,7 @@ import { useClearField } from '@/object-record/record-field/hooks/useClearField'
import { useSelectField } from '@/object-record/record-field/meta-types/hooks/useSelectField'; import { useSelectField } from '@/object-record/record-field/meta-types/hooks/useSelectField';
import { SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID } from '@/object-record/record-field/meta-types/input/constants/SelectFieldInputSelectableListComponentInstanceId'; import { SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID } from '@/object-record/record-field/meta-types/input/constants/SelectFieldInputSelectableListComponentInstanceId';
import { FieldInputEvent } from '@/object-record/record-field/types/FieldInputEvent'; import { FieldInputEvent } from '@/object-record/record-field/types/FieldInputEvent';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { SelectInput } from '@/ui/field/input/components/SelectInput'; import { SelectInput } from '@/ui/field/input/components/SelectInput';
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList'; import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
@ -19,8 +20,7 @@ export const SelectFieldInput = ({
onSubmit, onSubmit,
onCancel, onCancel,
}: SelectFieldInputProps) => { }: SelectFieldInputProps) => {
const { persistField, fieldDefinition, fieldValue, hotkeyScope } = const { persistField, fieldDefinition, fieldValue } = useSelectField();
useSelectField();
const [filteredOptions, setFilteredOptions] = useState<SelectOption[]>([]); const [filteredOptions, setFilteredOptions] = useState<SelectOption[]>([]);
@ -50,7 +50,7 @@ export const SelectFieldInput = ({
onCancel?.(); onCancel?.();
resetSelectedItem(); resetSelectedItem();
}, },
hotkeyScope, `select-field-input-${fieldDefinition.metadata.fieldName}`,
[onCancel, resetSelectedItem], [onCancel, resetSelectedItem],
); );
@ -65,7 +65,7 @@ export const SelectFieldInput = ({
SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID
} }
selectableItemIdArray={optionIds} selectableItemIdArray={optionIds}
hotkeyScope={hotkeyScope} hotkeyScope={DEFAULT_CELL_SCOPE.scope}
onEnter={(itemId) => { onEnter={(itemId) => {
const option = filteredOptions.find( const option = filteredOptions.find(
(option) => option.value === itemId, (option) => option.value === itemId,

View File

@ -7,6 +7,7 @@ import {
FieldInputClickOutsideEvent, FieldInputClickOutsideEvent,
FieldInputEvent, FieldInputEvent,
} from '@/object-record/record-field/types/FieldInputEvent'; } from '@/object-record/record-field/types/FieldInputEvent';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { FieldInputContainer } from '@/ui/field/input/components/FieldInputContainer'; import { FieldInputContainer } from '@/ui/field/input/components/FieldInputContainer';
import { turnIntoUndefinedIfWhitespacesOnly } from '~/utils/string/turnIntoUndefinedIfWhitespacesOnly'; import { turnIntoUndefinedIfWhitespacesOnly } from '~/utils/string/turnIntoUndefinedIfWhitespacesOnly';
@ -25,8 +26,7 @@ export const TextFieldInput = ({
onTab, onTab,
onShiftTab, onShiftTab,
}: TextFieldInputProps) => { }: TextFieldInputProps) => {
const { fieldDefinition, draftValue, hotkeyScope, setDraftValue } = const { fieldDefinition, draftValue, setDraftValue } = useTextField();
useTextField();
const persistField = usePersistField(); const persistField = usePersistField();
const handleEnter = (newText: string) => { const handleEnter = (newText: string) => {
@ -67,7 +67,7 @@ export const TextFieldInput = ({
onEscape={handleEscape} onEscape={handleEscape}
onShiftTab={handleShiftTab} onShiftTab={handleShiftTab}
onTab={handleTab} onTab={handleTab}
hotkeyScope={hotkeyScope} hotkeyScope={DEFAULT_CELL_SCOPE.scope}
onChange={handleChange} onChange={handleChange}
/> />
</FieldInputContainer> </FieldInputContainer>

View File

@ -6,6 +6,7 @@ import { FieldContext } from '@/object-record/record-field/contexts/FieldContext
import { useAddressField } from '@/object-record/record-field/meta-types/hooks/useAddressField'; import { useAddressField } from '@/object-record/record-field/meta-types/hooks/useAddressField';
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext'; import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
import { FieldAddressDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue'; import { FieldAddressDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId'; import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId';
import { import {
AddressInput, AddressInput,
@ -45,7 +46,7 @@ const AddressInputWithContext = ({
const setHotKeyScope = useSetHotkeyScope(); const setHotKeyScope = useSetHotkeyScope();
useEffect(() => { useEffect(() => {
setHotKeyScope('hotkey-scope'); setHotKeyScope(DEFAULT_CELL_SCOPE.scope);
}, [setHotKeyScope]); }, [setHotKeyScope]);
return ( return (
@ -73,7 +74,6 @@ const AddressInputWithContext = ({
}, },
}, },
recordId: recordId ?? '123', recordId: recordId ?? '123',
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: false, isLabelIdentifier: false,
isReadOnly: false, isReadOnly: false,
}} }}
@ -84,7 +84,7 @@ const AddressInputWithContext = ({
onEscape={onEscape} onEscape={onEscape}
onClickOutside={onClickOutside} onClickOutside={onClickOutside}
value={value} value={value}
hotkeyScope="hotkey-scope" hotkeyScope={DEFAULT_CELL_SCOPE.scope}
onTab={onTab} onTab={onTab}
onShiftTab={onShiftTab} onShiftTab={onShiftTab}
/> />

View File

@ -64,7 +64,6 @@ const BooleanFieldInputWithContext = ({
}, },
}, },
recordId: recordId ?? '123', recordId: recordId ?? '123',
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: false, isLabelIdentifier: false,
isReadOnly: false, isReadOnly: false,
}} }}

View File

@ -7,6 +7,7 @@ import { FieldMetadataType } from '~/generated/graphql';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext'; import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId'; import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId';
import { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect'; import { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect';
import { useDateTimeField } from '../../../hooks/useDateTimeField'; import { useDateTimeField } from '../../../hooks/useDateTimeField';
@ -64,7 +65,7 @@ const DateFieldInputWithContext = ({
const setHotkeyScope = useSetHotkeyScope(); const setHotkeyScope = useSetHotkeyScope();
useEffect(() => { useEffect(() => {
setHotkeyScope('hotkey-scope'); setHotkeyScope(DEFAULT_CELL_SCOPE.scope);
}, [setHotkeyScope]); }, [setHotkeyScope]);
return ( return (
@ -91,7 +92,6 @@ const DateFieldInputWithContext = ({
}, },
}, },
recordId: '123', recordId: '123',
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: false, isLabelIdentifier: false,
isReadOnly: false, isReadOnly: false,
}} }}

View File

@ -8,6 +8,7 @@ import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext'; import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId'; import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId';
import { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect'; import { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator'; import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
@ -41,7 +42,7 @@ const NumberFieldInputWithContext = ({
const setHotKeyScope = useSetHotkeyScope(); const setHotKeyScope = useSetHotkeyScope();
useEffect(() => { useEffect(() => {
setHotKeyScope('hotkey-scope'); setHotKeyScope(DEFAULT_CELL_SCOPE.scope);
}, [setHotKeyScope]); }, [setHotKeyScope]);
return ( return (
@ -68,7 +69,6 @@ const NumberFieldInputWithContext = ({
}, },
}, },
recordId: '123', recordId: '123',
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: false, isLabelIdentifier: false,
isReadOnly: false, isReadOnly: false,
}} }}

View File

@ -6,6 +6,7 @@ import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext'; import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId'; import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId';
import { FieldMetadataType } from 'twenty-shared/types'; import { FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
@ -40,7 +41,7 @@ const RatingFieldInputWithContext = ({
const setHotKeyScope = useSetHotkeyScope(); const setHotKeyScope = useSetHotkeyScope();
useEffect(() => { useEffect(() => {
setHotKeyScope('hotkey-scope'); setHotKeyScope(DEFAULT_CELL_SCOPE.scope);
}, [setHotKeyScope]); }, [setHotKeyScope]);
return ( return (
@ -66,7 +67,6 @@ const RatingFieldInputWithContext = ({
}, },
}, },
recordId: recordId ?? '123', recordId: recordId ?? '123',
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: false, isLabelIdentifier: false,
isReadOnly: false, isReadOnly: false,
}} }}

View File

@ -19,6 +19,7 @@ import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSi
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { useOpenFieldInputEditMode } from '@/object-record/record-field/hooks/useOpenFieldInputEditMode'; import { useOpenFieldInputEditMode } from '@/object-record/record-field/hooks/useOpenFieldInputEditMode';
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext'; import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
import { MultipleRecordPickerHotkeyScope } from '@/object-record/record-picker/multiple-record-picker/types/MultipleRecordPickerHotkeyScope';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { FieldMetadataType } from 'twenty-shared/types'; import { FieldMetadataType } from 'twenty-shared/types';
import { RelationDefinitionType } from '~/generated-metadata/graphql'; import { RelationDefinitionType } from '~/generated-metadata/graphql';
@ -70,7 +71,7 @@ const RelationManyFieldInputWithContext = () => {
useEffect(() => { useEffect(() => {
setRecordStoreFieldValue([]); setRecordStoreFieldValue([]);
setHotKeyScope('hotkey-scope'); setHotKeyScope(MultipleRecordPickerHotkeyScope.MultipleRecordPicker);
openFieldInput({ openFieldInput({
fieldDefinition, fieldDefinition,
recordId: 'recordId', recordId: 'recordId',
@ -93,7 +94,6 @@ const RelationManyFieldInputWithContext = () => {
value={{ value={{
fieldDefinition, fieldDefinition,
recordId: 'recordId', recordId: 'recordId',
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: false, isLabelIdentifier: false,
isReadOnly: false, isReadOnly: false,
}} }}

View File

@ -19,13 +19,14 @@ import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSi
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext'; import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
import { recordFieldInputLayoutDirectionLoadingComponentState } from '@/object-record/record-field/states/recordFieldInputLayoutDirectionLoadingComponentState'; import { recordFieldInputLayoutDirectionLoadingComponentState } from '@/object-record/record-field/states/recordFieldInputLayoutDirectionLoadingComponentState';
import { SingleRecordPickerHotkeyScope } from '@/object-record/record-picker/single-record-picker/types/SingleRecordPickerHotkeyScope';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { FieldMetadataType } from 'twenty-shared/types'; import { FieldMetadataType } from 'twenty-shared/types';
import { getCanvasElementForDropdownTesting } from 'twenty-ui/testing';
import { import {
RelationToOneFieldInput, RelationToOneFieldInput,
RelationToOneFieldInputProps, RelationToOneFieldInputProps,
} from '../RelationToOneFieldInput'; } from '../RelationToOneFieldInput';
import { getCanvasElementForDropdownTesting } from 'twenty-ui/testing';
const RelationWorkspaceSetterEffect = () => { const RelationWorkspaceSetterEffect = () => {
const setCurrentWorkspace = useSetRecoilState(currentWorkspaceState); const setCurrentWorkspace = useSetRecoilState(currentWorkspaceState);
@ -64,7 +65,7 @@ const RelationToOneFieldInputWithContext = ({
const setHotKeyScope = useSetHotkeyScope(); const setHotKeyScope = useSetHotkeyScope();
useEffect(() => { useEffect(() => {
setHotKeyScope('hotkey-scope'); setHotKeyScope(SingleRecordPickerHotkeyScope.SingleRecordPicker);
}, [setHotKeyScope]); }, [setHotKeyScope]);
return ( return (
@ -86,7 +87,6 @@ const RelationToOneFieldInputWithContext = ({
}, },
}, },
recordId: recordId, recordId: recordId,
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: false, isLabelIdentifier: false,
isReadOnly: false, isReadOnly: false,
}} }}

View File

@ -5,6 +5,7 @@ import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext'; import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { Decorator, Meta, StoryObj } from '@storybook/react'; import { Decorator, Meta, StoryObj } from '@storybook/react';
import { FieldMetadataType } from '~/generated/graphql'; import { FieldMetadataType } from '~/generated/graphql';
import { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect'; import { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect';
@ -39,7 +40,7 @@ const TextFieldInputWithContext = ({
const setHotKeyScope = useSetHotkeyScope(); const setHotKeyScope = useSetHotkeyScope();
useEffect(() => { useEffect(() => {
setHotKeyScope('hotkey-scope'); setHotKeyScope(DEFAULT_CELL_SCOPE.scope);
}, [setHotKeyScope]); }, [setHotKeyScope]);
return ( return (
@ -61,7 +62,6 @@ const TextFieldInputWithContext = ({
objectMetadataNameSingular: 'person', objectMetadataNameSingular: 'person',
}, },
}, },
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: false, isLabelIdentifier: false,
isReadOnly: false, isReadOnly: false,
}} }}

View File

@ -6,14 +6,18 @@ import {
import { useMultipleRecordPickerPerformSearch } from '@/object-record/record-picker/multiple-record-picker/hooks/useMultipleRecordPickerPerformSearch'; import { useMultipleRecordPickerPerformSearch } from '@/object-record/record-picker/multiple-record-picker/hooks/useMultipleRecordPickerPerformSearch';
import { multipleRecordPickerPickableMorphItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerPickableMorphItemsComponentState'; import { multipleRecordPickerPickableMorphItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerPickableMorphItemsComponentState';
import { multipleRecordPickerSearchableObjectMetadataItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerSearchableObjectMetadataItemsComponentState'; import { multipleRecordPickerSearchableObjectMetadataItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerSearchableObjectMetadataItemsComponentState';
import { MultipleRecordPickerHotkeyScope } from '@/object-record/record-picker/multiple-record-picker/types/MultipleRecordPickerHotkeyScope';
import { RecordPickerPickableMorphItem } from '@/object-record/record-picker/types/RecordPickerPickableMorphItem'; import { RecordPickerPickableMorphItem } from '@/object-record/record-picker/types/RecordPickerPickableMorphItem';
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
import { useRecoilCallback } from 'recoil'; import { useRecoilCallback } from 'recoil';
export const useOpenRelationFromManyFieldInput = () => { export const useOpenRelationFromManyFieldInput = () => {
const { performSearch } = useMultipleRecordPickerPerformSearch(); const { performSearch } = useMultipleRecordPickerPerformSearch();
const { setHotkeyScopeAndMemorizePreviousScope } = usePreviousHotkeyScope();
const openRelationFromManyFieldInput = useRecoilCallback( const openRelationFromManyFieldInput = useRecoilCallback(
({ set, snapshot }) => ({ set, snapshot }) =>
({ ({
@ -83,8 +87,12 @@ export const useOpenRelationFromManyFieldInput = () => {
forceSearchableObjectMetadataItems: [objectMetadataItem], forceSearchableObjectMetadataItems: [objectMetadataItem],
forcePickableMorphItems: pickableMorphItems, forcePickableMorphItems: pickableMorphItems,
}); });
setHotkeyScopeAndMemorizePreviousScope(
MultipleRecordPickerHotkeyScope.MultipleRecordPicker,
);
}, },
[performSearch], [performSearch, setHotkeyScopeAndMemorizePreviousScope],
); );
return { openRelationFromManyFieldInput }; return { openRelationFromManyFieldInput };

View File

@ -3,11 +3,15 @@ import {
FieldRelationValue, FieldRelationValue,
} from '@/object-record/record-field/types/FieldMetadata'; } from '@/object-record/record-field/types/FieldMetadata';
import { singleRecordPickerSelectedIdComponentState } from '@/object-record/record-picker/single-record-picker/states/singleRecordPickerSelectedIdComponentState'; import { singleRecordPickerSelectedIdComponentState } from '@/object-record/record-picker/single-record-picker/states/singleRecordPickerSelectedIdComponentState';
import { SingleRecordPickerHotkeyScope } from '@/object-record/record-picker/single-record-picker/types/SingleRecordPickerHotkeyScope';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
import { useRecoilCallback } from 'recoil'; import { useRecoilCallback } from 'recoil';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
export const useOpenRelationToOneFieldInput = () => { export const useOpenRelationToOneFieldInput = () => {
const { setHotkeyScopeAndMemorizePreviousScope } = usePreviousHotkeyScope();
const openRelationToOneFieldInput = useRecoilCallback( const openRelationToOneFieldInput = useRecoilCallback(
({ set, snapshot }) => ({ set, snapshot }) =>
({ fieldName, recordId }: { fieldName: string; recordId: string }) => { ({ fieldName, recordId }: { fieldName: string; recordId: string }) => {
@ -29,8 +33,12 @@ export const useOpenRelationToOneFieldInput = () => {
fieldValue.id, fieldValue.id,
); );
} }
setHotkeyScopeAndMemorizePreviousScope(
SingleRecordPickerHotkeyScope.SingleRecordPicker,
);
}, },
[], [setHotkeyScopeAndMemorizePreviousScope],
); );
return { openRelationToOneFieldInput }; return { openRelationToOneFieldInput };

View File

@ -2,10 +2,10 @@ import { isFieldRelation } from '@/object-record/record-field/types/guards/isFie
import { RelationDefinitionType } from '~/generated-metadata/graphql'; import { RelationDefinitionType } from '~/generated-metadata/graphql';
import { FieldDefinition } from '../FieldDefinition'; import { FieldDefinition } from '../FieldDefinition';
import { FieldMetadata } from '../FieldMetadata'; import { FieldMetadata, FieldRelationMetadata } from '../FieldMetadata';
export const isFieldRelationToOneObject = ( export const isFieldRelationToOneObject = (
field: Pick<FieldDefinition<FieldMetadata>, 'type' | 'metadata'>, field: Pick<FieldDefinition<FieldMetadata>, 'type' | 'metadata'>,
): field is FieldDefinition<FieldMetadata> => ): field is FieldDefinition<FieldRelationMetadata> =>
isFieldRelation(field) && isFieldRelation(field) &&
field.metadata.relationType === RelationDefinitionType.MANY_TO_ONE; field.metadata.relationType === RelationDefinitionType.MANY_TO_ONE;

View File

@ -13,24 +13,16 @@ import {
import { useIsFieldInputOnly } from '@/object-record/record-field/hooks/useIsFieldInputOnly'; import { useIsFieldInputOnly } from '@/object-record/record-field/hooks/useIsFieldInputOnly';
import { useOpenFieldInputEditMode } from '@/object-record/record-field/hooks/useOpenFieldInputEditMode'; import { useOpenFieldInputEditMode } from '@/object-record/record-field/hooks/useOpenFieldInputEditMode';
import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition';
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation';
import { isFieldSelect } from '@/object-record/record-field/types/guards/isFieldSelect';
import { useInlineCell } from '@/object-record/record-inline-cell/hooks/useInlineCell'; import { useInlineCell } from '@/object-record/record-inline-cell/hooks/useInlineCell';
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope'; import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
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 { SelectFieldHotkeyScope } from '@/object-record/select/types/SelectFieldHotkeyScope';
import { currentHotkeyScopeState } from '@/ui/utilities/hotkey/states/internal/currentHotkeyScopeState'; import { currentHotkeyScopeState } from '@/ui/utilities/hotkey/states/internal/currentHotkeyScopeState';
import { useRecoilCallback } from 'recoil'; import { useRecoilCallback } from 'recoil';
import { RelationDefinitionType } from '~/generated-metadata/graphql'; import { useIcons } from 'twenty-ui/display';
import { RecordInlineCellContainer } from './RecordInlineCellContainer'; import { RecordInlineCellContainer } from './RecordInlineCellContainer';
import { import {
RecordInlineCellContext, RecordInlineCellContext,
RecordInlineCellContextProps, RecordInlineCellContextProps,
} from './RecordInlineCellContext'; } from './RecordInlineCellContext';
import { useIcons } from 'twenty-ui/display';
type RecordInlineCellProps = { type RecordInlineCellProps = {
readonly?: boolean; readonly?: boolean;
@ -102,35 +94,6 @@ export const RecordInlineCell = ({ loading }: RecordInlineCellProps) => {
const { getIcon } = useIcons(); const { getIcon } = useIcons();
const { openFieldInput, closeFieldInput } = useOpenFieldInputEditMode(); const { openFieldInput, closeFieldInput } = useOpenFieldInputEditMode();
// TODO: deprecate this and use useOpenFieldInput hooks to set the hotkey scope
const computedHotkeyScope = (
columnDefinition: FieldDefinition<FieldMetadata>,
) => {
if (isFieldRelation(columnDefinition)) {
if (
columnDefinition.metadata.relationType ===
RelationDefinitionType.MANY_TO_ONE
) {
return SingleRecordPickerHotkeyScope.SingleRecordPicker;
}
if (
columnDefinition.metadata.relationType ===
RelationDefinitionType.ONE_TO_MANY
) {
return MultipleRecordPickerHotkeyScope.MultipleRecordPicker;
}
return SingleRecordPickerHotkeyScope.SingleRecordPicker;
}
if (isFieldSelect(columnDefinition)) {
return SelectFieldHotkeyScope.SelectField;
}
return undefined;
};
const RecordInlineCellContextValue: RecordInlineCellContextProps = { const RecordInlineCellContextValue: RecordInlineCellContextProps = {
readonly: isReadOnly, readonly: isReadOnly,
buttonIcon: buttonIcon, buttonIcon: buttonIcon,
@ -157,7 +120,6 @@ export const RecordInlineCell = ({ loading }: RecordInlineCellProps) => {
isDisplayModeFixHeight: isDisplayModeFixHeight, isDisplayModeFixHeight: isDisplayModeFixHeight,
editModeContentOnly: isFieldInputOnly, editModeContentOnly: isFieldInputOnly,
loading: loading, loading: loading,
customEditHotkeyScope: computedHotkeyScope(fieldDefinition),
onOpenEditMode: onOpenEditMode:
onOpenEditMode ?? (() => openFieldInput({ fieldDefinition, recordId })), onOpenEditMode ?? (() => openFieldInput({ fieldDefinition, recordId })),
onCloseEditMode: onCloseEditMode ?? (() => closeFieldInput()), onCloseEditMode: onCloseEditMode ?? (() => closeFieldInput()),

View File

@ -11,7 +11,6 @@ export type RecordInlineCellContextProps = {
editModeContent?: ReactElement; editModeContent?: ReactElement;
editModeContentOnly?: boolean; editModeContentOnly?: boolean;
displayModeContent?: ReactElement; displayModeContent?: ReactElement;
customEditHotkeyScope?: string;
isDisplayModeFixHeight?: boolean; isDisplayModeFixHeight?: boolean;
disableHoverEffect?: boolean; disableHoverEffect?: boolean;
loading?: boolean; loading?: boolean;
@ -30,7 +29,6 @@ const defaultRecordInlineCellContextProp: RecordInlineCellContextProps = {
editModeContent: undefined, editModeContent: undefined,
editModeContentOnly: false, editModeContentOnly: false,
displayModeContent: undefined, displayModeContent: undefined,
customEditHotkeyScope: undefined,
isDisplayModeFixHeight: false, isDisplayModeFixHeight: false,
disableHoverEffect: false, disableHoverEffect: false,
loading: false, loading: false,

View File

@ -32,7 +32,6 @@ const StyledClickableContainer = styled.div<{
export const RecordInlineCellValue = () => { export const RecordInlineCellValue = () => {
const { const {
displayModeContent, displayModeContent,
customEditHotkeyScope,
editModeContent, editModeContent,
editModeContentOnly, editModeContentOnly,
readonly, readonly,
@ -44,7 +43,7 @@ export const RecordInlineCellValue = () => {
const handleDisplayModeClick = () => { const handleDisplayModeClick = () => {
if (!readonly && !editModeContentOnly) { if (!readonly && !editModeContentOnly) {
openInlineCell(customEditHotkeyScope); openInlineCell();
} }
}; };

View File

@ -12,9 +12,7 @@ import { getDropdownFocusIdForRecordField } from '@/object-record/utils/getDropd
import { useGoBackToPreviousDropdownFocusId } from '@/ui/layout/dropdown/hooks/useGoBackToPreviousDropdownFocusId'; import { useGoBackToPreviousDropdownFocusId } from '@/ui/layout/dropdown/hooks/useGoBackToPreviousDropdownFocusId';
import { useSetActiveDropdownFocusIdAndMemorizePrevious } from '@/ui/layout/dropdown/hooks/useSetFocusedDropdownIdAndMemorizePrevious'; import { useSetActiveDropdownFocusIdAndMemorizePrevious } from '@/ui/layout/dropdown/hooks/useSetFocusedDropdownIdAndMemorizePrevious';
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow'; import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
import { isDefined } from 'twenty-shared/utils';
import { isInlineCellInEditModeScopedState } from '../states/isInlineCellInEditModeScopedState'; import { isInlineCellInEditModeScopedState } from '../states/isInlineCellInEditModeScopedState';
import { InlineCellHotkeyScope } from '../types/InlineCellHotkeyScope';
export const useInlineCell = ( export const useInlineCell = (
recordFieldComponentInstanceIdFromProps?: string, recordFieldComponentInstanceIdFromProps?: string,
@ -37,10 +35,9 @@ export const useInlineCell = (
const { goBackToPreviousDropdownFocusId } = const { goBackToPreviousDropdownFocusId } =
useGoBackToPreviousDropdownFocusId(); useGoBackToPreviousDropdownFocusId();
const { const { goBackToPreviousHotkeyScope } = usePreviousHotkeyScope(
setHotkeyScopeAndMemorizePreviousScope, INLINE_CELL_HOTKEY_SCOPE_MEMOIZE_KEY,
goBackToPreviousHotkeyScope, );
} = usePreviousHotkeyScope(INLINE_CELL_HOTKEY_SCOPE_MEMOIZE_KEY);
const initFieldInputDraftValue = useInitDraftValueV2(); const initFieldInputDraftValue = useInitDraftValueV2();
@ -53,7 +50,7 @@ export const useInlineCell = (
goBackToPreviousDropdownFocusId(); goBackToPreviousDropdownFocusId();
}; };
const openInlineCell = (customEditHotkeyScopeForField?: string) => { const openInlineCell = () => {
onOpenEditMode?.(); onOpenEditMode?.();
setIsInlineCellInEditMode(true); setIsInlineCellInEditMode(true);
initFieldInputDraftValue({ initFieldInputDraftValue({
@ -62,12 +59,6 @@ export const useInlineCell = (
fieldComponentInstanceId: recordFieldComponentInstanceId, fieldComponentInstanceId: recordFieldComponentInstanceId,
}); });
if (isDefined(customEditHotkeyScopeForField)) {
setHotkeyScopeAndMemorizePreviousScope(customEditHotkeyScopeForField);
} else {
setHotkeyScopeAndMemorizePreviousScope(InlineCellHotkeyScope.InlineCell);
}
setActiveDropdownFocusIdAndMemorizePrevious( setActiveDropdownFocusIdAndMemorizePrevious(
getDropdownFocusIdForRecordField( getDropdownFocusIdForRecordField(
recordId, recordId,

View File

@ -11,7 +11,6 @@ import { RecordFieldComponentInstanceContext } from '@/object-record/record-fiel
import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell'; import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell';
import { PropertyBox } from '@/object-record/record-inline-cell/property-box/components/PropertyBox'; import { PropertyBox } from '@/object-record/record-inline-cell/property-box/components/PropertyBox';
import { PropertyBoxSkeletonLoader } from '@/object-record/record-inline-cell/property-box/components/PropertyBoxSkeletonLoader'; import { PropertyBoxSkeletonLoader } from '@/object-record/record-inline-cell/property-box/components/PropertyBoxSkeletonLoader';
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
import { useRecordShowContainerActions } from '@/object-record/record-show/hooks/useRecordShowContainerActions'; import { useRecordShowContainerActions } from '@/object-record/record-show/hooks/useRecordShowContainerActions';
import { useRecordShowContainerData } from '@/object-record/record-show/hooks/useRecordShowContainerData'; import { useRecordShowContainerData } from '@/object-record/record-show/hooks/useRecordShowContainerData';
import { RecordDetailDuplicatesSection } from '@/object-record/record-show/record-detail-section/components/RecordDetailDuplicatesSection'; import { RecordDetailDuplicatesSection } from '@/object-record/record-show/record-detail-section/components/RecordDetailDuplicatesSection';
@ -112,7 +111,6 @@ export const FieldsCard = ({
labelWidth: 90, labelWidth: 90,
}), }),
useUpdateRecord: useUpdateOneObjectRecordMutation, useUpdateRecord: useUpdateOneObjectRecordMutation,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isDisplayModeFixHeight: true, isDisplayModeFixHeight: true,
isReadOnly: isRecordReadOnly, isReadOnly: isRecordReadOnly,
}} }}
@ -150,7 +148,6 @@ export const FieldsCard = ({
labelWidth: 90, labelWidth: 90,
}), }),
useUpdateRecord: useUpdateOneObjectRecordMutation, useUpdateRecord: useUpdateOneObjectRecordMutation,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isDisplayModeFixHeight: true, isDisplayModeFixHeight: true,
isReadOnly: isRecordReadOnly, isReadOnly: isRecordReadOnly,
}} }}
@ -187,7 +184,6 @@ export const FieldsCard = ({
objectMetadataItem, objectMetadataItem,
}), }),
useUpdateRecord: useUpdateOneObjectRecordMutation, useUpdateRecord: useUpdateOneObjectRecordMutation,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isDisplayModeFixHeight: true, isDisplayModeFixHeight: true,
isReadOnly: isRecordReadOnly, isReadOnly: isRecordReadOnly,
}} }}

View File

@ -2,7 +2,6 @@ import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord'; import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { useIsRecordReadOnly } from '@/object-record/record-field/hooks/useIsRecordReadOnly'; import { useIsRecordReadOnly } from '@/object-record/record-field/hooks/useIsRecordReadOnly';
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
import { useRecordShowContainerActions } from '@/object-record/record-show/hooks/useRecordShowContainerActions'; import { useRecordShowContainerActions } from '@/object-record/record-show/hooks/useRecordShowContainerActions';
import { RecordTitleCell } from '@/object-record/record-title-cell/components/RecordTitleCell'; import { RecordTitleCell } from '@/object-record/record-title-cell/components/RecordTitleCell';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
@ -89,7 +88,6 @@ export const ObjectRecordShowPageBreadcrumb = ({
defaultValue: labelIdentifierFieldMetadataItem?.defaultValue, defaultValue: labelIdentifierFieldMetadataItem?.defaultValue,
}, },
useUpdateRecord: useUpdateOneObjectRecordMutation, useUpdateRecord: useUpdateOneObjectRecordMutation,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isCentered: false, isCentered: false,
isDisplayModeFixHeight: true, isDisplayModeFixHeight: true,
isReadOnly: isRecordReadOnly, isReadOnly: isRecordReadOnly,

View File

@ -2,7 +2,6 @@ import { useGetStandardObjectIcon } from '@/object-metadata/hooks/useGetStandard
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { useIsRecordReadOnly } from '@/object-record/record-field/hooks/useIsRecordReadOnly'; import { useIsRecordReadOnly } from '@/object-record/record-field/hooks/useIsRecordReadOnly';
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
import { useRecordShowContainerActions } from '@/object-record/record-show/hooks/useRecordShowContainerActions'; import { useRecordShowContainerActions } from '@/object-record/record-show/hooks/useRecordShowContainerActions';
import { useRecordShowContainerData } from '@/object-record/record-show/hooks/useRecordShowContainerData'; import { useRecordShowContainerData } from '@/object-record/record-show/hooks/useRecordShowContainerData';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
@ -90,7 +89,6 @@ export const SummaryCard = ({
defaultValue: labelIdentifierFieldMetadataItem?.defaultValue, defaultValue: labelIdentifierFieldMetadataItem?.defaultValue,
}, },
useUpdateRecord: useUpdateOneObjectRecordMutation, useUpdateRecord: useUpdateOneObjectRecordMutation,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isCentered: !isMobile, isCentered: !isMobile,
isDisplayModeFixHeight: true, isDisplayModeFixHeight: true,
isReadOnly: isRecordReadOnly, isReadOnly: isRecordReadOnly,

View File

@ -23,7 +23,6 @@ import { RecordFieldComponentInstanceContext } from '@/object-record/record-fiel
import { FieldRelationMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { FieldRelationMetadata } from '@/object-record/record-field/types/FieldMetadata';
import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell'; import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell';
import { PropertyBox } from '@/object-record/record-inline-cell/property-box/components/PropertyBox'; import { PropertyBox } from '@/object-record/record-inline-cell/property-box/components/PropertyBox';
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
import { RecordDetailRecordsListItem } from '@/object-record/record-show/record-detail-section/components/RecordDetailRecordsListItem'; import { RecordDetailRecordsListItem } from '@/object-record/record-show/record-detail-section/components/RecordDetailRecordsListItem';
import { RecordValueSetterEffect } from '@/object-record/record-store/components/RecordValueSetterEffect'; import { RecordValueSetterEffect } from '@/object-record/record-store/components/RecordValueSetterEffect';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
@ -36,8 +35,6 @@ import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope'; import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope';
import { ConfirmationModal } from '@/ui/layout/modal/components/ConfirmationModal'; import { ConfirmationModal } from '@/ui/layout/modal/components/ConfirmationModal';
import { createPortal } from 'react-dom'; import { createPortal } from 'react-dom';
import { RelationDefinitionType } from '~/generated-metadata/graphql';
import { AnimatedEaseInOut } from 'twenty-ui/utilities';
import { import {
IconChevronDown, IconChevronDown,
IconComponent, IconComponent,
@ -47,6 +44,8 @@ import {
} from 'twenty-ui/display'; } from 'twenty-ui/display';
import { LightIconButton } from 'twenty-ui/input'; import { LightIconButton } from 'twenty-ui/input';
import { MenuItem } from 'twenty-ui/navigation'; import { MenuItem } from 'twenty-ui/navigation';
import { AnimatedEaseInOut } from 'twenty-ui/utilities';
import { RelationDefinitionType } from '~/generated-metadata/graphql';
const StyledListItem = styled(RecordDetailRecordsListItem)<{ const StyledListItem = styled(RecordDetailRecordsListItem)<{
isDropdownOpen?: boolean; isDropdownOpen?: boolean;
@ -286,7 +285,6 @@ export const RecordDetailRelationRecordsListItem = ({
labelWidth: 90, labelWidth: 90,
}), }),
useUpdateRecord: useUpdateOneObjectRecordMutation, useUpdateRecord: useUpdateOneObjectRecordMutation,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isReadOnly: false, isReadOnly: false,
}} }}
> >

View File

@ -10,11 +10,11 @@ import { graphqlMocks } from '~/testing/graphqlMocks';
import { getCompaniesMock } from '~/testing/mock-data/companies'; import { getCompaniesMock } from '~/testing/mock-data/companies';
import { ContextStoreComponentInstanceContext } from '@/context-store/states/contexts/ContextStoreComponentInstanceContext'; import { ContextStoreComponentInstanceContext } from '@/context-store/states/contexts/ContextStoreComponentInstanceContext';
import { ComponentDecorator } from 'twenty-ui/testing';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator'; import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
import { allMockPersonRecords } from '~/testing/mock-data/people'; import { allMockPersonRecords } from '~/testing/mock-data/people';
import { RecordDetailRelationSection } from '../RecordDetailRelationSection'; import { RecordDetailRelationSection } from '../RecordDetailRelationSection';
import { ComponentDecorator } from 'twenty-ui/testing';
const companiesMock = getCompaniesMock(); const companiesMock = getCompaniesMock();
@ -45,7 +45,6 @@ const meta: Meta<typeof RecordDetailRelationSection> = {
)!, )!,
objectMetadataItem: mockedCompanyObjectMetadataItem, objectMetadataItem: mockedCompanyObjectMetadataItem,
}), }),
hotkeyScope: 'hotkey-scope',
isReadOnly: false, isReadOnly: false,
}} }}
> >

View File

@ -135,7 +135,6 @@ const meta: Meta = {
fieldDefinition: { fieldDefinition: {
...mockPerformance.fieldDefinition, ...mockPerformance.fieldDefinition,
}, },
hotkeyScope: 'hotkey-scope',
isReadOnly: false, isReadOnly: false,
}} }}
> >

View File

@ -1,5 +0,0 @@
import { createContext } from 'react';
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
export const CellHotkeyScopeContext = createContext<HotkeyScope | null>(null);

View File

@ -3,13 +3,9 @@ import { ReactNode, useContext } from 'react';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { useFieldFocus } from '@/object-record/record-field/hooks/useFieldFocus'; import { useFieldFocus } from '@/object-record/record-field/hooks/useFieldFocus';
import { CellHotkeyScopeContext } from '@/object-record/record-table/contexts/CellHotkeyScopeContext';
import { useRecordTableBodyContextOrThrow } from '@/object-record/record-table/contexts/RecordTableBodyContext'; import { useRecordTableBodyContextOrThrow } from '@/object-record/record-table/contexts/RecordTableBodyContext';
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext'; import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
import { import { useOpenRecordTableCellFromCell } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellFromCell';
DEFAULT_CELL_SCOPE,
useOpenRecordTableCellFromCell,
} from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellFromCell';
import { BORDER_COMMON, ThemeContext } from 'twenty-ui/theme'; import { BORDER_COMMON, ThemeContext } from 'twenty-ui/theme';
const StyledBaseContainer = styled.div<{ const StyledBaseContainer = styled.div<{
@ -81,26 +77,20 @@ export const RecordTableCellBaseContainer = ({
} }
}; };
const { hotkeyScope } = useContext(FieldContext);
const editHotkeyScope = { scope: hotkeyScope ?? DEFAULT_CELL_SCOPE };
return ( return (
<CellHotkeyScopeContext.Provider value={editHotkeyScope}> <StyledBaseContainer
<StyledBaseContainer onMouseLeave={handleContainerMouseLeave}
onMouseLeave={handleContainerMouseLeave} onMouseMove={handleContainerMouseMove}
onMouseMove={handleContainerMouseMove} onClick={handleContainerClick}
onClick={handleContainerClick} backgroundColorTransparentSecondary={
backgroundColorTransparentSecondary={ theme.background.transparent.secondary
theme.background.transparent.secondary }
} fontColorExtraLight={theme.font.color.extraLight}
fontColorExtraLight={theme.font.color.extraLight} fontColorMedium={theme.border.color.medium}
fontColorMedium={theme.border.color.medium} hasSoftFocus={hasSoftFocus}
hasSoftFocus={hasSoftFocus} isReadOnly={isReadOnly ?? false}
isReadOnly={isReadOnly ?? false} >
> {children}
{children} </StyledBaseContainer>
</StyledBaseContainer>
</CellHotkeyScopeContext.Provider>
); );
}; };

View File

@ -1,76 +1,40 @@
import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifierField'; import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifierField';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; 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 { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation';
import { isFieldSelect } from '@/object-record/record-field/types/guards/isFieldSelect';
import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext';
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 { RecordUpdateContext } from '@/object-record/record-table/contexts/EntityUpdateMutationHookContext'; import { RecordUpdateContext } from '@/object-record/record-table/contexts/EntityUpdateMutationHookContext';
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext'; import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext'; import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext';
import { useRecordTableRowContextOrThrow } from '@/object-record/record-table/contexts/RecordTableRowContext'; import { useRecordTableRowContextOrThrow } from '@/object-record/record-table/contexts/RecordTableRowContext';
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
import { TableHotkeyScope } from '@/object-record/record-table/types/TableHotkeyScope';
import { SelectFieldHotkeyScope } from '@/object-record/select/types/SelectFieldHotkeyScope';
import { ReactNode, useContext } from 'react'; import { ReactNode, useContext } from 'react';
import { RelationDefinitionType } from '~/generated-metadata/graphql';
export const RecordTableCellFieldContext = ({ type RecordTableCellFieldContextGenericProps = {
children,
}: {
children: ReactNode; children: ReactNode;
}) => { };
export const RecordTableCellFieldContextGeneric = ({
children,
}: RecordTableCellFieldContextGenericProps) => {
const { recordId, isReadOnly: isTableRowReadOnly } =
useRecordTableRowContextOrThrow();
const { objectMetadataItem } = useRecordTableContextOrThrow(); const { objectMetadataItem } = useRecordTableContextOrThrow();
const { indexIdentifierUrl } = useRecordIndexContextOrThrow(); const { indexIdentifierUrl } = useRecordIndexContextOrThrow();
const { columnDefinition } = useContext(RecordTableCellContext); const { columnDefinition } = useContext(RecordTableCellContext);
const { recordId, isReadOnly: isTableRowReadOnly } =
useRecordTableRowContextOrThrow();
const updateRecord = useContext(RecordUpdateContext);
const computedHotkeyScope = (
columnDefinition: ColumnDefinition<FieldMetadata>,
) => {
if (isFieldRelation(columnDefinition)) {
if (
columnDefinition.metadata.relationType ===
RelationDefinitionType.MANY_TO_ONE
) {
return SingleRecordPickerHotkeyScope.SingleRecordPicker;
}
if (
columnDefinition.metadata.relationType ===
RelationDefinitionType.ONE_TO_MANY
) {
return MultipleRecordPickerHotkeyScope.MultipleRecordPicker;
}
return SingleRecordPickerHotkeyScope.SingleRecordPicker;
}
if (isFieldSelect(columnDefinition)) {
return SelectFieldHotkeyScope.SelectField;
}
return TableHotkeyScope.CellEditMode;
};
const customHotkeyScope = computedHotkeyScope(columnDefinition);
const isFieldReadOnly = useIsFieldValueReadOnly({ const isFieldReadOnly = useIsFieldValueReadOnly({
fieldDefinition: columnDefinition, fieldDefinition: columnDefinition,
isRecordReadOnly: isTableRowReadOnly ?? false, isRecordReadOnly: isTableRowReadOnly ?? false,
}); });
const updateRecord = useContext(RecordUpdateContext);
return ( return (
<FieldContext.Provider <FieldContext.Provider
value={{ value={{
recordId, recordId,
fieldDefinition: columnDefinition, fieldDefinition: columnDefinition,
useUpdateRecord: () => [updateRecord, {}], useUpdateRecord: () => [updateRecord, {}],
hotkeyScope: customHotkeyScope,
labelIdentifierLink: indexIdentifierUrl(recordId), labelIdentifierLink: indexIdentifierUrl(recordId),
isLabelIdentifier: isLabelIdentifierField({ isLabelIdentifier: isLabelIdentifierField({
fieldMetadataItem: { fieldMetadataItem: {

View File

@ -0,0 +1,56 @@
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { useIsFieldValueReadOnly } from '@/object-record/record-field/hooks/useIsFieldValueReadOnly';
import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext';
import { RecordUpdateContext } from '@/object-record/record-table/contexts/EntityUpdateMutationHookContext';
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
import { useRecordTableRowContextOrThrow } from '@/object-record/record-table/contexts/RecordTableRowContext';
import { isRecordTableScrolledLeftComponentState } from '@/object-record/record-table/states/isRecordTableScrolledLeftComponentState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { ReactNode, useContext } from 'react';
import { useIsMobile } from 'twenty-ui/utilities';
type RecordTableCellFieldContextLabelIdentifierProps = {
children: ReactNode;
};
export const RecordTableCellFieldContextLabelIdentifier = ({
children,
}: RecordTableCellFieldContextLabelIdentifierProps) => {
const { indexIdentifierUrl } = useRecordIndexContextOrThrow();
const { recordId, isReadOnly: isTableRowReadOnly } =
useRecordTableRowContextOrThrow();
const { columnDefinition } = useContext(RecordTableCellContext);
const isMobile = useIsMobile();
const isRecordTableScrolledLeftComponent = useRecoilComponentValueV2(
isRecordTableScrolledLeftComponentState,
);
const isFieldReadOnly = useIsFieldValueReadOnly({
fieldDefinition: columnDefinition,
isRecordReadOnly: isTableRowReadOnly ?? false,
});
const updateRecord = useContext(RecordUpdateContext);
const isLabelIdentifierCompact =
isMobile && !isRecordTableScrolledLeftComponent;
return (
<FieldContext.Provider
value={{
recordId,
fieldDefinition: columnDefinition,
useUpdateRecord: () => [updateRecord, {}],
labelIdentifierLink: indexIdentifierUrl(recordId),
isLabelIdentifier: true,
isLabelIdentifierCompact,
displayedMaxRows: 1,
isReadOnly: isFieldReadOnly,
}}
>
{children}
</FieldContext.Provider>
);
};

View File

@ -1,19 +1,24 @@
import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifierField';
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext'; import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext'; import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext';
import { useRecordTableRowContextOrThrow } from '@/object-record/record-table/contexts/RecordTableRowContext'; import { useRecordTableRowContextOrThrow } from '@/object-record/record-table/contexts/RecordTableRowContext';
import { RecordTableCellFieldContext } from '@/object-record/record-table/record-table-cell/components/RecordTableCellFieldContext'; import { RecordTableCellFieldContextGeneric } from '@/object-record/record-table/record-table-cell/components/RecordTableCellFieldContextGeneric';
import { RecordTableCellFieldContextLabelIdentifier } from '@/object-record/record-table/record-table-cell/components/RecordTableCellFieldContextLabelIdentifier';
import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId'; import { getRecordFieldInputId } from '@/object-record/utils/getRecordFieldInputId';
import { ReactNode, useContext } from 'react'; import { ReactNode, useContext } from 'react';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
type RecordTableCellFieldContextWrapperProps = {
children: ReactNode;
};
export const RecordTableCellFieldContextWrapper = ({ export const RecordTableCellFieldContextWrapper = ({
children, children,
}: { }: RecordTableCellFieldContextWrapperProps) => {
children: ReactNode;
}) => {
const { columnDefinition } = useContext(RecordTableCellContext); const { columnDefinition } = useContext(RecordTableCellContext);
const { recordId } = useRecordTableRowContextOrThrow(); const { recordId } = useRecordTableRowContextOrThrow();
const { objectMetadataItem } = useRecordTableContextOrThrow();
if (isUndefinedOrNull(columnDefinition)) { if (isUndefinedOrNull(columnDefinition)) {
return null; return null;
@ -25,9 +30,25 @@ export const RecordTableCellFieldContextWrapper = ({
'record-table-cell', 'record-table-cell',
); );
const isLabelIdentifier = isLabelIdentifierField({
fieldMetadataItem: {
id: columnDefinition.fieldMetadataId,
name: columnDefinition.metadata.fieldName,
},
objectMetadataItem,
});
return ( return (
<RecordFieldComponentInstanceContext.Provider value={{ instanceId }}> <RecordFieldComponentInstanceContext.Provider value={{ instanceId }}>
<RecordTableCellFieldContext>{children}</RecordTableCellFieldContext> {isLabelIdentifier ? (
<RecordTableCellFieldContextLabelIdentifier>
{children}
</RecordTableCellFieldContextLabelIdentifier>
) : (
<RecordTableCellFieldContextGeneric>
{children}
</RecordTableCellFieldContextGeneric>
)}
</RecordFieldComponentInstanceContext.Provider> </RecordFieldComponentInstanceContext.Provider>
); );
}; };

View File

@ -18,7 +18,6 @@ import {
import { useCloseRecordTableCellInGroup } from '@/object-record/record-table/record-table-cell/hooks/internal/useCloseRecordTableCellInGroup'; import { useCloseRecordTableCellInGroup } from '@/object-record/record-table/record-table-cell/hooks/internal/useCloseRecordTableCellInGroup';
import { currentTableCellInEditModePositionComponentState } from '@/object-record/record-table/states/currentTableCellInEditModePositionComponentState'; import { currentTableCellInEditModePositionComponentState } from '@/object-record/record-table/states/currentTableCellInEditModePositionComponentState';
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState'; import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
import { TableHotkeyScope } from '@/object-record/record-table/types/TableHotkeyScope';
import { useDragSelect } from '@/ui/utilities/drag-select/hooks/useDragSelect'; import { useDragSelect } from '@/ui/utilities/drag-select/hooks/useDragSelect';
import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2'; import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
@ -52,7 +51,6 @@ const Wrapper = ({ children }: { children: React.ReactNode }) => (
value={{ value={{
fieldDefinition: textfieldDefinition, fieldDefinition: textfieldDefinition,
recordId: 'recordId', recordId: 'recordId',
hotkeyScope: TableHotkeyScope.Table,
isLabelIdentifier: false, isLabelIdentifier: false,
isReadOnly: false, isReadOnly: false,
}} }}

View File

@ -18,7 +18,6 @@ import {
import { useCloseRecordTableCellNoGroup } from '@/object-record/record-table/record-table-cell/hooks/internal/useCloseRecordTableCellNoGroup'; import { useCloseRecordTableCellNoGroup } from '@/object-record/record-table/record-table-cell/hooks/internal/useCloseRecordTableCellNoGroup';
import { currentTableCellInEditModePositionComponentState } from '@/object-record/record-table/states/currentTableCellInEditModePositionComponentState'; import { currentTableCellInEditModePositionComponentState } from '@/object-record/record-table/states/currentTableCellInEditModePositionComponentState';
import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState'; import { isTableCellInEditModeComponentFamilyState } from '@/object-record/record-table/states/isTableCellInEditModeComponentFamilyState';
import { TableHotkeyScope } from '@/object-record/record-table/types/TableHotkeyScope';
import { useDragSelect } from '@/ui/utilities/drag-select/hooks/useDragSelect'; import { useDragSelect } from '@/ui/utilities/drag-select/hooks/useDragSelect';
import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2'; import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
@ -52,7 +51,6 @@ const Wrapper = ({ children }: { children: React.ReactNode }) => (
value={{ value={{
fieldDefinition: textfieldDefinition, fieldDefinition: textfieldDefinition,
recordId: 'recordId', recordId: 'recordId',
hotkeyScope: TableHotkeyScope.Table,
isLabelIdentifier: false, isLabelIdentifier: false,
isReadOnly: false, isReadOnly: false,
}} }}

View File

@ -3,7 +3,6 @@ import { useContext } from 'react';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition';
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
import { CellHotkeyScopeContext } from '@/object-record/record-table/contexts/CellHotkeyScopeContext';
import { useRecordTableRowContextOrThrow } from '@/object-record/record-table/contexts/RecordTableRowContext'; import { useRecordTableRowContextOrThrow } from '@/object-record/record-table/contexts/RecordTableRowContext';
import { useCurrentTableCellPosition } from '@/object-record/record-table/record-table-cell/hooks/useCurrentCellPosition'; import { useCurrentTableCellPosition } from '@/object-record/record-table/record-table-cell/hooks/useCurrentCellPosition';
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition'; import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
@ -27,7 +26,6 @@ export type OpenTableCellArgs = {
}; };
export const useOpenRecordTableCellFromCell = () => { export const useOpenRecordTableCellFromCell = () => {
const customCellHotkeyScope = useContext(CellHotkeyScopeContext);
const { recordId, fieldDefinition, isReadOnly } = useContext(FieldContext); const { recordId, fieldDefinition, isReadOnly } = useContext(FieldContext);
const { pathToShowPage, objectNameSingular } = const { pathToShowPage, objectNameSingular } =
@ -44,7 +42,6 @@ export const useOpenRecordTableCellFromCell = () => {
) => { ) => {
onOpenTableCell({ onOpenTableCell({
cellPosition, cellPosition,
customCellHotkeyScope,
recordId, recordId,
fieldDefinition, fieldDefinition,
isReadOnly, isReadOnly,

View File

@ -11,7 +11,6 @@ import { useLeaveTableFocus } from '@/object-record/record-table/hooks/internal/
import { useMoveEditModeToTableCellPosition } from '@/object-record/record-table/hooks/internal/useMoveEditModeToCellPosition'; import { useMoveEditModeToTableCellPosition } from '@/object-record/record-table/hooks/internal/useMoveEditModeToCellPosition';
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition'; import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
import { useDragSelect } from '@/ui/utilities/drag-select/hooks/useDragSelect'; import { useDragSelect } from '@/ui/utilities/drag-select/hooks/useDragSelect';
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope'; import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
import { useClickOutsideListener } from '@/ui/utilities/pointer-event/hooks/useClickOutsideListener'; import { useClickOutsideListener } from '@/ui/utilities/pointer-event/hooks/useClickOutsideListener';
import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue'; import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue';
@ -28,7 +27,6 @@ import { useSetActiveDropdownFocusIdAndMemorizePrevious } from '@/ui/layout/drop
import { useClickOustideListenerStates } from '@/ui/utilities/pointer-event/hooks/useClickOustideListenerStates'; import { useClickOustideListenerStates } from '@/ui/utilities/pointer-event/hooks/useClickOustideListenerStates';
import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType'; import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import { isDefined } from 'twenty-shared/utils';
import { TableHotkeyScope } from '../../types/TableHotkeyScope'; import { TableHotkeyScope } from '../../types/TableHotkeyScope';
export const DEFAULT_CELL_SCOPE: HotkeyScope = { export const DEFAULT_CELL_SCOPE: HotkeyScope = {
@ -41,7 +39,6 @@ export type OpenTableCellArgs = {
isReadOnly: boolean; isReadOnly: boolean;
pathToShowPage: string; pathToShowPage: string;
objectNameSingular: string; objectNameSingular: string;
customCellHotkeyScope: HotkeyScope | null;
fieldDefinition: FieldDefinition<FieldMetadata>; fieldDefinition: FieldDefinition<FieldMetadata>;
recordId: string; recordId: string;
isActionButtonClick: boolean; isActionButtonClick: boolean;
@ -56,7 +53,6 @@ export const useOpenRecordTableCellV2 = (tableScopeId: string) => {
const moveEditModeToTableCellPosition = const moveEditModeToTableCellPosition =
useMoveEditModeToTableCellPosition(tableScopeId); useMoveEditModeToTableCellPosition(tableScopeId);
const setHotkeyScope = useSetHotkeyScope();
const { setDragSelectionStartEnabled } = useDragSelect(); const { setDragSelectionStartEnabled } = useDragSelect();
const leaveTableFocus = useLeaveTableFocus(tableScopeId); const leaveTableFocus = useLeaveTableFocus(tableScopeId);
@ -87,7 +83,6 @@ export const useOpenRecordTableCellV2 = (tableScopeId: string) => {
cellPosition, cellPosition,
isReadOnly, isReadOnly,
objectNameSingular, objectNameSingular,
customCellHotkeyScope,
fieldDefinition, fieldDefinition,
recordId, recordId,
isActionButtonClick, isActionButtonClick,
@ -168,18 +163,6 @@ export const useOpenRecordTableCellV2 = (tableScopeId: string) => {
toggleClickOutsideListener(false); toggleClickOutsideListener(false);
if (isDefined(customCellHotkeyScope)) {
setHotkeyScope(
customCellHotkeyScope.scope,
customCellHotkeyScope.customScopes,
);
} else {
setHotkeyScope(
DEFAULT_CELL_SCOPE.scope,
DEFAULT_CELL_SCOPE.customScopes,
);
}
setActiveDropdownFocusIdAndMemorizePrevious( setActiveDropdownFocusIdAndMemorizePrevious(
getDropdownFocusIdForRecordField( getDropdownFocusIdForRecordField(
recordId, recordId,
@ -202,7 +185,6 @@ export const useOpenRecordTableCellV2 = (tableScopeId: string) => {
openRecordInCommandMenu, openRecordInCommandMenu,
setViewableRecordId, setViewableRecordId,
setViewableRecordNameSingular, setViewableRecordNameSingular,
setHotkeyScope,
], ],
); );

View File

@ -27,7 +27,7 @@ export const RecordTitleCellFieldInput = ({
onTab, onTab,
onClickOutside, onClickOutside,
}: RecordTitleCellFieldInputProps) => { }: RecordTitleCellFieldInputProps) => {
const { fieldDefinition } = useContext(FieldContext); const { fieldDefinition, recordId } = useContext(FieldContext);
if (!isFieldText(fieldDefinition) && !isFieldFullName(fieldDefinition)) { if (!isFieldText(fieldDefinition) && !isFieldFullName(fieldDefinition)) {
throw new Error('Field definition is not a text or full name field'); throw new Error('Field definition is not a text or full name field');
@ -43,6 +43,7 @@ export const RecordTitleCellFieldInput = ({
onTab={onTab} onTab={onTab}
onShiftTab={onShiftTab} onShiftTab={onShiftTab}
sizeVariant={sizeVariant} sizeVariant={sizeVariant}
hotkeyScope={`record-title-cell-text-field-input-${recordId}`}
/> />
) : isFieldFullName(fieldDefinition) ? ( ) : isFieldFullName(fieldDefinition) ? (
<RecordTitleFullNameFieldInput <RecordTitleFullNameFieldInput
@ -52,6 +53,7 @@ export const RecordTitleCellFieldInput = ({
onTab={onTab} onTab={onTab}
onShiftTab={onShiftTab} onShiftTab={onShiftTab}
sizeVariant={sizeVariant} sizeVariant={sizeVariant}
hotkeyScope={`record-title-cell-full-name-field-input-${recordId}`}
/> />
) : null} ) : null}
</> </>

View File

@ -17,6 +17,7 @@ type RecordTitleCellTextFieldInputProps = {
onTab?: FieldInputEvent; onTab?: FieldInputEvent;
onShiftTab?: FieldInputEvent; onShiftTab?: FieldInputEvent;
sizeVariant?: 'xs' | 'md'; sizeVariant?: 'xs' | 'md';
hotkeyScope: string;
}; };
export const RecordTitleCellTextFieldInput = ({ export const RecordTitleCellTextFieldInput = ({
@ -26,9 +27,9 @@ export const RecordTitleCellTextFieldInput = ({
onClickOutside, onClickOutside,
onTab, onTab,
onShiftTab, onShiftTab,
hotkeyScope,
}: RecordTitleCellTextFieldInputProps) => { }: RecordTitleCellTextFieldInputProps) => {
const { fieldDefinition, draftValue, hotkeyScope, setDraftValue } = const { fieldDefinition, draftValue, setDraftValue } = useTextField();
useTextField();
const wrapperRef = useRef<HTMLInputElement>(null); const wrapperRef = useRef<HTMLInputElement>(null);

View File

@ -16,6 +16,7 @@ type RecordTitleFullNameFieldInputProps = {
onTab?: FieldInputEvent; onTab?: FieldInputEvent;
onShiftTab?: FieldInputEvent; onShiftTab?: FieldInputEvent;
sizeVariant?: 'xs' | 'md'; sizeVariant?: 'xs' | 'md';
hotkeyScope: string;
}; };
export const RecordTitleFullNameFieldInput = ({ export const RecordTitleFullNameFieldInput = ({
@ -25,8 +26,9 @@ export const RecordTitleFullNameFieldInput = ({
onTab, onTab,
onShiftTab, onShiftTab,
sizeVariant, sizeVariant,
hotkeyScope,
}: RecordTitleFullNameFieldInputProps) => { }: RecordTitleFullNameFieldInputProps) => {
const { hotkeyScope, draftValue, setDraftValue, persistFullNameField } = const { draftValue, setDraftValue, persistFullNameField } =
useFullNameField(); useFullNameField();
const convertToFullName = (newDoubleText: FieldDoubleText) => { const convertToFullName = (newDoubleText: FieldDoubleText) => {

View File

@ -13,8 +13,8 @@ import { SettingsDataModelSetFieldValueEffect } from '@/settings/data-model/fiel
import { SettingsDataModelSetPreviewRecordEffect } from '@/settings/data-model/fields/preview/components/SettingsDataModelSetRecordEffect'; import { SettingsDataModelSetPreviewRecordEffect } from '@/settings/data-model/fields/preview/components/SettingsDataModelSetRecordEffect';
import { useFieldPreviewValue } from '@/settings/data-model/fields/preview/hooks/useFieldPreviewValue'; import { useFieldPreviewValue } from '@/settings/data-model/fields/preview/hooks/useFieldPreviewValue';
import { usePreviewRecord } from '@/settings/data-model/fields/preview/hooks/usePreviewRecord'; import { usePreviewRecord } from '@/settings/data-model/fields/preview/hooks/usePreviewRecord';
import { FieldMetadataType } from '~/generated-metadata/graphql';
import { useIcons } from 'twenty-ui/display'; import { useIcons } from 'twenty-ui/display';
import { FieldMetadataType } from '~/generated-metadata/graphql';
export type SettingsDataModelFieldPreviewProps = { export type SettingsDataModelFieldPreviewProps = {
fieldMetadataItem: Pick< fieldMetadataItem: Pick<
@ -145,7 +145,6 @@ export const SettingsDataModelFieldPreview = ({
}, },
defaultValue: fieldMetadataItem.defaultValue, defaultValue: fieldMetadataItem.defaultValue,
}, },
hotkeyScope: 'field-preview',
isReadOnly: false, isReadOnly: false,
}} }}
> >

View File

@ -3,7 +3,6 @@ import { useRef, useState } from 'react';
import { useRegisterInputEvents } from '@/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents'; import { useRegisterInputEvents } from '@/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents';
import { import {
DateTimePicker, DateTimePicker,
MONTH_AND_YEAR_DROPDOWN_ID,
MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID, MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID,
MONTH_AND_YEAR_DROPDOWN_YEAR_SELECT_ID, MONTH_AND_YEAR_DROPDOWN_YEAR_SELECT_ID,
} from '@/ui/input/components/internal/date/components/InternalDatePicker'; } from '@/ui/input/components/internal/date/components/InternalDatePicker';
@ -59,7 +58,6 @@ export const DateInput = ({
onSubmit?.(newDate); onSubmit?.(newDate);
}; };
const { closeDropdown } = useDropdown(MONTH_AND_YEAR_DROPDOWN_ID);
const { closeDropdown: closeDropdownMonthSelect } = useDropdown( const { closeDropdown: closeDropdownMonthSelect } = useDropdown(
MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID, MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID,
); );
@ -70,7 +68,6 @@ export const DateInput = ({
const handleEnter = () => { const handleEnter = () => {
closeDropdownYearSelect(); closeDropdownYearSelect();
closeDropdownMonthSelect(); closeDropdownMonthSelect();
closeDropdown();
onEnter(internalValue); onEnter(internalValue);
}; };
@ -78,7 +75,6 @@ export const DateInput = ({
const handleEscape = () => { const handleEscape = () => {
closeDropdownYearSelect(); closeDropdownYearSelect();
closeDropdownMonthSelect(); closeDropdownMonthSelect();
closeDropdown();
onEscape(internalValue); onEscape(internalValue);
}; };
@ -88,8 +84,8 @@ export const DateInput = ({
closeDropdownYearSelect(); closeDropdownYearSelect();
closeDropdownMonthSelect(); closeDropdownMonthSelect();
closeDropdown();
onEscape(internalValue);
onClickOutside(event, internalValue); onClickOutside(event, internalValue);
}; };

View File

@ -23,7 +23,6 @@ import {
StyledHoverableMenuItemBase, StyledHoverableMenuItemBase,
} from 'twenty-ui/navigation'; } from 'twenty-ui/navigation';
export const MONTH_AND_YEAR_DROPDOWN_ID = 'date-picker-month-and-year-dropdown';
export const MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID = export const MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID =
'date-picker-month-and-year-dropdown-month-select'; 'date-picker-month-and-year-dropdown-month-select';
export const MONTH_AND_YEAR_DROPDOWN_YEAR_SELECT_ID = export const MONTH_AND_YEAR_DROPDOWN_YEAR_SELECT_ID =
@ -325,7 +324,6 @@ export const DateTimePicker = ({
const { timeZone } = useContext(UserContext); const { timeZone } = useContext(UserContext);
const { closeDropdown } = useDropdown(MONTH_AND_YEAR_DROPDOWN_ID);
const { closeDropdown: closeDropdownMonthSelect } = useDropdown( const { closeDropdown: closeDropdownMonthSelect } = useDropdown(
MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID, MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID,
); );
@ -341,7 +339,6 @@ export const DateTimePicker = ({
const closeDropdowns = () => { const closeDropdowns = () => {
closeDropdownYearSelect(); closeDropdownYearSelect();
closeDropdownMonthSelect(); closeDropdownMonthSelect();
closeDropdown();
}; };
const handleClose = (newDate: Date) => { const handleClose = (newDate: Date) => {

View File

@ -140,7 +140,6 @@ export const getFieldDecorator =
position: 0, position: 0,
objectMetadataItem, objectMetadataItem,
}), }),
hotkeyScope: 'hotkey-scope',
isReadOnly: false, isReadOnly: false,
}} }}
> >

View File

@ -6,7 +6,6 @@ import {
FieldContext, FieldContext,
RecordUpdateHook, RecordUpdateHook,
} from '@/object-record/record-field/contexts/FieldContext'; } from '@/object-record/record-field/contexts/FieldContext';
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
export const useMockFieldContext = ({ export const useMockFieldContext = ({
clearable, clearable,
@ -15,7 +14,6 @@ export const useMockFieldContext = ({
isLabelIdentifier = false, isLabelIdentifier = false,
objectNameSingular, objectNameSingular,
objectRecordId, objectRecordId,
customHotkeyScope,
}: { }: {
clearable?: boolean; clearable?: boolean;
fieldMetadataName: string; fieldMetadataName: string;
@ -23,7 +21,6 @@ export const useMockFieldContext = ({
isLabelIdentifier?: boolean; isLabelIdentifier?: boolean;
objectNameSingular: string; objectNameSingular: string;
objectRecordId: string; objectRecordId: string;
customHotkeyScope?: string;
}) => { }) => {
const { objectMetadataItem } = useObjectMetadataItem({ const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular, objectNameSingular,
@ -53,8 +50,6 @@ export const useMockFieldContext = ({
objectMetadataItem, objectMetadataItem,
}), }),
useUpdateRecord: useUpdateOneObjectMutation, useUpdateRecord: useUpdateOneObjectMutation,
hotkeyScope:
customHotkeyScope ?? InlineCellHotkeyScope.InlineCell,
clearable, clearable,
isReadOnly: false, isReadOnly: false,
}} }}