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