3f0ee0139c
This PR prepares the refactor of record field definition and column definition. We need to separate the two concepts of FieldInput and FieldContext at the cell level, and the new RecordField concept that will replace FieldDefinition at the metadata and state level. So we create a new ui sub-folder in the already existing record-field folder, in order to separate those two concepts that are still very close.
66 lines
2.4 KiB
TypeScript
66 lines
2.4 KiB
TypeScript
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
|
import { type FieldMetadata } from '@/object-record/record-field/ui/types/FieldMetadata';
|
|
import { type ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
|
import { filterAvailableTableColumns } from '@/object-record/utils/filterAvailableTableColumns';
|
|
|
|
import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector';
|
|
import { availableFieldMetadataItemsForSortFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForSortFamilySelector';
|
|
import { useRecoilValue } from 'recoil';
|
|
import { formatFieldMetadataItemAsColumnDefinition } from '../utils/formatFieldMetadataItemAsColumnDefinition';
|
|
|
|
export const useColumnDefinitionsFromFieldMetadata = (
|
|
objectMetadataItem: ObjectMetadataItem,
|
|
) => {
|
|
const activeFieldMetadataItems = objectMetadataItem.readableFields.filter(
|
|
({ isActive, isSystem }) => isActive && !isSystem,
|
|
);
|
|
|
|
const filterableFieldMetadataItems = useRecoilValue(
|
|
availableFieldMetadataItemsForFilterFamilySelector({
|
|
objectMetadataItemId: objectMetadataItem.id,
|
|
}),
|
|
);
|
|
|
|
const sortableFieldMetadataItems = useRecoilValue(
|
|
availableFieldMetadataItemsForSortFamilySelector({
|
|
objectMetadataItemId: objectMetadataItem.id,
|
|
}),
|
|
);
|
|
|
|
const restrictedFieldMetadataIds: string[] = [];
|
|
|
|
const columnDefinitions: ColumnDefinition<FieldMetadata>[] =
|
|
activeFieldMetadataItems
|
|
.map((field, index) =>
|
|
formatFieldMetadataItemAsColumnDefinition({
|
|
position: index,
|
|
field,
|
|
objectMetadataItem,
|
|
}),
|
|
)
|
|
.filter(filterAvailableTableColumns)
|
|
.filter((column) => {
|
|
return !restrictedFieldMetadataIds.includes(column.fieldMetadataId);
|
|
})
|
|
.map((column) => {
|
|
const existsInFilterDefinitions = filterableFieldMetadataItems.some(
|
|
(fieldMetadataItem) =>
|
|
fieldMetadataItem.id === column.fieldMetadataId,
|
|
);
|
|
|
|
const existsInSortDefinitions = sortableFieldMetadataItems.some(
|
|
(fieldMetadataItem) =>
|
|
fieldMetadataItem.id === column.fieldMetadataId,
|
|
);
|
|
return {
|
|
...column,
|
|
isFilterable: existsInFilterDefinitions,
|
|
isSortable: existsInSortDefinitions,
|
|
};
|
|
});
|
|
|
|
return {
|
|
columnDefinitions,
|
|
};
|
|
};
|