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 { IconComponent } from '@/ui/display/icon/types/IconComponent';
|
||||||
import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata';
|
import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata';
|
||||||
import { ColumnDefinition } from '@/ui/object/record-table/types/ColumnDefinition';
|
import { ColumnDefinition } from '@/ui/object/record-table/types/ColumnDefinition';
|
||||||
@ -30,4 +31,5 @@ export const formatFieldMetadataItemAsColumnDefinition = ({
|
|||||||
Icon: icons[field.icon ?? 'Icon123'],
|
Icon: icons[field.icon ?? 'Icon123'],
|
||||||
isVisible: true,
|
isVisible: true,
|
||||||
basePathToShowPage: `/object/${objectMetadataItem.nameSingular}/`,
|
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 { useFavorites } from '@/favorites/hooks/useFavorites';
|
||||||
import { useFindOneObjectMetadataItem } from '@/object-metadata/hooks/useFindOneObjectMetadataItem';
|
import { useFindOneObjectMetadataItem } from '@/object-metadata/hooks/useFindOneObjectMetadataItem';
|
||||||
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
|
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
|
||||||
|
import { filterAvailableFieldMetadataItem } from '@/object-record/utils/filterAvailableFieldMetadataItem';
|
||||||
import { IconBuildingSkyscraper } from '@/ui/display/icon';
|
import { IconBuildingSkyscraper } from '@/ui/display/icon';
|
||||||
import { useLazyLoadIcons } from '@/ui/input/hooks/useLazyLoadIcons';
|
import { useLazyLoadIcons } from '@/ui/input/hooks/useLazyLoadIcons';
|
||||||
import { PageBody } from '@/ui/layout/page/PageBody';
|
import { PageBody } from '@/ui/layout/page/PageBody';
|
||||||
@ -156,6 +157,7 @@ export const RecordShowPage = () => {
|
|||||||
.diff(DateTime.fromISO(b.createdAt))
|
.diff(DateTime.fromISO(b.createdAt))
|
||||||
.toMillis(),
|
.toMillis(),
|
||||||
)
|
)
|
||||||
|
.filter(filterAvailableFieldMetadataItem)
|
||||||
.map((metadataField, index) => {
|
.map((metadataField, index) => {
|
||||||
return (
|
return (
|
||||||
<FieldContext.Provider
|
<FieldContext.Provider
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
|
|
||||||
import { useFindOneObjectMetadataItem } from '@/object-metadata/hooks/useFindOneObjectMetadataItem';
|
import { useFindOneObjectMetadataItem } from '@/object-metadata/hooks/useFindOneObjectMetadataItem';
|
||||||
|
import { filterAvailableTableColumns } from '@/object-record/utils/filterAvailableTableColumns';
|
||||||
import { useRecordTable } from '@/ui/object/record-table/hooks/useRecordTable';
|
import { useRecordTable } from '@/ui/object/record-table/hooks/useRecordTable';
|
||||||
import { useView } from '@/views/hooks/useView';
|
import { useView } from '@/views/hooks/useView';
|
||||||
import { ViewType } from '@/views/types/ViewType';
|
import { ViewType } from '@/views/types/ViewType';
|
||||||
@ -37,7 +38,11 @@ export const RecordTableEffect = () => {
|
|||||||
setAvailableFilterDefinitions?.(filterDefinitions);
|
setAvailableFilterDefinitions?.(filterDefinitions);
|
||||||
setAvailableFieldDefinitions?.(columnDefinitions);
|
setAvailableFieldDefinitions?.(columnDefinitions);
|
||||||
|
|
||||||
setAvailableTableColumns(columnDefinitions);
|
const availableTableColumns = columnDefinitions.filter(
|
||||||
|
filterAvailableTableColumns,
|
||||||
|
);
|
||||||
|
|
||||||
|
setAvailableTableColumns(availableTableColumns);
|
||||||
}, [
|
}, [
|
||||||
setViewObjectMetadataId,
|
setViewObjectMetadataId,
|
||||||
setViewType,
|
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: {
|
variables: {
|
||||||
where: { id: entityId },
|
where: { id: entityId },
|
||||||
data: {
|
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 { FieldMetadata } from './FieldMetadata';
|
||||||
import { FieldType } from './FieldType';
|
import { FieldType } from './FieldType';
|
||||||
|
|
||||||
|
export type FieldDefinitionRelationType =
|
||||||
|
| 'TO_ONE_OBJECT'
|
||||||
|
| 'FROM_NAMY_OBJECTS'
|
||||||
|
| 'TO_MANY_OBJECTS';
|
||||||
|
|
||||||
export type FieldDefinition<T extends FieldMetadata> = {
|
export type FieldDefinition<T extends FieldMetadata> = {
|
||||||
fieldMetadataId: string;
|
fieldMetadataId: string;
|
||||||
label: string;
|
label: string;
|
||||||
@ -17,4 +22,5 @@ export type FieldDefinition<T extends FieldMetadata> = {
|
|||||||
pictureUrl?: string;
|
pictureUrl?: string;
|
||||||
avatarType: AvatarType;
|
avatarType: AvatarType;
|
||||||
};
|
};
|
||||||
|
relationType?: FieldDefinitionRelationType;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user