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:
@ -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],
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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 };
|
||||
|
||||
@ -53,7 +53,6 @@ export const EventFieldDiffValue = ({
|
||||
},
|
||||
defaultValue: fieldMetadataItem.defaultValue,
|
||||
},
|
||||
hotkeyScope: 'field-event-diff',
|
||||
isReadOnly: false,
|
||||
}}
|
||||
>
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
>
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -21,7 +21,6 @@ const getWrapper =
|
||||
value={{
|
||||
fieldDefinition,
|
||||
recordId,
|
||||
hotkeyScope: 'hotkeyScope',
|
||||
isLabelIdentifier: false,
|
||||
isReadOnly: false,
|
||||
}}
|
||||
|
||||
@ -14,7 +14,6 @@ const Wrapper = ({ children }: { children: ReactNode }) => (
|
||||
value={{
|
||||
fieldDefinition: phonesFieldDefinition,
|
||||
recordId,
|
||||
hotkeyScope: 'hotkeyScope',
|
||||
isLabelIdentifier: false,
|
||||
isReadOnly: false,
|
||||
}}
|
||||
|
||||
@ -20,7 +20,6 @@ const getWrapper =
|
||||
value={{
|
||||
fieldDefinition,
|
||||
recordId,
|
||||
hotkeyScope: 'hotkeyScope',
|
||||
isLabelIdentifier: false,
|
||||
isReadOnly: false,
|
||||
}}
|
||||
|
||||
@ -102,7 +102,6 @@ const getWrapper =
|
||||
value={{
|
||||
fieldDefinition,
|
||||
recordId,
|
||||
hotkeyScope: 'hotkeyScope',
|
||||
isLabelIdentifier: false,
|
||||
useUpdateRecord: useUpdateOneRecordMutation,
|
||||
isReadOnly: false,
|
||||
|
||||
@ -339,7 +339,6 @@ const Wrapper = ({ children }: { children: ReactNode }) => {
|
||||
value={{
|
||||
fieldDefinition: booleanFieldDefinition,
|
||||
recordId,
|
||||
hotkeyScope: 'hotkeyScope',
|
||||
isLabelIdentifier: false,
|
||||
useUpdateRecord: useUpdateOneRecordMutation,
|
||||
isReadOnly: false,
|
||||
|
||||
@ -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,
|
||||
],
|
||||
);
|
||||
|
||||
|
||||
@ -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}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
>
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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 = () => {
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@ -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}
|
||||
|
||||
@ -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}
|
||||
|
||||
@ -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}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@ -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}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@ -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}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@ -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}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@ -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}
|
||||
/>
|
||||
);
|
||||
|
||||
@ -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}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@ -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}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@ -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}
|
||||
/>
|
||||
|
||||
@ -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 (
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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}
|
||||
/>
|
||||
|
||||
@ -64,7 +64,6 @@ const BooleanFieldInputWithContext = ({
|
||||
},
|
||||
},
|
||||
recordId: recordId ?? '123',
|
||||
hotkeyScope: 'hotkey-scope',
|
||||
isLabelIdentifier: false,
|
||||
isReadOnly: false,
|
||||
}}
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
|
||||
@ -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 };
|
||||
|
||||
@ -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 };
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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()),
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
>
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
>
|
||||
|
||||
@ -135,7 +135,6 @@ const meta: Meta = {
|
||||
fieldDefinition: {
|
||||
...mockPerformance.fieldDefinition,
|
||||
},
|
||||
hotkeyScope: 'hotkey-scope',
|
||||
isReadOnly: false,
|
||||
}}
|
||||
>
|
||||
|
||||
@ -1,5 +0,0 @@
|
||||
import { createContext } from 'react';
|
||||
|
||||
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
|
||||
|
||||
export const CellHotkeyScopeContext = createContext<HotkeyScope | null>(null);
|
||||
@ -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>
|
||||
);
|
||||
};
|
||||
|
||||
@ -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: {
|
||||
@ -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>
|
||||
);
|
||||
};
|
||||
@ -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>
|
||||
);
|
||||
};
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
],
|
||||
);
|
||||
|
||||
|
||||
@ -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}
|
||||
</>
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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) => {
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
>
|
||||
|
||||
@ -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);
|
||||
};
|
||||
|
||||
|
||||
@ -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) => {
|
||||
|
||||
@ -140,7 +140,6 @@ export const getFieldDecorator =
|
||||
position: 0,
|
||||
objectMetadataItem,
|
||||
}),
|
||||
hotkeyScope: 'hotkey-scope',
|
||||
isReadOnly: false,
|
||||
}}
|
||||
>
|
||||
|
||||
@ -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,
|
||||
}}
|
||||
|
||||
Reference in New Issue
Block a user