Fix missing ObjectRecordId param (#11721)

# Introduction
Fixes https://github.com/twentyhq/twenty/issues/11718

From having
[noUncheckedIndexedAccess](https://www.typescriptlang.org/tsconfig/#noUncheckedIndexedAccess)
set to false we have a flakiness resulting in a such bug right here as
the below operation can return `undefined` but not type as it should:
```ts
  const recordId = allRecordIds[position.row];
```

About to create a Tech project about the topic, activating the flag ends
in 1500 typescript erros from the style solution compilation ( which
means can contains several duplicated errors )
This commit is contained in:
Paul Rastoin
2025-04-24 16:49:56 +02:00
committed by GitHub
parent 5343dd62d6
commit 8b63d45b70
3 changed files with 10 additions and 10 deletions

View File

@ -11,6 +11,7 @@ import { hiddenRecordGroupIdsComponentSelector } from '@/object-record/record-gr
import { useHandleRecordGroupField } from '@/object-record/record-index/hooks/useHandleRecordGroupField'; import { useHandleRecordGroupField } from '@/object-record/record-index/hooks/useHandleRecordGroupField';
import { SettingsPath } from '@/types/SettingsPath'; import { SettingsPath } from '@/types/SettingsPath';
import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader'; import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader';
import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent';
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator'; import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
import { navigationMemorizedUrlState } from '@/ui/navigation/states/navigationMemorizedUrlState'; import { navigationMemorizedUrlState } from '@/ui/navigation/states/navigationMemorizedUrlState';
@ -19,9 +20,6 @@ import { ViewType } from '@/views/types/ViewType';
import { useLingui } from '@lingui/react/macro'; import { useLingui } from '@lingui/react/macro';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom';
import { useSetRecoilState } from 'recoil'; import { useSetRecoilState } from 'recoil';
import { FieldMetadataType } from '~/generated-metadata/graphql';
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
import { IconChevronLeft, IconSettings, useIcons } from 'twenty-ui/display'; import { IconChevronLeft, IconSettings, useIcons } from 'twenty-ui/display';
import { import {
@ -29,6 +27,8 @@ import {
MenuItemSelect, MenuItemSelect,
UndecoratedLink, UndecoratedLink,
} from 'twenty-ui/navigation'; } from 'twenty-ui/navigation';
import { FieldMetadataType } from '~/generated-metadata/graphql';
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
export const ObjectOptionsDropdownRecordGroupFieldsContent = () => { export const ObjectOptionsDropdownRecordGroupFieldsContent = () => {
const { t } = useLingui(); const { t } = useLingui();
@ -116,7 +116,7 @@ export const ObjectOptionsDropdownRecordGroupFieldsContent = () => {
/> />
} }
> >
Group by {t`Group by`}
</DropdownMenuHeader> </DropdownMenuHeader>
<StyledInput <StyledInput
autoFocus autoFocus

View File

@ -134,7 +134,7 @@ export const useHandleRecordGroupField = () => {
return; return;
} }
const view = await getViewFromPrefetchState(currentViewId); const view = getViewFromPrefetchState(currentViewId);
if (isUndefinedOrNull(view)) { if (isUndefinedOrNull(view)) {
return; return;

View File

@ -8,6 +8,7 @@ import { visibleTableColumnsComponentSelector } from '@/object-record/record-tab
import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition'; import { TableCellPosition } from '@/object-record/record-table/types/TableCellPosition';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import { isDefined } from 'twenty-shared/utils';
export const RecordTableCellPortalWrapper = ({ export const RecordTableCellPortalWrapper = ({
position, position,
@ -16,9 +17,9 @@ export const RecordTableCellPortalWrapper = ({
position: TableCellPosition; position: TableCellPosition;
children: React.ReactNode; children: React.ReactNode;
}) => { }) => {
const anchorElement = document.body.querySelector( const anchorElement = document.body.querySelector<HTMLAnchorElement>(
`#record-table-cell-${position.column}-${position.row}`, `#record-table-cell-${position.column}-${position.row}`,
) as HTMLElement; );
const allRecordIds = useRecoilComponentValueV2( const allRecordIds = useRecoilComponentValueV2(
recordIndexAllRecordIdsComponentSelector, recordIndexAllRecordIdsComponentSelector,
@ -30,12 +31,11 @@ export const RecordTableCellPortalWrapper = ({
visibleTableColumnsComponentSelector, visibleTableColumnsComponentSelector,
); );
if (!anchorElement) { const recordId = allRecordIds.at(position.row);
if (!isDefined(anchorElement) || !isDefined(recordId)) {
return null; return null;
} }
const recordId = allRecordIds[position.row];
return ReactDOM.createPortal( return ReactDOM.createPortal(
<RecordTableRowContextProvider <RecordTableRowContextProvider
value={{ value={{