Files
twenty/packages/twenty-front/src/modules/views/utils/mapViewFieldsToColumnDefinitions.ts
T
Félix Malfait b27a97f2c5 feat: enforce @/ alias for imports and fix all relative parent imports (#16787)
## Summary
This PR enforces the use of `@/` alias for imports instead of relative
parent imports (`../`).

## Changes

### ESLint Configuration
- Added `no-restricted-imports` pattern in `eslint.config.react.mjs` to
block `../*` imports with the message "Relative parent imports are not
allowed. Use @/ alias instead."
- Removed the non-working `import/no-relative-parent-imports` rule
(doesn't work properly in ESLint flat config)

### VS Code Settings
- Added `javascript.preferences.importModuleSpecifier: non-relative` to
`.vscode/settings.json` (TypeScript setting was already there)

### Code Fixes
- Fixed **941 relative parent imports** across **706 files** in
`packages/twenty-front`
- All `../` imports converted to use `@/` alias

## Why
- Consistent import style across the codebase
- Easier to move files without breaking imports
- Better IDE support for auto-imports
- Clearer understanding of where imports come from
2025-12-23 22:57:51 +01:00

75 lines
2.8 KiB
TypeScript

import { type FieldMetadata } from '@/object-record/record-field/ui/types/FieldMetadata';
import { type ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
import { mapArrayToObject } from '~/utils/array/mapArrayToObject';
import { moveArrayItem } from '~/utils/array/moveArrayItem';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
import { isDefined } from 'twenty-shared/utils';
import { type ViewField } from '@/views/types/ViewField';
export const mapViewFieldsToColumnDefinitions = ({
columnDefinitions,
viewFields,
}: {
columnDefinitions: ColumnDefinition<FieldMetadata>[];
viewFields: ViewField[];
}): ColumnDefinition<FieldMetadata>[] => {
let labelIdentifierFieldMetadataId = '';
const columnDefinitionsByFieldMetadataId = mapArrayToObject(
columnDefinitions,
({ fieldMetadataId }) => fieldMetadataId,
);
const columnDefinitionsFromViewFields = viewFields
.map((viewField) => {
const correspondingColumnDefinition =
columnDefinitionsByFieldMetadataId[viewField.fieldMetadataId];
if (isUndefinedOrNull(correspondingColumnDefinition)) return null;
const { isLabelIdentifier } = correspondingColumnDefinition;
if (isLabelIdentifier === true) {
labelIdentifierFieldMetadataId =
correspondingColumnDefinition.fieldMetadataId;
}
return {
fieldMetadataId: viewField.fieldMetadataId,
label: correspondingColumnDefinition.label,
metadata: correspondingColumnDefinition.metadata,
iconName: correspondingColumnDefinition.iconName,
type: correspondingColumnDefinition.type,
position: isLabelIdentifier ? 0 : viewField.position,
size: viewField.size ?? correspondingColumnDefinition.size,
isLabelIdentifier,
isVisible: isLabelIdentifier || viewField.isVisible,
viewFieldId: viewField.id,
isUIReadOnly: correspondingColumnDefinition.metadata.isUIReadOnly,
isSortable: correspondingColumnDefinition.isSortable,
isFilterable: correspondingColumnDefinition.isFilterable,
defaultValue: correspondingColumnDefinition.defaultValue,
settings:
'settings' in correspondingColumnDefinition.metadata
? correspondingColumnDefinition.metadata.settings
: undefined,
} as ColumnDefinition<FieldMetadata>;
})
.filter(isDefined);
// No label identifier set for this object
if (!labelIdentifierFieldMetadataId) return columnDefinitionsFromViewFields;
const labelIdentifierIndex = columnDefinitionsFromViewFields.findIndex(
({ fieldMetadataId }) => fieldMetadataId === labelIdentifierFieldMetadataId,
);
// Label identifier field found in view fields
// => move it to the start of the list
return moveArrayItem(columnDefinitionsFromViewFields, {
fromIndex: labelIdentifierIndex,
toIndex: 0,
});
};