Feat/filter available field definition v2 (#2547)

* Added react-dev-inspector

* Add field relation type parsing and filter available fields for record table and show page

* Revert "Added react-dev-inspector"

This reverts commit 7a78964c2c3996ce2e27f6f8d0c0b5e1f3283e17.
This commit is contained in:
Lucas Bordeau
2023-11-16 17:09:50 +01:00
committed by GitHub
parent 0ae9373532
commit 7da18a13e8
8 changed files with 98 additions and 2 deletions

View File

@ -1,3 +1,4 @@
import { parseFieldRelationType } from '@/object-metadata/utils/parseFieldRelationType';
import { IconComponent } from '@/ui/display/icon/types/IconComponent';
import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata';
import { ColumnDefinition } from '@/ui/object/record-table/types/ColumnDefinition';
@ -30,4 +31,5 @@ export const formatFieldMetadataItemAsColumnDefinition = ({
Icon: icons[field.icon ?? 'Icon123'],
isVisible: true,
basePathToShowPage: `/object/${objectMetadataItem.nameSingular}/`,
relationType: parseFieldRelationType(field),
});

View File

@ -0,0 +1,39 @@
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { FieldDefinitionRelationType } from '@/ui/object/field/types/FieldDefinition';
import { isDefined } from '~/utils/isDefined';
export const parseFieldRelationType = (
field: FieldMetadataItem | undefined,
): FieldDefinitionRelationType | undefined => {
if (field && field.type === 'RELATION') {
if (
isDefined(field.fromRelationMetadata) &&
field.fromRelationMetadata.relationType === 'ONE_TO_MANY'
) {
return 'FROM_NAMY_OBJECTS';
} else if (
isDefined(field.toRelationMetadata) &&
field.toRelationMetadata.relationType === 'ONE_TO_MANY'
) {
return 'TO_ONE_OBJECT';
} else if (
isDefined(field.fromRelationMetadata) &&
field.fromRelationMetadata.relationType === 'MANY_TO_MANY'
) {
return 'FROM_NAMY_OBJECTS';
} else if (
isDefined(field.toRelationMetadata) &&
field.toRelationMetadata.relationType === 'MANY_TO_MANY'
) {
return 'TO_MANY_OBJECTS';
}
throw new Error(
`Cannot determine field relation type for field : ${JSON.stringify(
field,
)}.`,
);
} else {
return undefined;
}
};

View File

@ -6,6 +6,7 @@ import { ActivityTargetableEntityType } from '@/activities/types/ActivityTargeta
import { useFavorites } from '@/favorites/hooks/useFavorites';
import { useFindOneObjectMetadataItem } from '@/object-metadata/hooks/useFindOneObjectMetadataItem';
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
import { filterAvailableFieldMetadataItem } from '@/object-record/utils/filterAvailableFieldMetadataItem';
import { IconBuildingSkyscraper } from '@/ui/display/icon';
import { useLazyLoadIcons } from '@/ui/input/hooks/useLazyLoadIcons';
import { PageBody } from '@/ui/layout/page/PageBody';
@ -156,6 +157,7 @@ export const RecordShowPage = () => {
.diff(DateTime.fromISO(b.createdAt))
.toMillis(),
)
.filter(filterAvailableFieldMetadataItem)
.map((metadataField, index) => {
return (
<FieldContext.Provider

View File

@ -1,6 +1,7 @@
import { useEffect } from 'react';
import { useFindOneObjectMetadataItem } from '@/object-metadata/hooks/useFindOneObjectMetadataItem';
import { filterAvailableTableColumns } from '@/object-record/utils/filterAvailableTableColumns';
import { useRecordTable } from '@/ui/object/record-table/hooks/useRecordTable';
import { useView } from '@/views/hooks/useView';
import { ViewType } from '@/views/types/ViewType';
@ -37,7 +38,11 @@ export const RecordTableEffect = () => {
setAvailableFilterDefinitions?.(filterDefinitions);
setAvailableFieldDefinitions?.(columnDefinitions);
setAvailableTableColumns(columnDefinitions);
const availableTableColumns = columnDefinitions.filter(
filterAvailableTableColumns,
);
setAvailableTableColumns(availableTableColumns);
}, [
setViewObjectMetadataId,
setViewType,

View File

@ -0,0 +1,21 @@
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { parseFieldRelationType } from '@/object-metadata/utils/parseFieldRelationType';
export const filterAvailableFieldMetadataItem = (
fieldMetadataItem: FieldMetadataItem,
): boolean => {
if (fieldMetadataItem.type === 'RELATION') {
const fieldMetadataItemRelationType =
parseFieldRelationType(fieldMetadataItem);
if (fieldMetadataItemRelationType !== 'TO_ONE_OBJECT') {
return false;
}
}
if (fieldMetadataItem.type === 'UUID') {
return false;
}
return true;
};

View File

@ -0,0 +1,19 @@
import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata';
import { ColumnDefinition } from '@/ui/object/record-table/types/ColumnDefinition';
export const filterAvailableTableColumns = (
columnDefinition: ColumnDefinition<FieldMetadata>,
): boolean => {
if (
columnDefinition.type === 'RELATION' &&
columnDefinition.relationType !== 'TO_ONE_OBJECT'
) {
return false;
}
if (columnDefinition.type === 'UUID') {
return false;
}
return true;
};

View File

@ -109,7 +109,9 @@ export const usePersistField = () => {
variables: {
where: { id: entityId },
data: {
[fieldName]: valueToPersist?.id ?? null,
// TODO: find a more elegant way to do this ?
// Maybe have a link between the RELATION field and the UUID field ?
[`${fieldName}Id`]: valueToPersist?.id ?? null,
},
},
});

View File

@ -4,6 +4,11 @@ import { AvatarType } from '@/users/components/Avatar';
import { FieldMetadata } from './FieldMetadata';
import { FieldType } from './FieldType';
export type FieldDefinitionRelationType =
| 'TO_ONE_OBJECT'
| 'FROM_NAMY_OBJECTS'
| 'TO_MANY_OBJECTS';
export type FieldDefinition<T extends FieldMetadata> = {
fieldMetadataId: string;
label: string;
@ -17,4 +22,5 @@ export type FieldDefinition<T extends FieldMetadata> = {
pictureUrl?: string;
avatarType: AvatarType;
};
relationType?: FieldDefinitionRelationType;
};