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:
@ -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),
|
||||
});
|
||||
|
||||
@ -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;
|
||||
}
|
||||
};
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
};
|
||||
@ -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;
|
||||
};
|
||||
@ -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,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user