Fix broken chips on timelin eActivity on show pages (#9057)
We were using RecordIndexContext in FieldDisplays components which is wrong as the FieldDisplays could be used in locations not providing this context (not being indexes pages). Instead, we are passing it within FieldContext which the context that will always be there for FieldDisplays and we need indexes to fill this FieldContext with their RecordIndexContext value when needed
This commit is contained in:
@ -2,7 +2,6 @@ import { ReactNode } from 'react';
|
|||||||
|
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
|
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
|
||||||
import { getBasePathToShowPage } from '@/object-metadata/utils/getBasePathToShowPage';
|
|
||||||
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
||||||
import {
|
import {
|
||||||
FieldContext,
|
FieldContext,
|
||||||
@ -34,10 +33,6 @@ export const useFieldContext = ({
|
|||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
});
|
});
|
||||||
|
|
||||||
const basePathToShowPage = getBasePathToShowPage({
|
|
||||||
objectNameSingular,
|
|
||||||
});
|
|
||||||
|
|
||||||
const fieldMetadataItem = objectMetadataItem?.fields.find(
|
const fieldMetadataItem = objectMetadataItem?.fields.find(
|
||||||
(field) => field.name === fieldMetadataName,
|
(field) => field.name === fieldMetadataName,
|
||||||
);
|
);
|
||||||
@ -63,9 +58,6 @@ export const useFieldContext = ({
|
|||||||
<FieldContext.Provider
|
<FieldContext.Provider
|
||||||
key={objectRecordId + fieldMetadataItem.id}
|
key={objectRecordId + fieldMetadataItem.id}
|
||||||
value={{
|
value={{
|
||||||
basePathToShowPage: isLabelIdentifier
|
|
||||||
? basePathToShowPage
|
|
||||||
: undefined,
|
|
||||||
recordId: objectRecordId,
|
recordId: objectRecordId,
|
||||||
recoilScopeId: objectRecordId + fieldMetadataItem.id,
|
recoilScopeId: objectRecordId + fieldMetadataItem.id,
|
||||||
isLabelIdentifier,
|
isLabelIdentifier,
|
||||||
|
|||||||
@ -15,6 +15,7 @@ import {
|
|||||||
} from '@/object-record/record-field/contexts/FieldContext';
|
} from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { getFieldButtonIcon } from '@/object-record/record-field/utils/getFieldButtonIcon';
|
import { getFieldButtonIcon } from '@/object-record/record-field/utils/getFieldButtonIcon';
|
||||||
import { RecordIdentifierChip } from '@/object-record/record-index/components/RecordIndexRecordChip';
|
import { RecordIdentifierChip } from '@/object-record/record-index/components/RecordIndexRecordChip';
|
||||||
|
import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext';
|
||||||
import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell';
|
import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell';
|
||||||
import { RecordInlineCellEditMode } from '@/object-record/record-inline-cell/components/RecordInlineCellEditMode';
|
import { RecordInlineCellEditMode } from '@/object-record/record-inline-cell/components/RecordInlineCellEditMode';
|
||||||
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
|
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
|
||||||
@ -187,6 +188,7 @@ export const RecordBoardCard = ({
|
|||||||
);
|
);
|
||||||
|
|
||||||
const record = useRecoilValue(recordStoreFamilyState(recordId));
|
const record = useRecoilValue(recordStoreFamilyState(recordId));
|
||||||
|
const { indexIdentifierUrl } = useRecordIndexContextOrThrow();
|
||||||
|
|
||||||
const recordBoardId = useAvailableScopeIdOrThrow(
|
const recordBoardId = useAvailableScopeIdOrThrow(
|
||||||
RecordBoardScopeInternalContext,
|
RecordBoardScopeInternalContext,
|
||||||
@ -308,6 +310,7 @@ export const RecordBoardCard = ({
|
|||||||
record={record as ObjectRecord}
|
record={record as ObjectRecord}
|
||||||
variant={AvatarChipVariant.Transparent}
|
variant={AvatarChipVariant.Transparent}
|
||||||
maxWidth={150}
|
maxWidth={150}
|
||||||
|
to={indexIdentifierUrl(recordId)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|||||||
@ -26,7 +26,7 @@ export type GenericFieldContextType = {
|
|||||||
recoilScopeId?: string;
|
recoilScopeId?: string;
|
||||||
hotkeyScope: string;
|
hotkeyScope: string;
|
||||||
isLabelIdentifier: boolean;
|
isLabelIdentifier: boolean;
|
||||||
basePathToShowPage?: string;
|
labelIdentifierLink?: string;
|
||||||
clearable?: boolean;
|
clearable?: boolean;
|
||||||
maxWidth?: number;
|
maxWidth?: number;
|
||||||
isCentered?: boolean;
|
isCentered?: boolean;
|
||||||
|
|||||||
@ -4,8 +4,12 @@ import { RecordIdentifierChip } from '@/object-record/record-index/components/Re
|
|||||||
import { ChipSize } from 'twenty-ui';
|
import { ChipSize } from 'twenty-ui';
|
||||||
|
|
||||||
export const ChipFieldDisplay = () => {
|
export const ChipFieldDisplay = () => {
|
||||||
const { recordValue, objectNameSingular, isLabelIdentifier } =
|
const {
|
||||||
useChipFieldDisplay();
|
recordValue,
|
||||||
|
objectNameSingular,
|
||||||
|
isLabelIdentifier,
|
||||||
|
labelIdentifierLink,
|
||||||
|
} = useChipFieldDisplay();
|
||||||
|
|
||||||
if (!recordValue) {
|
if (!recordValue) {
|
||||||
return null;
|
return null;
|
||||||
@ -16,6 +20,7 @@ export const ChipFieldDisplay = () => {
|
|||||||
objectNameSingular={objectNameSingular}
|
objectNameSingular={objectNameSingular}
|
||||||
record={recordValue}
|
record={recordValue}
|
||||||
size={ChipSize.Small}
|
size={ChipSize.Small}
|
||||||
|
to={labelIdentifierLink}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<RecordChip objectNameSingular={objectNameSingular} record={recordValue} />
|
<RecordChip objectNameSingular={objectNameSingular} record={recordValue} />
|
||||||
|
|||||||
@ -65,7 +65,6 @@ const meta: Meta = {
|
|||||||
<FieldContext.Provider
|
<FieldContext.Provider
|
||||||
value={{
|
value={{
|
||||||
recordId: relationFromManyFieldDisplayMock.recordId,
|
recordId: relationFromManyFieldDisplayMock.recordId,
|
||||||
basePathToShowPage: '/object-record/',
|
|
||||||
isLabelIdentifier: false,
|
isLabelIdentifier: false,
|
||||||
fieldDefinition: {
|
fieldDefinition: {
|
||||||
...relationFromManyFieldDisplayMock.fieldDefinition,
|
...relationFromManyFieldDisplayMock.fieldDefinition,
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import { isFieldActor } from '@/object-record/record-field/types/guards/isFieldA
|
|||||||
import { FieldContext } from '../../contexts/FieldContext';
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
|
|
||||||
export const useChipFieldDisplay = () => {
|
export const useChipFieldDisplay = () => {
|
||||||
const { recordId, fieldDefinition, isLabelIdentifier } =
|
const { recordId, fieldDefinition, isLabelIdentifier, labelIdentifierLink } =
|
||||||
useContext(FieldContext);
|
useContext(FieldContext);
|
||||||
|
|
||||||
const { chipGeneratorPerObjectPerField } = useContext(
|
const { chipGeneratorPerObjectPerField } = useContext(
|
||||||
@ -41,5 +41,6 @@ export const useChipFieldDisplay = () => {
|
|||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
recordValue,
|
recordValue,
|
||||||
isLabelIdentifier,
|
isLabelIdentifier,
|
||||||
|
labelIdentifierLink,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
import { useGetStandardObjectIcon } from '@/object-metadata/hooks/useGetStandardObjectIcon';
|
import { useGetStandardObjectIcon } from '@/object-metadata/hooks/useGetStandardObjectIcon';
|
||||||
import { useRecordChipData } from '@/object-record/hooks/useRecordChipData';
|
import { useRecordChipData } from '@/object-record/hooks/useRecordChipData';
|
||||||
import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext';
|
|
||||||
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
||||||
import { AvatarChip, AvatarChipVariant, ChipSize } from 'twenty-ui';
|
import { AvatarChip, AvatarChipVariant, ChipSize } from 'twenty-ui';
|
||||||
|
|
||||||
@ -9,6 +8,7 @@ export type RecordIdentifierChipProps = {
|
|||||||
record: ObjectRecord;
|
record: ObjectRecord;
|
||||||
variant?: AvatarChipVariant;
|
variant?: AvatarChipVariant;
|
||||||
size?: ChipSize;
|
size?: ChipSize;
|
||||||
|
to?: string;
|
||||||
maxWidth?: number;
|
maxWidth?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -17,9 +17,9 @@ export const RecordIdentifierChip = ({
|
|||||||
record,
|
record,
|
||||||
variant,
|
variant,
|
||||||
size,
|
size,
|
||||||
|
to,
|
||||||
maxWidth,
|
maxWidth,
|
||||||
}: RecordIdentifierChipProps) => {
|
}: RecordIdentifierChipProps) => {
|
||||||
const { indexIdentifierUrl } = useRecordIndexContextOrThrow();
|
|
||||||
const { recordChipData } = useRecordChipData({
|
const { recordChipData } = useRecordChipData({
|
||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
record,
|
record,
|
||||||
@ -33,7 +33,7 @@ export const RecordIdentifierChip = ({
|
|||||||
name={recordChipData.name}
|
name={recordChipData.name}
|
||||||
avatarType={recordChipData.avatarType}
|
avatarType={recordChipData.avatarType}
|
||||||
avatarUrl={recordChipData.avatarUrl ?? ''}
|
avatarUrl={recordChipData.avatarUrl ?? ''}
|
||||||
to={indexIdentifierUrl ? indexIdentifierUrl(record.id) : undefined}
|
to={to}
|
||||||
variant={variant}
|
variant={variant}
|
||||||
LeftIcon={LeftIcon}
|
LeftIcon={LeftIcon}
|
||||||
LeftIconColor={LeftIconColor}
|
LeftIconColor={LeftIconColor}
|
||||||
|
|||||||
@ -35,7 +35,6 @@ const meta: Meta<typeof RecordDetailRelationSection> = {
|
|||||||
<FieldContext.Provider
|
<FieldContext.Provider
|
||||||
value={{
|
value={{
|
||||||
recordId: companiesMock[0].id,
|
recordId: companiesMock[0].id,
|
||||||
basePathToShowPage: '/object-record/',
|
|
||||||
isLabelIdentifier: false,
|
isLabelIdentifier: false,
|
||||||
fieldDefinition: formatFieldMetadataItemAsFieldDefinition({
|
fieldDefinition: formatFieldMetadataItemAsFieldDefinition({
|
||||||
field: mockedCompanyObjectMetadataItem.fields.find(
|
field: mockedCompanyObjectMetadataItem.fields.find(
|
||||||
|
|||||||
@ -122,7 +122,6 @@ const meta: Meta = {
|
|||||||
<FieldContext.Provider
|
<FieldContext.Provider
|
||||||
value={{
|
value={{
|
||||||
recordId: mockPerformance.recordId,
|
recordId: mockPerformance.recordId,
|
||||||
basePathToShowPage: '/object-record/',
|
|
||||||
isLabelIdentifier: false,
|
isLabelIdentifier: false,
|
||||||
fieldDefinition: {
|
fieldDefinition: {
|
||||||
...mockPerformance.fieldDefinition,
|
...mockPerformance.fieldDefinition,
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifie
|
|||||||
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation';
|
import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation';
|
||||||
import { isFieldSelect } from '@/object-record/record-field/types/guards/isFieldSelect';
|
import { isFieldSelect } from '@/object-record/record-field/types/guards/isFieldSelect';
|
||||||
|
import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext';
|
||||||
import { RecordUpdateContext } from '@/object-record/record-table/contexts/EntityUpdateMutationHookContext';
|
import { RecordUpdateContext } from '@/object-record/record-table/contexts/EntityUpdateMutationHookContext';
|
||||||
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
|
import { RecordTableCellContext } from '@/object-record/record-table/contexts/RecordTableCellContext';
|
||||||
import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext';
|
import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext';
|
||||||
@ -20,9 +21,11 @@ export const RecordTableCellFieldContextWrapper = ({
|
|||||||
}) => {
|
}) => {
|
||||||
const { objectMetadataItem } = useRecordTableContextOrThrow();
|
const { objectMetadataItem } = useRecordTableContextOrThrow();
|
||||||
|
|
||||||
|
const { indexIdentifierUrl } = useRecordIndexContextOrThrow();
|
||||||
|
|
||||||
const { columnDefinition } = useContext(RecordTableCellContext);
|
const { columnDefinition } = useContext(RecordTableCellContext);
|
||||||
|
|
||||||
const { recordId, pathToShowPage } = useRecordTableRowContextOrThrow();
|
const { recordId } = useRecordTableRowContextOrThrow();
|
||||||
|
|
||||||
const updateRecord = useContext(RecordUpdateContext);
|
const updateRecord = useContext(RecordUpdateContext);
|
||||||
|
|
||||||
@ -44,7 +47,7 @@ export const RecordTableCellFieldContextWrapper = ({
|
|||||||
fieldDefinition: columnDefinition,
|
fieldDefinition: columnDefinition,
|
||||||
useUpdateRecord: () => [updateRecord, {}],
|
useUpdateRecord: () => [updateRecord, {}],
|
||||||
hotkeyScope: customHotkeyScope,
|
hotkeyScope: customHotkeyScope,
|
||||||
basePathToShowPage: pathToShowPage,
|
labelIdentifierLink: indexIdentifierUrl(recordId),
|
||||||
isLabelIdentifier: isLabelIdentifierField({
|
isLabelIdentifier: isLabelIdentifierField({
|
||||||
fieldMetadataItem: {
|
fieldMetadataItem: {
|
||||||
id: columnDefinition.fieldMetadataId,
|
id: columnDefinition.fieldMetadataId,
|
||||||
|
|||||||
@ -128,7 +128,6 @@ export const getFieldDecorator =
|
|||||||
<FieldContext.Provider
|
<FieldContext.Provider
|
||||||
value={{
|
value={{
|
||||||
recordId: record.id,
|
recordId: record.id,
|
||||||
basePathToShowPage: '/object-record/',
|
|
||||||
isLabelIdentifier,
|
isLabelIdentifier,
|
||||||
fieldDefinition: formatFieldMetadataItemAsColumnDefinition({
|
fieldDefinition: formatFieldMetadataItemAsColumnDefinition({
|
||||||
field: fieldMetadataItem,
|
field: fieldMetadataItem,
|
||||||
|
|||||||
@ -2,7 +2,6 @@ import { ReactNode } from 'react';
|
|||||||
|
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
|
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
|
||||||
import { getBasePathToShowPage } from '@/object-metadata/utils/getBasePathToShowPage';
|
|
||||||
import {
|
import {
|
||||||
FieldContext,
|
FieldContext,
|
||||||
RecordUpdateHook,
|
RecordUpdateHook,
|
||||||
@ -30,10 +29,6 @@ export const useMockFieldContext = ({
|
|||||||
objectNameSingular,
|
objectNameSingular,
|
||||||
});
|
});
|
||||||
|
|
||||||
const basePathToShowPage = getBasePathToShowPage({
|
|
||||||
objectNameSingular,
|
|
||||||
});
|
|
||||||
|
|
||||||
const fieldMetadataItem = objectMetadataItem?.fields.find(
|
const fieldMetadataItem = objectMetadataItem?.fields.find(
|
||||||
(field) => field.name === fieldMetadataName,
|
(field) => field.name === fieldMetadataName,
|
||||||
);
|
);
|
||||||
@ -50,9 +45,6 @@ export const useMockFieldContext = ({
|
|||||||
<FieldContext.Provider
|
<FieldContext.Provider
|
||||||
key={objectRecordId + fieldMetadataItem.id}
|
key={objectRecordId + fieldMetadataItem.id}
|
||||||
value={{
|
value={{
|
||||||
basePathToShowPage: isLabelIdentifier
|
|
||||||
? basePathToShowPage
|
|
||||||
: undefined,
|
|
||||||
recordId: objectRecordId,
|
recordId: objectRecordId,
|
||||||
recoilScopeId: objectRecordId + fieldMetadataItem.id,
|
recoilScopeId: objectRecordId + fieldMetadataItem.id,
|
||||||
isLabelIdentifier,
|
isLabelIdentifier,
|
||||||
|
|||||||
Reference in New Issue
Block a user