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 { PropertyBox } from '@/object-record/record-inline-cell/property-box/components/PropertyBox';
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 { IconCalendarEvent } from 'twenty-ui/display';
import { mapArrayToObject } from '~/utils/array/mapArrayToObject';
import { beautifyPastDateRelativeToNow } from '~/utils/date-utils';
type CalendarEventDetailsProps = {
calendarEvent: CalendarEvent;
@ -97,7 +97,6 @@ export const CalendarEventDetails = ({
<FieldContext.Provider
value={{
recordId: calendarEvent.id,
hotkeyScope: 'calendar-event-details',
isLabelIdentifier: false,
fieldDefinition: formatFieldMetadataItemAsFieldDefinition({
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 { useInlineCell } from '@/object-record/record-inline-cell/hooks/useInlineCell';
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';
type ActivityTargetsInlineCellProps = {
@ -65,8 +64,6 @@ export const ActivityTargetsInlineCell = ({
<RecordInlineCellContext.Provider
value={{
buttonIcon: IconPencil,
customEditHotkeyScope:
MultipleRecordPickerHotkeyScope.MultipleRecordPicker,
IconLabel: showLabel ? IconArrowUpRight : undefined,
showLabel: showLabel,
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 { multipleRecordPickerSearchFilterComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerSearchFilterComponentState';
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';
type OpenActivityTargetCellEditModeProps = {
@ -17,6 +19,8 @@ export const useOpenActivityTargetCellEditMode = () => {
const { performSearch: multipleRecordPickerPerformSearch } =
useMultipleRecordPickerPerformSearch();
const { setHotkeyScopeAndMemorizePreviousScope } = usePreviousHotkeyScope();
const openActivityTargetCellEditMode = useRecoilCallback(
({ set, snapshot }) =>
({
@ -79,8 +83,12 @@ export const useOpenActivityTargetCellEditMode = () => {
}),
),
});
setHotkeyScopeAndMemorizePreviousScope(
MultipleRecordPickerHotkeyScope.MultipleRecordPicker,
);
},
[multipleRecordPickerPerformSearch],
[multipleRecordPickerPerformSearch, setHotkeyScopeAndMemorizePreviousScope],
);
return { openActivityTargetCellEditMode };

View File

@ -53,7 +53,6 @@ export const EventFieldDiffValue = ({
},
defaultValue: fieldMetadataItem.defaultValue,
},
hotkeyScope: 'field-event-diff',
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 { isFieldValueReadOnly } from '@/object-record/record-field/utils/isFieldValueReadOnly';
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 { useContext } from 'react';
@ -67,7 +66,6 @@ export const RecordBoardCardBody = ({
}),
},
useUpdateRecord: useUpdateOneRecordHook,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isDisplayModeFixHeight: true,
}}
>

View File

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

View File

@ -23,8 +23,8 @@ export type GenericFieldContextType = {
fieldDefinition: FieldDefinition<FieldMetadata>;
useUpdateRecord?: RecordUpdateHook;
recordId: string;
hotkeyScope: string;
isLabelIdentifier: boolean;
isLabelIdentifierCompact?: boolean;
labelIdentifierLink?: string;
clearable?: boolean;
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 {
DateTimePicker,
MONTH_AND_YEAR_DROPDOWN_ID,
MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID,
MONTH_AND_YEAR_DROPDOWN_YEAR_SELECT_ID,
} from '@/ui/input/components/internal/date/components/InternalDatePicker';
@ -30,8 +29,8 @@ import {
useState,
} from 'react';
import { isDefined } from 'twenty-shared/utils';
import { Nullable } from 'twenty-ui/utilities';
import { TEXT_INPUT_STYLE } from 'twenty-ui/theme';
import { Nullable } from 'twenty-ui/utilities';
const StyledInputContainer = styled(FormFieldInputInputContainer)`
display: grid;
@ -140,7 +139,6 @@ export const FormDateTimeFieldInput = ({
}
};
const { closeDropdown } = useDropdown(MONTH_AND_YEAR_DROPDOWN_ID);
const { closeDropdown: closeDropdownMonthSelect } = useDropdown(
MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID,
);
@ -162,7 +160,6 @@ export const FormDateTimeFieldInput = ({
closeDropdownYearSelect();
closeDropdownMonthSelect();
closeDropdown();
handlePickerClickOutside();
},
enabled: displayDatePicker,

View File

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

View File

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

View File

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

View File

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

View File

@ -339,7 +339,6 @@ const Wrapper = ({ children }: { children: ReactNode }) => {
value={{
fieldDefinition: booleanFieldDefinition,
recordId,
hotkeyScope: 'hotkeyScope',
isLabelIdentifier: false,
useUpdateRecord: useUpdateOneRecordMutation,
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 { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
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 { isDefined } from 'twenty-shared/utils';
@ -28,6 +30,8 @@ export const useOpenFieldInputEditMode = () => {
const { openActivityTargetCellEditMode } =
useOpenActivityTargetCellEditMode();
const setHotkeyScope = useSetHotkeyScope();
const openFieldInput = useRecoilCallback(
({ snapshot }) =>
({
@ -37,13 +41,6 @@ export const useOpenFieldInputEditMode = () => {
fieldDefinition: FieldDefinition<FieldMetadata>;
recordId: string;
}) => {
if (isFieldRelationToOneObject(fieldDefinition)) {
openRelationToOneFieldInput({
fieldName: fieldDefinition.metadata.fieldName,
recordId: recordId,
});
}
if (
isFieldRelationFromManyObjects(fieldDefinition) &&
['taskTarget', 'noteTarget'].includes(
@ -80,6 +77,15 @@ export const useOpenFieldInputEditMode = () => {
return;
}
if (isFieldRelationToOneObject(fieldDefinition)) {
openRelationToOneFieldInput({
fieldName: fieldDefinition.metadata.fieldName,
recordId: recordId,
});
return;
}
if (isFieldRelationFromManyObjects(fieldDefinition)) {
if (
isDefined(
@ -92,13 +98,20 @@ export const useOpenFieldInputEditMode = () => {
fieldDefinition.metadata.relationObjectMetadataNameSingular,
recordId: recordId,
});
return;
}
}
setHotkeyScope(
DEFAULT_CELL_SCOPE.scope,
DEFAULT_CELL_SCOPE.customScopes,
);
},
[
openActivityTargetCellEditMode,
openRelationFromManyFieldInput,
openRelationToOneFieldInput,
setHotkeyScope,
],
);

View File

@ -8,7 +8,7 @@ export const ChipFieldDisplay = () => {
recordValue,
objectNameSingular,
labelIdentifierLink,
isLabelHidden,
isLabelIdentifierCompact,
} = useChipFieldDisplay();
if (!isDefined(recordValue)) {
@ -21,7 +21,7 @@ export const ChipFieldDisplay = () => {
record={recordValue}
size={ChipSize.Small}
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 { getProfilingStory } from '~/testing/profiling/utils/getProfilingStory';
import { ComponentDecorator } from 'twenty-ui/testing';
import {
fieldValue,
otherPersonMock,
relationFromManyFieldDisplayMock,
} from './relationFromManyFieldDisplayMock';
import { ComponentDecorator } from 'twenty-ui/testing';
const RelationFieldValueSetterEffect = () => {
const setEntity = useSetRecoilState(
@ -69,7 +69,6 @@ const meta: Meta = {
fieldDefinition: {
...relationFromManyFieldDisplayMock.fieldDefinition,
} as unknown as FieldDefinition<FieldMetadata>,
hotkeyScope: 'hotkey-scope',
isReadOnly: false,
}}
>

View File

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

View File

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

View File

@ -9,7 +9,7 @@ import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldBoolean } from '../../types/guards/isFieldBoolean';
export const useBooleanField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext);
const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(
FieldMetadataType.BOOLEAN,
@ -30,6 +30,5 @@ export const useBooleanField = () => {
fieldDefinition,
fieldValue,
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 { 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 { useIsMobile } from 'twenty-ui/utilities';
import { FieldContext } from '../../contexts/FieldContext';
export const useChipFieldDisplay = () => {
const { recordId, fieldDefinition, isLabelIdentifier, labelIdentifierLink } =
useContext(FieldContext);
const isMobile = useIsMobile();
const isRecordTableScrolledLeftComponent = useRecoilComponentValueV2(
isRecordTableScrolledLeftComponentState,
);
const isLabelHidden =
isMobile && isLabelIdentifier && !isRecordTableScrolledLeftComponent;
const {
recordId,
fieldDefinition,
isLabelIdentifier,
labelIdentifierLink,
isLabelIdentifierCompact,
} = useContext(FieldContext);
const { chipGeneratorPerObjectPerField } = useContext(
PreComputedChipGeneratorsContext,
@ -53,6 +47,6 @@ export const useChipFieldDisplay = () => {
recordValue,
isLabelIdentifier,
labelIdentifierLink,
isLabelHidden,
isLabelIdentifierCompact,
};
};

View File

@ -1,20 +1,19 @@
import { useContext } from 'react';
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 { 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 { FieldMetadataType } from '~/generated-metadata/graphql';
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 = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext);
const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(
FieldMetadataType.CURRENCY,
@ -68,7 +67,6 @@ export const useCurrencyField = () => {
draftValue,
setDraftValue,
setFieldValue,
hotkeyScope,
persistCurrencyField,
defaultValue,
};

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,19 +1,18 @@
import { useContext } from 'react';
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 { 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 { 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 = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext);
const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(
FieldMetadataType.FULL_NAME,
@ -51,7 +50,6 @@ export const useFullNameField = () => {
setFieldValue,
draftValue,
setDraftValue,
hotkeyScope,
persistFullNameField,
};
};

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -10,7 +10,7 @@ import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldRating } from '../../types/guards/isFieldRating';
export const useRatingField = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext);
const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.RATING, isFieldRating, fieldDefinition);
@ -29,6 +29,5 @@ export const useRatingField = () => {
fieldDefinition,
rating,
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 { 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 { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldRelation } from '../../types/guards/isFieldRelation';
export const useRelationField = <T extends ObjectRecord | ObjectRecord[]>() => {
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 { generateDefaultRecordChipData } from '@/object-metadata/utils/generateDefaultRecordChipData';
import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldRelation } from '../../types/guards/isFieldRelation';
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 { isDefined } from 'twenty-shared/utils';
export const useRelationToOneFieldDisplay = () => {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,19 +1,17 @@
import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
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 { 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 = () => {
const { recordId, fieldDefinition, hotkeyScope, maxWidth } =
useContext(FieldContext);
const { recordId, fieldDefinition, maxWidth } = useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.TEXT, isFieldText, fieldDefinition);
@ -39,6 +37,5 @@ export const useTextField = () => {
fieldDefinition,
fieldValue: fieldTextValue,
setFieldValue,
hotkeyScope,
};
};

View File

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

View File

@ -1,17 +1,16 @@
import { useContext } from 'react';
import { useRecoilState } from 'recoil';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
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 { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
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 = () => {
const { recordId, fieldDefinition, hotkeyScope } = useContext(FieldContext);
const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(FieldMetadataType.UUID, isFieldUuid, fieldDefinition);
@ -29,6 +28,5 @@ export const useUuidField = () => {
fieldDefinition,
fieldValue: fieldTextValue,
setFieldValue,
hotkeyScope,
};
};

View File

@ -6,6 +6,7 @@ import {
FieldInputClickOutsideEvent,
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';
export type AddressFieldInputProps = {
@ -23,7 +24,7 @@ export const AddressFieldInput = ({
onTab,
onShiftTab,
}: AddressFieldInputProps) => {
const { hotkeyScope, draftValue, setDraftValue } = useAddressField();
const { draftValue, setDraftValue } = useAddressField();
const persistField = usePersistField();
@ -75,7 +76,7 @@ export const AddressFieldInput = ({
onClickOutside={handleClickOutside}
onEnter={handleEnter}
onEscape={handleEscape}
hotkeyScope={hotkeyScope}
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
onChange={handleChange}
onTab={handleTab}
onShiftTab={handleShiftTab}

View File

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

View File

@ -10,6 +10,7 @@ import {
FieldInputClickOutsideEvent,
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';
type CurrencyFieldInputProps = {
@ -27,13 +28,8 @@ export const CurrencyFieldInput = ({
onTab,
onShiftTab,
}: CurrencyFieldInputProps) => {
const {
hotkeyScope,
draftValue,
persistCurrencyField,
setDraftValue,
defaultValue,
} = useCurrencyField();
const { draftValue, persistCurrencyField, setDraftValue, defaultValue } =
useCurrencyField();
const defaultCurrencyCodeWithoutSQLQuotes = (
defaultValue as FieldCurrencyValue
@ -129,7 +125,7 @@ export const CurrencyFieldInput = ({
onTab={handleTab}
onChange={handleChange}
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 { 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 { usePersistField } from '../../../hooks/usePersistField';
import { Nullable } from 'twenty-ui/utilities';
import { usePersistField } from '../../../hooks/usePersistField';
type FieldInputEvent = (persist: () => void) => void;
@ -23,7 +24,7 @@ export const DateFieldInput = ({
onClear,
onSubmit,
}: DateFieldInputProps) => {
const { fieldValue, setDraftValue, hotkeyScope } = useDateField();
const { fieldValue, setDraftValue } = useDateField();
const persistField = usePersistField();
@ -80,7 +81,7 @@ export const DateFieldInput = ({
onChange={handleChange}
onClear={handleClear}
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 { 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 { useDateTimeField } from '../../hooks/useDateTimeField';
import { Nullable } from 'twenty-ui/utilities';
export type DateTimeFieldInputProps = {
onClickOutside?: FieldInputClickOutsideEvent;
@ -22,7 +23,7 @@ export const DateTimeFieldInput = ({
onClear,
onSubmit,
}: DateTimeFieldInputProps) => {
const { fieldValue, setDraftValue, hotkeyScope } = useDateTimeField();
const { fieldValue, setDraftValue } = useDateTimeField();
const persistField = usePersistField();
@ -76,7 +77,7 @@ export const DateTimeFieldInput = ({
isDateTimeInput
onClear={handleClear}
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 { recordFieldInputIsFieldInErrorComponentState } from '@/object-record/record-field/states/recordFieldInputIsFieldInErrorComponentState';
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 { useCallback, useMemo } from 'react';
import { isDefined } from 'twenty-shared/utils';
@ -17,7 +18,7 @@ export const EmailsFieldInput = ({
onCancel,
onClickOutside,
}: EmailsFieldInputProps) => {
const { persistEmailsField, hotkeyScope, fieldValue } = useEmailsField();
const { persistEmailsField, fieldValue } = useEmailsField();
const emails = useMemo<string[]>(
() =>
@ -75,7 +76,7 @@ export const EmailsFieldInput = ({
}) => (
<EmailsFieldMenuItem
key={index}
dropdownId={`${hotkeyScope}-emails-${index}`}
dropdownId={`emails-${index}`}
isPrimary={isPrimaryEmail(index)}
email={email}
onEdit={handleEdit}
@ -84,7 +85,7 @@ export const EmailsFieldInput = ({
/>
)}
onError={handleError}
hotkeyScope={hotkeyScope}
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
/>
);
};

View File

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

View File

@ -1,6 +1,7 @@
import { useLinksField } from '@/object-record/record-field/meta-types/hooks/useLinksField';
import { LinksFieldMenuItem } from '@/object-record/record-field/meta-types/input/components/LinksFieldMenuItem';
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 { useMemo } from 'react';
import { absoluteUrlSchema, isDefined } from 'twenty-shared/utils';
@ -16,7 +17,7 @@ export const LinksFieldInput = ({
onCancel,
onClickOutside,
}: LinksFieldInputProps) => {
const { persistLinksField, hotkeyScope, fieldValue } = useLinksField();
const { persistLinksField, fieldValue, fieldDefinition } = useLinksField();
const links = useMemo<{ url: string; label: string }[]>(
() =>
@ -83,7 +84,7 @@ export const LinksFieldInput = ({
}) => (
<LinksFieldMenuItem
key={index}
dropdownId={`${hotkeyScope}-links-${index}`}
dropdownId={`links-field-input-${fieldDefinition.metadata.fieldName}-${index}`}
isPrimary={isPrimaryLink(index)}
label={link.label}
onEdit={handleEdit}
@ -92,7 +93,7 @@ export const LinksFieldInput = ({
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 { 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';
type MultiSelectFieldInputProps = {
@ -9,15 +10,14 @@ type MultiSelectFieldInputProps = {
export const MultiSelectFieldInput = ({
onCancel,
}: MultiSelectFieldInputProps) => {
const { persistField, fieldDefinition, fieldValues, hotkeyScope } =
useMultiSelectField();
const { persistField, fieldDefinition, fieldValues } = useMultiSelectField();
return (
<MultiSelectInput
selectableListComponentInstanceId={
SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID
}
hotkeyScope={hotkeyScope}
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
options={fieldDefinition.metadata.options}
onCancel={onCancel}
onOptionSelected={persistField}

View File

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

View File

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

View File

@ -4,6 +4,7 @@ import {
FieldInputClickOutsideEvent,
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';
type RawJsonFieldInputProps = {
@ -21,13 +22,8 @@ export const RawJsonFieldInput = ({
onTab,
onShiftTab,
}: RawJsonFieldInputProps) => {
const {
fieldDefinition,
draftValue,
hotkeyScope,
setDraftValue,
persistJsonField,
} = useJsonField();
const { fieldDefinition, draftValue, setDraftValue, persistJsonField } =
useJsonField();
const handleEnter = (newText: string) => {
onEnter?.(() => persistJsonField(newText));
@ -66,7 +62,7 @@ export const RawJsonFieldInput = ({
onEscape={handleEscape}
onShiftTab={handleShiftTab}
onTab={handleTab}
hotkeyScope={hotkeyScope}
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
onChange={handleChange}
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 { useRegisterInputEvents } from '@/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents';
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 { BlockEditorComponentInstanceContext } from '@/ui/input/editor/contexts/BlockEditorCompoponeInstanceContext';
import { PartialBlock } from '@blocknote/core';
@ -27,7 +28,7 @@ export const RichTextFieldInput = ({
}: RichTextFieldInputProps) => {
const containerRef = useRef<HTMLDivElement>(null);
const { recordId } = useContext(FieldContext);
const { draftValue, hotkeyScope, persistRichTextField, fieldDefinition } =
const { draftValue, persistRichTextField, fieldDefinition } =
useRichTextField();
const editor = useCreateBlockNote({
@ -44,7 +45,7 @@ export const RichTextFieldInput = ({
inputRef: containerRef,
inputValue: draftValue,
onClickOutside: handleClickOutside,
hotkeyScope,
hotkeyScope: DEFAULT_CELL_SCOPE.scope,
});
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 { 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 { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
import { SelectInput } from '@/ui/field/input/components/SelectInput';
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
@ -19,8 +20,7 @@ export const SelectFieldInput = ({
onSubmit,
onCancel,
}: SelectFieldInputProps) => {
const { persistField, fieldDefinition, fieldValue, hotkeyScope } =
useSelectField();
const { persistField, fieldDefinition, fieldValue } = useSelectField();
const [filteredOptions, setFilteredOptions] = useState<SelectOption[]>([]);
@ -50,7 +50,7 @@ export const SelectFieldInput = ({
onCancel?.();
resetSelectedItem();
},
hotkeyScope,
`select-field-input-${fieldDefinition.metadata.fieldName}`,
[onCancel, resetSelectedItem],
);
@ -65,7 +65,7 @@ export const SelectFieldInput = ({
SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID
}
selectableItemIdArray={optionIds}
hotkeyScope={hotkeyScope}
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
onEnter={(itemId) => {
const option = filteredOptions.find(
(option) => option.value === itemId,

View File

@ -7,6 +7,7 @@ import {
FieldInputClickOutsideEvent,
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 { turnIntoUndefinedIfWhitespacesOnly } from '~/utils/string/turnIntoUndefinedIfWhitespacesOnly';
@ -25,8 +26,7 @@ export const TextFieldInput = ({
onTab,
onShiftTab,
}: TextFieldInputProps) => {
const { fieldDefinition, draftValue, hotkeyScope, setDraftValue } =
useTextField();
const { fieldDefinition, draftValue, setDraftValue } = useTextField();
const persistField = usePersistField();
const handleEnter = (newText: string) => {
@ -67,7 +67,7 @@ export const TextFieldInput = ({
onEscape={handleEscape}
onShiftTab={handleShiftTab}
onTab={handleTab}
hotkeyScope={hotkeyScope}
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
onChange={handleChange}
/>
</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 { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
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 {
AddressInput,
@ -45,7 +46,7 @@ const AddressInputWithContext = ({
const setHotKeyScope = useSetHotkeyScope();
useEffect(() => {
setHotKeyScope('hotkey-scope');
setHotKeyScope(DEFAULT_CELL_SCOPE.scope);
}, [setHotKeyScope]);
return (
@ -73,7 +74,6 @@ const AddressInputWithContext = ({
},
},
recordId: recordId ?? '123',
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: false,
isReadOnly: false,
}}
@ -84,7 +84,7 @@ const AddressInputWithContext = ({
onEscape={onEscape}
onClickOutside={onClickOutside}
value={value}
hotkeyScope="hotkey-scope"
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
onTab={onTab}
onShiftTab={onShiftTab}
/>

View File

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

View File

@ -7,6 +7,7 @@ import { FieldMetadataType } from '~/generated/graphql';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
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 { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect';
import { useDateTimeField } from '../../../hooks/useDateTimeField';
@ -64,7 +65,7 @@ const DateFieldInputWithContext = ({
const setHotkeyScope = useSetHotkeyScope();
useEffect(() => {
setHotkeyScope('hotkey-scope');
setHotkeyScope(DEFAULT_CELL_SCOPE.scope);
}, [setHotkeyScope]);
return (
@ -91,7 +92,6 @@ const DateFieldInputWithContext = ({
},
},
recordId: '123',
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: 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 { 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 { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect';
import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
@ -41,7 +42,7 @@ const NumberFieldInputWithContext = ({
const setHotKeyScope = useSetHotkeyScope();
useEffect(() => {
setHotKeyScope('hotkey-scope');
setHotKeyScope(DEFAULT_CELL_SCOPE.scope);
}, [setHotKeyScope]);
return (
@ -68,7 +69,6 @@ const NumberFieldInputWithContext = ({
},
},
recordId: '123',
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: 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 { 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 { FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
@ -40,7 +41,7 @@ const RatingFieldInputWithContext = ({
const setHotKeyScope = useSetHotkeyScope();
useEffect(() => {
setHotKeyScope('hotkey-scope');
setHotKeyScope(DEFAULT_CELL_SCOPE.scope);
}, [setHotKeyScope]);
return (
@ -66,7 +67,6 @@ const RatingFieldInputWithContext = ({
},
},
recordId: recordId ?? '123',
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: 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 { useOpenFieldInputEditMode } from '@/object-record/record-field/hooks/useOpenFieldInputEditMode';
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 { FieldMetadataType } from 'twenty-shared/types';
import { RelationDefinitionType } from '~/generated-metadata/graphql';
@ -70,7 +71,7 @@ const RelationManyFieldInputWithContext = () => {
useEffect(() => {
setRecordStoreFieldValue([]);
setHotKeyScope('hotkey-scope');
setHotKeyScope(MultipleRecordPickerHotkeyScope.MultipleRecordPicker);
openFieldInput({
fieldDefinition,
recordId: 'recordId',
@ -93,7 +94,6 @@ const RelationManyFieldInputWithContext = () => {
value={{
fieldDefinition,
recordId: 'recordId',
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: 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 { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
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 { FieldMetadataType } from 'twenty-shared/types';
import { getCanvasElementForDropdownTesting } from 'twenty-ui/testing';
import {
RelationToOneFieldInput,
RelationToOneFieldInputProps,
} from '../RelationToOneFieldInput';
import { getCanvasElementForDropdownTesting } from 'twenty-ui/testing';
const RelationWorkspaceSetterEffect = () => {
const setCurrentWorkspace = useSetRecoilState(currentWorkspaceState);
@ -64,7 +65,7 @@ const RelationToOneFieldInputWithContext = ({
const setHotKeyScope = useSetHotkeyScope();
useEffect(() => {
setHotKeyScope('hotkey-scope');
setHotKeyScope(SingleRecordPickerHotkeyScope.SingleRecordPicker);
}, [setHotKeyScope]);
return (
@ -86,7 +87,6 @@ const RelationToOneFieldInputWithContext = ({
},
},
recordId: recordId,
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: 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 { 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 { FieldMetadataType } from '~/generated/graphql';
import { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect';
@ -39,7 +40,7 @@ const TextFieldInputWithContext = ({
const setHotKeyScope = useSetHotkeyScope();
useEffect(() => {
setHotKeyScope('hotkey-scope');
setHotKeyScope(DEFAULT_CELL_SCOPE.scope);
}, [setHotKeyScope]);
return (
@ -61,7 +62,6 @@ const TextFieldInputWithContext = ({
objectMetadataNameSingular: 'person',
},
},
hotkeyScope: 'hotkey-scope',
isLabelIdentifier: false,
isReadOnly: false,
}}

View File

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

View File

@ -3,11 +3,15 @@ import {
FieldRelationValue,
} from '@/object-record/record-field/types/FieldMetadata';
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 { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
import { useRecoilCallback } from 'recoil';
import { isDefined } from 'twenty-shared/utils';
export const useOpenRelationToOneFieldInput = () => {
const { setHotkeyScopeAndMemorizePreviousScope } = usePreviousHotkeyScope();
const openRelationToOneFieldInput = useRecoilCallback(
({ set, snapshot }) =>
({ fieldName, recordId }: { fieldName: string; recordId: string }) => {
@ -29,8 +33,12 @@ export const useOpenRelationToOneFieldInput = () => {
fieldValue.id,
);
}
setHotkeyScopeAndMemorizePreviousScope(
SingleRecordPickerHotkeyScope.SingleRecordPicker,
);
},
[],
[setHotkeyScopeAndMemorizePreviousScope],
);
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 { FieldDefinition } from '../FieldDefinition';
import { FieldMetadata } from '../FieldMetadata';
import { FieldMetadata, FieldRelationMetadata } from '../FieldMetadata';
export const isFieldRelationToOneObject = (
field: Pick<FieldDefinition<FieldMetadata>, 'type' | 'metadata'>,
): field is FieldDefinition<FieldMetadata> =>
): field is FieldDefinition<FieldRelationMetadata> =>
isFieldRelation(field) &&
field.metadata.relationType === RelationDefinitionType.MANY_TO_ONE;

View File

@ -13,24 +13,16 @@ import {
import { useIsFieldInputOnly } from '@/object-record/record-field/hooks/useIsFieldInputOnly';
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 { 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 { useRecoilCallback } from 'recoil';
import { RelationDefinitionType } from '~/generated-metadata/graphql';
import { useIcons } from 'twenty-ui/display';
import { RecordInlineCellContainer } from './RecordInlineCellContainer';
import {
RecordInlineCellContext,
RecordInlineCellContextProps,
} from './RecordInlineCellContext';
import { useIcons } from 'twenty-ui/display';
type RecordInlineCellProps = {
readonly?: boolean;
@ -102,35 +94,6 @@ export const RecordInlineCell = ({ loading }: RecordInlineCellProps) => {
const { getIcon } = useIcons();
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 = {
readonly: isReadOnly,
buttonIcon: buttonIcon,
@ -157,7 +120,6 @@ export const RecordInlineCell = ({ loading }: RecordInlineCellProps) => {
isDisplayModeFixHeight: isDisplayModeFixHeight,
editModeContentOnly: isFieldInputOnly,
loading: loading,
customEditHotkeyScope: computedHotkeyScope(fieldDefinition),
onOpenEditMode:
onOpenEditMode ?? (() => openFieldInput({ fieldDefinition, recordId })),
onCloseEditMode: onCloseEditMode ?? (() => closeFieldInput()),

View File

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

View File

@ -32,7 +32,6 @@ const StyledClickableContainer = styled.div<{
export const RecordInlineCellValue = () => {
const {
displayModeContent,
customEditHotkeyScope,
editModeContent,
editModeContentOnly,
readonly,
@ -44,7 +43,7 @@ export const RecordInlineCellValue = () => {
const handleDisplayModeClick = () => {
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 { useSetActiveDropdownFocusIdAndMemorizePrevious } from '@/ui/layout/dropdown/hooks/useSetFocusedDropdownIdAndMemorizePrevious';
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
import { isDefined } from 'twenty-shared/utils';
import { isInlineCellInEditModeScopedState } from '../states/isInlineCellInEditModeScopedState';
import { InlineCellHotkeyScope } from '../types/InlineCellHotkeyScope';
export const useInlineCell = (
recordFieldComponentInstanceIdFromProps?: string,
@ -37,10 +35,9 @@ export const useInlineCell = (
const { goBackToPreviousDropdownFocusId } =
useGoBackToPreviousDropdownFocusId();
const {
setHotkeyScopeAndMemorizePreviousScope,
goBackToPreviousHotkeyScope,
} = usePreviousHotkeyScope(INLINE_CELL_HOTKEY_SCOPE_MEMOIZE_KEY);
const { goBackToPreviousHotkeyScope } = usePreviousHotkeyScope(
INLINE_CELL_HOTKEY_SCOPE_MEMOIZE_KEY,
);
const initFieldInputDraftValue = useInitDraftValueV2();
@ -53,7 +50,7 @@ export const useInlineCell = (
goBackToPreviousDropdownFocusId();
};
const openInlineCell = (customEditHotkeyScopeForField?: string) => {
const openInlineCell = () => {
onOpenEditMode?.();
setIsInlineCellInEditMode(true);
initFieldInputDraftValue({
@ -62,12 +59,6 @@ export const useInlineCell = (
fieldComponentInstanceId: recordFieldComponentInstanceId,
});
if (isDefined(customEditHotkeyScopeForField)) {
setHotkeyScopeAndMemorizePreviousScope(customEditHotkeyScopeForField);
} else {
setHotkeyScopeAndMemorizePreviousScope(InlineCellHotkeyScope.InlineCell);
}
setActiveDropdownFocusIdAndMemorizePrevious(
getDropdownFocusIdForRecordField(
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 { PropertyBox } from '@/object-record/record-inline-cell/property-box/components/PropertyBox';
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 { useRecordShowContainerData } from '@/object-record/record-show/hooks/useRecordShowContainerData';
import { RecordDetailDuplicatesSection } from '@/object-record/record-show/record-detail-section/components/RecordDetailDuplicatesSection';
@ -112,7 +111,6 @@ export const FieldsCard = ({
labelWidth: 90,
}),
useUpdateRecord: useUpdateOneObjectRecordMutation,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isDisplayModeFixHeight: true,
isReadOnly: isRecordReadOnly,
}}
@ -150,7 +148,6 @@ export const FieldsCard = ({
labelWidth: 90,
}),
useUpdateRecord: useUpdateOneObjectRecordMutation,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isDisplayModeFixHeight: true,
isReadOnly: isRecordReadOnly,
}}
@ -187,7 +184,6 @@ export const FieldsCard = ({
objectMetadataItem,
}),
useUpdateRecord: useUpdateOneObjectRecordMutation,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isDisplayModeFixHeight: true,
isReadOnly: isRecordReadOnly,
}}

View File

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

View File

@ -2,7 +2,6 @@ import { useGetStandardObjectIcon } from '@/object-metadata/hooks/useGetStandard
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
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 { useRecordShowContainerData } from '@/object-record/record-show/hooks/useRecordShowContainerData';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
@ -90,7 +89,6 @@ export const SummaryCard = ({
defaultValue: labelIdentifierFieldMetadataItem?.defaultValue,
},
useUpdateRecord: useUpdateOneObjectRecordMutation,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isCentered: !isMobile,
isDisplayModeFixHeight: true,
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 { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell';
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 { RecordValueSetterEffect } from '@/object-record/record-store/components/RecordValueSetterEffect';
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 { ConfirmationModal } from '@/ui/layout/modal/components/ConfirmationModal';
import { createPortal } from 'react-dom';
import { RelationDefinitionType } from '~/generated-metadata/graphql';
import { AnimatedEaseInOut } from 'twenty-ui/utilities';
import {
IconChevronDown,
IconComponent,
@ -47,6 +44,8 @@ import {
} from 'twenty-ui/display';
import { LightIconButton } from 'twenty-ui/input';
import { MenuItem } from 'twenty-ui/navigation';
import { AnimatedEaseInOut } from 'twenty-ui/utilities';
import { RelationDefinitionType } from '~/generated-metadata/graphql';
const StyledListItem = styled(RecordDetailRecordsListItem)<{
isDropdownOpen?: boolean;
@ -286,7 +285,6 @@ export const RecordDetailRelationRecordsListItem = ({
labelWidth: 90,
}),
useUpdateRecord: useUpdateOneObjectRecordMutation,
hotkeyScope: InlineCellHotkeyScope.InlineCell,
isReadOnly: false,
}}
>

View File

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

View File

@ -135,7 +135,6 @@ const meta: Meta = {
fieldDefinition: {
...mockPerformance.fieldDefinition,
},
hotkeyScope: 'hotkey-scope',
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 { 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 { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
import {
DEFAULT_CELL_SCOPE,
useOpenRecordTableCellFromCell,
} from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellFromCell';
import { useOpenRecordTableCellFromCell } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellFromCell';
import { BORDER_COMMON, ThemeContext } from 'twenty-ui/theme';
const StyledBaseContainer = styled.div<{
@ -81,26 +77,20 @@ export const RecordTableCellBaseContainer = ({
}
};
const { hotkeyScope } = useContext(FieldContext);
const editHotkeyScope = { scope: hotkeyScope ?? DEFAULT_CELL_SCOPE };
return (
<CellHotkeyScopeContext.Provider value={editHotkeyScope}>
<StyledBaseContainer
onMouseLeave={handleContainerMouseLeave}
onMouseMove={handleContainerMouseMove}
onClick={handleContainerClick}
backgroundColorTransparentSecondary={
theme.background.transparent.secondary
}
fontColorExtraLight={theme.font.color.extraLight}
fontColorMedium={theme.border.color.medium}
hasSoftFocus={hasSoftFocus}
isReadOnly={isReadOnly ?? false}
>
{children}
</StyledBaseContainer>
</CellHotkeyScopeContext.Provider>
<StyledBaseContainer
onMouseLeave={handleContainerMouseLeave}
onMouseMove={handleContainerMouseMove}
onClick={handleContainerClick}
backgroundColorTransparentSecondary={
theme.background.transparent.secondary
}
fontColorExtraLight={theme.font.color.extraLight}
fontColorMedium={theme.border.color.medium}
hasSoftFocus={hasSoftFocus}
isReadOnly={isReadOnly ?? false}
>
{children}
</StyledBaseContainer>
);
};

View File

@ -1,76 +1,40 @@
import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifierField';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
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 { 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 { 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 { 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 { RelationDefinitionType } from '~/generated-metadata/graphql';
export const RecordTableCellFieldContext = ({
children,
}: {
type RecordTableCellFieldContextGenericProps = {
children: ReactNode;
}) => {
};
export const RecordTableCellFieldContextGeneric = ({
children,
}: RecordTableCellFieldContextGenericProps) => {
const { recordId, isReadOnly: isTableRowReadOnly } =
useRecordTableRowContextOrThrow();
const { objectMetadataItem } = useRecordTableContextOrThrow();
const { indexIdentifierUrl } = useRecordIndexContextOrThrow();
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({
fieldDefinition: columnDefinition,
isRecordReadOnly: isTableRowReadOnly ?? false,
});
const updateRecord = useContext(RecordUpdateContext);
return (
<FieldContext.Provider
value={{
recordId,
fieldDefinition: columnDefinition,
useUpdateRecord: () => [updateRecord, {}],
hotkeyScope: customHotkeyScope,
labelIdentifierLink: indexIdentifierUrl(recordId),
isLabelIdentifier: isLabelIdentifierField({
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 { 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 { 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 { ReactNode, useContext } from 'react';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
type RecordTableCellFieldContextWrapperProps = {
children: ReactNode;
};
export const RecordTableCellFieldContextWrapper = ({
children,
}: {
children: ReactNode;
}) => {
}: RecordTableCellFieldContextWrapperProps) => {
const { columnDefinition } = useContext(RecordTableCellContext);
const { recordId } = useRecordTableRowContextOrThrow();
const { objectMetadataItem } = useRecordTableContextOrThrow();
if (isUndefinedOrNull(columnDefinition)) {
return null;
@ -25,9 +30,25 @@ export const RecordTableCellFieldContextWrapper = ({
'record-table-cell',
);
const isLabelIdentifier = isLabelIdentifierField({
fieldMetadataItem: {
id: columnDefinition.fieldMetadataId,
name: columnDefinition.metadata.fieldName,
},
objectMetadataItem,
});
return (
<RecordFieldComponentInstanceContext.Provider value={{ instanceId }}>
<RecordTableCellFieldContext>{children}</RecordTableCellFieldContext>
{isLabelIdentifier ? (
<RecordTableCellFieldContextLabelIdentifier>
{children}
</RecordTableCellFieldContextLabelIdentifier>
) : (
<RecordTableCellFieldContextGeneric>
{children}
</RecordTableCellFieldContextGeneric>
)}
</RecordFieldComponentInstanceContext.Provider>
);
};

View File

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

View File

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

View File

@ -3,7 +3,6 @@ import { useContext } from 'react';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition';
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 { useCurrentTableCellPosition } from '@/object-record/record-table/record-table-cell/hooks/useCurrentCellPosition';
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
@ -27,7 +26,6 @@ export type OpenTableCellArgs = {
};
export const useOpenRecordTableCellFromCell = () => {
const customCellHotkeyScope = useContext(CellHotkeyScopeContext);
const { recordId, fieldDefinition, isReadOnly } = useContext(FieldContext);
const { pathToShowPage, objectNameSingular } =
@ -44,7 +42,6 @@ export const useOpenRecordTableCellFromCell = () => {
) => {
onOpenTableCell({
cellPosition,
customCellHotkeyScope,
recordId,
fieldDefinition,
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 { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
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 { useClickOutsideListener } from '@/ui/utilities/pointer-event/hooks/useClickOutsideListener';
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 { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { useNavigate } from 'react-router-dom';
import { isDefined } from 'twenty-shared/utils';
import { TableHotkeyScope } from '../../types/TableHotkeyScope';
export const DEFAULT_CELL_SCOPE: HotkeyScope = {
@ -41,7 +39,6 @@ export type OpenTableCellArgs = {
isReadOnly: boolean;
pathToShowPage: string;
objectNameSingular: string;
customCellHotkeyScope: HotkeyScope | null;
fieldDefinition: FieldDefinition<FieldMetadata>;
recordId: string;
isActionButtonClick: boolean;
@ -56,7 +53,6 @@ export const useOpenRecordTableCellV2 = (tableScopeId: string) => {
const moveEditModeToTableCellPosition =
useMoveEditModeToTableCellPosition(tableScopeId);
const setHotkeyScope = useSetHotkeyScope();
const { setDragSelectionStartEnabled } = useDragSelect();
const leaveTableFocus = useLeaveTableFocus(tableScopeId);
@ -87,7 +83,6 @@ export const useOpenRecordTableCellV2 = (tableScopeId: string) => {
cellPosition,
isReadOnly,
objectNameSingular,
customCellHotkeyScope,
fieldDefinition,
recordId,
isActionButtonClick,
@ -168,18 +163,6 @@ export const useOpenRecordTableCellV2 = (tableScopeId: string) => {
toggleClickOutsideListener(false);
if (isDefined(customCellHotkeyScope)) {
setHotkeyScope(
customCellHotkeyScope.scope,
customCellHotkeyScope.customScopes,
);
} else {
setHotkeyScope(
DEFAULT_CELL_SCOPE.scope,
DEFAULT_CELL_SCOPE.customScopes,
);
}
setActiveDropdownFocusIdAndMemorizePrevious(
getDropdownFocusIdForRecordField(
recordId,
@ -202,7 +185,6 @@ export const useOpenRecordTableCellV2 = (tableScopeId: string) => {
openRecordInCommandMenu,
setViewableRecordId,
setViewableRecordNameSingular,
setHotkeyScope,
],
);

View File

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

View File

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

View File

@ -16,6 +16,7 @@ type RecordTitleFullNameFieldInputProps = {
onTab?: FieldInputEvent;
onShiftTab?: FieldInputEvent;
sizeVariant?: 'xs' | 'md';
hotkeyScope: string;
};
export const RecordTitleFullNameFieldInput = ({
@ -25,8 +26,9 @@ export const RecordTitleFullNameFieldInput = ({
onTab,
onShiftTab,
sizeVariant,
hotkeyScope,
}: RecordTitleFullNameFieldInputProps) => {
const { hotkeyScope, draftValue, setDraftValue, persistFullNameField } =
const { draftValue, setDraftValue, persistFullNameField } =
useFullNameField();
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 { useFieldPreviewValue } from '@/settings/data-model/fields/preview/hooks/useFieldPreviewValue';
import { usePreviewRecord } from '@/settings/data-model/fields/preview/hooks/usePreviewRecord';
import { FieldMetadataType } from '~/generated-metadata/graphql';
import { useIcons } from 'twenty-ui/display';
import { FieldMetadataType } from '~/generated-metadata/graphql';
export type SettingsDataModelFieldPreviewProps = {
fieldMetadataItem: Pick<
@ -145,7 +145,6 @@ export const SettingsDataModelFieldPreview = ({
},
defaultValue: fieldMetadataItem.defaultValue,
},
hotkeyScope: 'field-preview',
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 {
DateTimePicker,
MONTH_AND_YEAR_DROPDOWN_ID,
MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID,
MONTH_AND_YEAR_DROPDOWN_YEAR_SELECT_ID,
} from '@/ui/input/components/internal/date/components/InternalDatePicker';
@ -59,7 +58,6 @@ export const DateInput = ({
onSubmit?.(newDate);
};
const { closeDropdown } = useDropdown(MONTH_AND_YEAR_DROPDOWN_ID);
const { closeDropdown: closeDropdownMonthSelect } = useDropdown(
MONTH_AND_YEAR_DROPDOWN_MONTH_SELECT_ID,
);
@ -70,7 +68,6 @@ export const DateInput = ({
const handleEnter = () => {
closeDropdownYearSelect();
closeDropdownMonthSelect();
closeDropdown();
onEnter(internalValue);
};
@ -78,7 +75,6 @@ export const DateInput = ({
const handleEscape = () => {
closeDropdownYearSelect();
closeDropdownMonthSelect();
closeDropdown();
onEscape(internalValue);
};
@ -88,8 +84,8 @@ export const DateInput = ({
closeDropdownYearSelect();
closeDropdownMonthSelect();
closeDropdown();
onEscape(internalValue);
onClickOutside(event, internalValue);
};

View File

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

View File

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

View File

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