mirror of
https://github.com/lingble/twenty.git
synced 2025-11-03 14:17:58 +00:00
multiselect for onetomany relations (#6892)
Issue #4345 used `useUpdateRelationFromManyFieldInput` hook from `FieldInput` to `updateRelation`. Creating a seperate hook didnt made sense when it basically does the same thing. However renaming the hook to something generic would make sense so that its not tied to `FieldInput` according to naming convention followup issue to tackle - #6890 https://github.com/user-attachments/assets/452372ea-2699-45fd-9edf-ded36abdbca2 --------- Co-authored-by: Weiko <corentin@twenty.com>
This commit is contained in:
@@ -4,10 +4,13 @@ import { useCallback, useContext } from 'react';
|
|||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
import { IconForbid, IconPencil, IconPlus } from 'twenty-ui';
|
import { IconForbid, IconPencil, IconPlus } from 'twenty-ui';
|
||||||
|
|
||||||
|
import { ObjectMetadataItemsRelationPickerEffect } from '@/object-metadata/components/ObjectMetadataItemsRelationPickerEffect';
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
||||||
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
|
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
|
||||||
|
import { RelationFromManyFieldInputMultiRecordsEffect } from '@/object-record/record-field/meta-types/input/components/RelationFromManyFieldInputMultiRecordsEffect';
|
||||||
|
import { useUpdateRelationFromManyFieldInput } from '@/object-record/record-field/meta-types/input/hooks/useUpdateRelationFromManyFieldInput';
|
||||||
import { FieldRelationMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldRelationMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { RecordDetailRelationRecordsList } from '@/object-record/record-show/record-detail-section/components/RecordDetailRelationRecordsList';
|
import { RecordDetailRelationRecordsList } from '@/object-record/record-show/record-detail-section/components/RecordDetailRelationRecordsList';
|
||||||
import { RecordDetailRelationRecordsListEmptyState } from '@/object-record/record-show/record-detail-section/components/RecordDetailRelationRecordsListEmptyState';
|
import { RecordDetailRelationRecordsListEmptyState } from '@/object-record/record-show/record-detail-section/components/RecordDetailRelationRecordsListEmptyState';
|
||||||
@@ -16,6 +19,7 @@ import { RecordDetailSection } from '@/object-record/record-show/record-detail-s
|
|||||||
import { RecordDetailSectionHeader } from '@/object-record/record-show/record-detail-section/components/RecordDetailSectionHeader';
|
import { RecordDetailSectionHeader } from '@/object-record/record-show/record-detail-section/components/RecordDetailSectionHeader';
|
||||||
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
import { MultiRecordSelect } from '@/object-record/relation-picker/components/MultiRecordSelect';
|
||||||
import { SingleEntitySelectMenuItemsWithSearch } from '@/object-record/relation-picker/components/SingleEntitySelectMenuItemsWithSearch';
|
import { SingleEntitySelectMenuItemsWithSearch } from '@/object-record/relation-picker/components/SingleEntitySelectMenuItemsWithSearch';
|
||||||
import { useAddNewRecordAndOpenRightDrawer } from '@/object-record/relation-picker/hooks/useAddNewRecordAndOpenRightDrawer';
|
import { useAddNewRecordAndOpenRightDrawer } from '@/object-record/relation-picker/hooks/useAddNewRecordAndOpenRightDrawer';
|
||||||
import { useRelationPicker } from '@/object-record/relation-picker/hooks/useRelationPicker';
|
import { useRelationPicker } from '@/object-record/relation-picker/hooks/useRelationPicker';
|
||||||
@@ -110,6 +114,10 @@ export const RecordDetailRelationSection = ({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const { updateRelation } = useUpdateRelationFromManyFieldInput({
|
||||||
|
scopeId: dropdownId,
|
||||||
|
});
|
||||||
|
|
||||||
const filterQueryParams: FilterQueryParams = {
|
const filterQueryParams: FilterQueryParams = {
|
||||||
filter: {
|
filter: {
|
||||||
[relationFieldMetadataItem?.name || '']: {
|
[relationFieldMetadataItem?.name || '']: {
|
||||||
@@ -175,16 +183,28 @@ export const RecordDetailRelationSection = ({
|
|||||||
}
|
}
|
||||||
dropdownComponents={
|
dropdownComponents={
|
||||||
<RelationPickerScope relationPickerScopeId={dropdownId}>
|
<RelationPickerScope relationPickerScopeId={dropdownId}>
|
||||||
<SingleEntitySelectMenuItemsWithSearch
|
{isToOneObject ? (
|
||||||
EmptyIcon={IconForbid}
|
<SingleEntitySelectMenuItemsWithSearch
|
||||||
onEntitySelected={handleRelationPickerEntitySelected}
|
EmptyIcon={IconForbid}
|
||||||
selectedRelationRecordIds={relationRecordIds}
|
onEntitySelected={handleRelationPickerEntitySelected}
|
||||||
relationObjectNameSingular={
|
selectedRelationRecordIds={relationRecordIds}
|
||||||
relationObjectMetadataNameSingular
|
relationObjectNameSingular={
|
||||||
}
|
relationObjectMetadataNameSingular
|
||||||
relationPickerScopeId={dropdownId}
|
}
|
||||||
onCreate={createNewRecordAndOpenRightDrawer}
|
relationPickerScopeId={dropdownId}
|
||||||
/>
|
onCreate={createNewRecordAndOpenRightDrawer}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<ObjectMetadataItemsRelationPickerEffect />
|
||||||
|
<RelationFromManyFieldInputMultiRecordsEffect />
|
||||||
|
<MultiRecordSelect
|
||||||
|
onCreate={createNewRecordAndOpenRightDrawer}
|
||||||
|
onChange={updateRelation}
|
||||||
|
onSubmit={closeDropdown}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</RelationPickerScope>
|
</RelationPickerScope>
|
||||||
}
|
}
|
||||||
dropdownHotkeyScope={{
|
dropdownHotkeyScope={{
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
import { Avatar } from 'twenty-ui';
|
import { Avatar } from 'twenty-ui';
|
||||||
import { v4 } from 'uuid';
|
|
||||||
|
|
||||||
import { useObjectRecordMultiSelectScopedStates } from '@/activities/hooks/useObjectRecordMultiSelectScopedStates';
|
import { useObjectRecordMultiSelectScopedStates } from '@/activities/hooks/useObjectRecordMultiSelectScopedStates';
|
||||||
import { MULTI_OBJECT_RECORD_SELECT_SELECTABLE_LIST_ID } from '@/object-record/relation-picker/constants/MultiObjectRecordSelectSelectableListId';
|
import { MULTI_OBJECT_RECORD_SELECT_SELECTABLE_LIST_ID } from '@/object-record/relation-picker/constants/MultiObjectRecordSelectSelectableListId';
|
||||||
@@ -69,7 +68,7 @@ export const MultipleObjectRecordSelectItem = ({
|
|||||||
: false;
|
: false;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<StyledSelectableItem itemId={objectRecordId} key={objectRecordId + v4()}>
|
<StyledSelectableItem itemId={objectRecordId} key={objectRecordId}>
|
||||||
<MenuItemMultiSelectAvatar
|
<MenuItemMultiSelectAvatar
|
||||||
onSelectChange={(_isNewlySelectedValue) => handleSelectChange()}
|
onSelectChange={(_isNewlySelectedValue) => handleSelectChange()}
|
||||||
isKeySelected={isSelectedByKeyboard}
|
isKeySelected={isSelectedByKeyboard}
|
||||||
|
|||||||
Reference in New Issue
Block a user