fix: record group issues (#8854)

This PR is fixing the following issues with record groups:

- [x] [Backend] - Only update view groups when a field is edited if this
one already has view groups
- [x] [Backend] - Editing a Select field metadata option brake view
groups
- [x] [Frontend] - Changing the group by field from one to another brake
record group and doesn't remove the previous ones
- [x] [Frontend & Backend] - Mark `kanbanFieldMetadataId` as deprecated
in favour of `viewGroups.fieldMetadataId`

Also the following has been checked:

- [x] Properly displayed a table with only one view groups
- [x] Properly displayed a table without view groups
This commit is contained in:
Jérémy M
2024-12-04 16:03:25 +01:00
committed by GitHub
parent 9142bdfb92
commit 2fa5fb7de7
5 changed files with 41 additions and 8 deletions

View File

@ -73,11 +73,24 @@ export const useHandleRecordGroupField = ({
}) satisfies ViewGroup, }) satisfies ViewGroup,
); );
const viewGroupsToDelete = view.viewGroups.filter(
(group) => group.fieldMetadataId !== fieldMetadataItem.id,
);
if (viewGroupsToCreate.length > 0) { if (viewGroupsToCreate.length > 0) {
await createViewGroupRecords(viewGroupsToCreate, view); await createViewGroupRecords(viewGroupsToCreate, view);
} }
if (viewGroupsToDelete.length > 0) {
await deleteViewGroupRecords(viewGroupsToDelete);
}
}, },
[createViewGroupRecords, currentViewIdCallbackState, getViewFromCache], [
createViewGroupRecords,
deleteViewGroupRecords,
currentViewIdCallbackState,
getViewFromCache,
],
); );
const resetRecordGroupField = useRecoilCallback( const resetRecordGroupField = useRecoilCallback(

View File

@ -12,6 +12,9 @@ export type GraphQLView = {
name: string; name: string;
type: ViewType; type: ViewType;
key: ViewKey | null; key: ViewKey | null;
/**
* @deprecated Use `viewGroups.fieldMetadataId` instead.
*/
kanbanFieldMetadataId: string; kanbanFieldMetadataId: string;
kanbanAggregateOperation?: AGGREGATE_OPERATIONS | null; kanbanAggregateOperation?: AGGREGATE_OPERATIONS | null;
kanbanAggregateOperationFieldMetadataId?: string | null; kanbanAggregateOperationFieldMetadataId?: string | null;

View File

@ -19,6 +19,9 @@ export type View = {
viewFilters: ViewFilter[]; viewFilters: ViewFilter[];
viewFilterGroups?: ViewFilterGroup[]; viewFilterGroups?: ViewFilterGroup[];
viewSorts: ViewSort[]; viewSorts: ViewSort[];
/**
* @deprecated Use `viewGroups.fieldMetadataId` instead.
*/
kanbanFieldMetadataId: string; kanbanFieldMetadataId: string;
kanbanAggregateOperation: AGGREGATE_OPERATIONS | null; kanbanAggregateOperation: AGGREGATE_OPERATIONS | null;
kanbanAggregateOperationFieldMetadataId: string | null; kanbanAggregateOperationFieldMetadataId: string | null;

View File

@ -1,6 +1,6 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { In } from 'typeorm'; import { EntityManager, In } from 'typeorm';
import { import {
FieldMetadataComplexOption, FieldMetadataComplexOption,
@ -27,6 +27,7 @@ export class FieldMetadataRelatedRecordsService {
public async updateRelatedViewGroups( public async updateRelatedViewGroups(
oldFieldMetadata: FieldMetadataEntity, oldFieldMetadata: FieldMetadataEntity,
newFieldMetadata: FieldMetadataEntity, newFieldMetadata: FieldMetadataEntity,
transactionManager?: EntityManager,
) { ) {
if ( if (
!isSelectFieldMetadataType(newFieldMetadata.type) || !isSelectFieldMetadataType(newFieldMetadata.type) ||
@ -49,6 +50,10 @@ export class FieldMetadataRelatedRecordsService {
); );
for (const view of views) { for (const view of views) {
if (view.viewGroups.length === 0) {
continue;
}
const maxPosition = view.viewGroups.reduce( const maxPosition = view.viewGroups.reduce(
(max, viewGroup) => Math.max(max, viewGroup.position), (max, viewGroup) => Math.max(max, viewGroup.position),
0, 0,
@ -64,7 +69,7 @@ export class FieldMetadataRelatedRecordsService {
}), }),
); );
await viewGroupRepository.insert(viewGroupsToCreate); await viewGroupRepository.insert(viewGroupsToCreate, transactionManager);
for (const { old: oldOption, new: newOption } of updated) { for (const { old: oldOption, new: newOption } of updated) {
const viewGroup = view.viewGroups.find( const viewGroup = view.viewGroups.find(
@ -82,15 +87,19 @@ export class FieldMetadataRelatedRecordsService {
{ {
fieldValue: newOption.value, fieldValue: newOption.value,
}, },
transactionManager,
); );
} }
const valuesToDelete = deleted.map((option) => option.value); const valuesToDelete = deleted.map((option) => option.value);
await viewGroupRepository.delete({ await viewGroupRepository.delete(
fieldMetadataId: newFieldMetadata.id, {
fieldValue: In(valuesToDelete), fieldMetadataId: newFieldMetadata.id,
}); fieldValue: In(valuesToDelete),
},
transactionManager,
);
} }
} }
@ -143,7 +152,9 @@ export class FieldMetadataRelatedRecordsService {
return await viewRepository.find({ return await viewRepository.find({
where: { where: {
kanbanFieldMetadataId: fieldMetadata.id, viewGroups: {
fieldMetadataId: fieldMetadata.id,
},
}, },
relations: ['viewGroups'], relations: ['viewGroups'],
}); });

View File

@ -87,6 +87,9 @@ export class ViewWorkspaceEntity extends BaseWorkspaceEntity {
label: 'kanbanfieldMetadataId', label: 'kanbanfieldMetadataId',
description: 'View Kanban column field', description: 'View Kanban column field',
}) })
/**
* @deprecated Use `viewGroups.fieldMetadataId` instead
*/
kanbanFieldMetadataId: string; kanbanFieldMetadataId: string;
@WorkspaceField({ @WorkspaceField({