fix: set isActive=true in morph migration & add system fields toggle (#17736)

## Summary

Three fixes in this PR:

### 1. Migration commands now set `isActive = true` and use generic
'Target' label

When converting relation fields to `MORPH_RELATION` type, the migration
commands now:
- Set `isActive = true` to prevent inactive fields from being selected
as the representative morph field
- Update all field labels to generic **'Target'** instead of keeping
individual labels like 'Company', 'Person'

This ensures the UI shows a coherent label ('Target') alongside 'X
Objects' for the type.

**Files changed:**
- `1-17-migrate-note-target-to-morph-relations.command.ts`
- `1-17-migrate-task-target-to-morph-relations.command.ts`

### 2. Added system fields/relations toggles in Settings

The fields and relations tables in Settings > Data Model were filtering
out system fields with no way to view them. Added a "System fields" /
"System relations" toggle (visible in advanced mode) to allow viewing
these fields.

**Files changed:**
- `SettingsObjectFieldTable.tsx`
- `SettingsObjectRelationsTable.tsx`

This matches the existing behavior on the Objects table which already
has a "System objects" toggle.
This commit is contained in:
Félix Malfait
2026-02-05 14:35:46 +01:00
committed by GitHub
parent 0473efcef0
commit 27da9d60eb
4 changed files with 68 additions and 16 deletions
@@ -13,13 +13,19 @@ import { Table } from '@/ui/layout/table/components/Table';
import { TableHeader } from '@/ui/layout/table/components/TableHeader';
import { useSortedArray } from '@/ui/layout/table/hooks/useSortedArray';
import { type TableMetadata } from '@/ui/layout/table/types/TableMetadata';
import { isAdvancedModeEnabledState } from '@/ui/navigation/navigation-drawer/states/isAdvancedModeEnabledState';
import styled from '@emotion/styled';
import { msg } from '@lingui/core/macro';
import { useLingui } from '@lingui/react/macro';
import { useEffect, useMemo, useState } from 'react';
import { useRecoilState } from 'recoil';
import { useRecoilState, useRecoilValue } from 'recoil';
import { FieldMetadataType } from 'twenty-shared/types';
import { IconArchive, IconFilter, IconSearch } from 'twenty-ui/display';
import {
IconArchive,
IconFilter,
IconSearch,
IconSettings,
} from 'twenty-ui/display';
import { Button } from 'twenty-ui/input';
import { MenuItemToggle } from 'twenty-ui/navigation';
import { useMapFieldMetadataItemToSettingsObjectDetailTableItem } from '~/pages/settings/data-model/hooks/useMapFieldMetadataItemToSettingsObjectDetailTableItem';
@@ -81,6 +87,9 @@ export const SettingsObjectFieldTable = ({
const { t } = useLingui();
const [searchTerm, setSearchTerm] = useState('');
const [showInactive, setShowInactive] = useState(true);
const [showSystemFields, setShowSystemFields] = useState(false);
const isAdvancedModeEnabled = useRecoilValue(isAdvancedModeEnabledState);
const tableMetadata = SETTINGS_OBJECT_FIELD_TABLE_METADATA;
@@ -98,17 +107,19 @@ export const SettingsObjectFieldTable = ({
}, [objectMetadataItem, setSettingsObjectFields]);
const allObjectSettingsDetailItems = useMemo(() => {
const nonSystemFields = settingsObjectFields?.filter(
(fieldMetadataItem) => !fieldMetadataItem.isSystem,
);
const filteredBySystem = showSystemFields
? settingsObjectFields
: settingsObjectFields?.filter(
(fieldMetadataItem) => !fieldMetadataItem.isSystem,
);
const fieldsToDisplay = excludeRelations
? nonSystemFields?.filter(
? filteredBySystem?.filter(
(fieldMetadataItem) =>
fieldMetadataItem.type !== FieldMetadataType.RELATION &&
fieldMetadataItem.type !== FieldMetadataType.MORPH_RELATION,
)
: nonSystemFields;
: filteredBySystem;
return (
fieldsToDisplay?.map(
@@ -119,6 +130,7 @@ export const SettingsObjectFieldTable = ({
settingsObjectFields,
mapFieldMetadataItemToSettingsObjectDetailTableItem,
excludeRelations,
showSystemFields,
]);
const sortedAllObjectSettingsDetailItems = useSortedArray(
@@ -174,6 +186,17 @@ export const SettingsObjectFieldTable = ({
text={t`Inactive`}
toggleSize="small"
/>
{isAdvancedModeEnabled && (
<MenuItemToggle
LeftIcon={IconSettings}
onToggleChange={() =>
setShowSystemFields(!showSystemFields)
}
toggled={showSystemFields}
text={t`System fields`}
toggleSize="small"
/>
)}
</DropdownMenuItemsContainer>
</DropdownContent>
}