feat: NoValue is bot properly created the backend (#9110)
`No Value` view groups wasn't properly created when we select a group by field metadata, this PR fix the issue. Also a script is added to backfill the current view groups. --------- Co-authored-by: Marie <51697796+ijreilly@users.noreply.github.com>
This commit is contained in:
@ -84,8 +84,9 @@ import { UpdateFieldInput } from './dtos/update-field.input';
|
||||
IsFieldMetadataDefaultValue,
|
||||
IsFieldMetadataOptions,
|
||||
FieldMetadataService,
|
||||
FieldMetadataRelatedRecordsService,
|
||||
FieldMetadataResolver,
|
||||
],
|
||||
exports: [FieldMetadataService],
|
||||
exports: [FieldMetadataService, FieldMetadataRelatedRecordsService],
|
||||
})
|
||||
export class FieldMetadataModule {}
|
||||
|
||||
@ -8,6 +8,7 @@ import {
|
||||
} from 'src/engine/metadata-modules/field-metadata/dtos/options.input';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { isSelectFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-select-field-metadata-type.util';
|
||||
import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository';
|
||||
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
|
||||
import { ViewGroupWorkspaceEntity } from 'src/modules/view/standard-objects/view-group.workspace-entity';
|
||||
import { ViewWorkspaceEntity } from 'src/modules/view/standard-objects/view.workspace-entity';
|
||||
@ -28,7 +29,7 @@ export class FieldMetadataRelatedRecordsService {
|
||||
oldFieldMetadata: FieldMetadataEntity,
|
||||
newFieldMetadata: FieldMetadataEntity,
|
||||
transactionManager?: EntityManager,
|
||||
) {
|
||||
): Promise<void> {
|
||||
if (
|
||||
!isSelectFieldMetadataType(newFieldMetadata.type) ||
|
||||
!isSelectFieldMetadataType(oldFieldMetadata.type)
|
||||
@ -54,10 +55,7 @@ export class FieldMetadataRelatedRecordsService {
|
||||
continue;
|
||||
}
|
||||
|
||||
const maxPosition = view.viewGroups.reduce(
|
||||
(max, viewGroup) => Math.max(max, viewGroup.position),
|
||||
0,
|
||||
);
|
||||
const maxPosition = this.getMaxPosition(view.viewGroups);
|
||||
|
||||
const viewGroupsToCreate = created.map((option, index) =>
|
||||
viewGroupRepository.create({
|
||||
@ -72,21 +70,19 @@ export class FieldMetadataRelatedRecordsService {
|
||||
await viewGroupRepository.insert(viewGroupsToCreate, transactionManager);
|
||||
|
||||
for (const { old: oldOption, new: newOption } of updated) {
|
||||
const viewGroup = view.viewGroups.find(
|
||||
(viewGroup) => viewGroup.fieldValue === oldOption.value,
|
||||
const existingViewGroup = view.viewGroups.find(
|
||||
(group) => group.fieldValue === oldOption.value,
|
||||
);
|
||||
|
||||
if (!viewGroup) {
|
||||
throw new Error(`View group not found for option ${oldOption.value}`);
|
||||
if (!existingViewGroup) {
|
||||
throw new Error(
|
||||
`View group not found for option "${oldOption.value}" during update.`,
|
||||
);
|
||||
}
|
||||
|
||||
await viewGroupRepository.update(
|
||||
{
|
||||
id: viewGroup.id,
|
||||
},
|
||||
{
|
||||
fieldValue: newOption.value,
|
||||
},
|
||||
{ id: existingViewGroup.id },
|
||||
{ fieldValue: newOption.value },
|
||||
transactionManager,
|
||||
);
|
||||
}
|
||||
@ -100,13 +96,49 @@ export class FieldMetadataRelatedRecordsService {
|
||||
},
|
||||
transactionManager,
|
||||
);
|
||||
|
||||
await this.syncNoValueViewGroup(
|
||||
newFieldMetadata,
|
||||
view,
|
||||
viewGroupRepository,
|
||||
transactionManager,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
async syncNoValueViewGroup(
|
||||
fieldMetadata: FieldMetadataEntity,
|
||||
view: ViewWorkspaceEntity,
|
||||
viewGroupRepository: WorkspaceRepository<ViewGroupWorkspaceEntity>,
|
||||
transactionManager?: EntityManager,
|
||||
): Promise<void> {
|
||||
const noValueGroup = view.viewGroups.find(
|
||||
(group) => group.fieldValue === '',
|
||||
);
|
||||
|
||||
if (fieldMetadata.isNullable && !noValueGroup) {
|
||||
const maxPosition = this.getMaxPosition(view.viewGroups);
|
||||
const newGroup = viewGroupRepository.create({
|
||||
fieldMetadataId: fieldMetadata.id,
|
||||
fieldValue: '',
|
||||
position: maxPosition + 1,
|
||||
isVisible: true,
|
||||
viewId: view.id,
|
||||
});
|
||||
|
||||
await viewGroupRepository.insert(newGroup, transactionManager);
|
||||
} else if (!fieldMetadata.isNullable && noValueGroup) {
|
||||
await viewGroupRepository.delete(
|
||||
{ id: noValueGroup.id },
|
||||
transactionManager,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private getOptionsDifferences(
|
||||
oldOptions: (FieldMetadataDefaultOption | FieldMetadataComplexOption)[],
|
||||
newOptions: (FieldMetadataDefaultOption | FieldMetadataComplexOption)[],
|
||||
) {
|
||||
): Differences<FieldMetadataDefaultOption | FieldMetadataComplexOption> {
|
||||
const differences: Differences<
|
||||
FieldMetadataDefaultOption | FieldMetadataComplexOption
|
||||
> = {
|
||||
@ -115,12 +147,8 @@ export class FieldMetadataRelatedRecordsService {
|
||||
deleted: [],
|
||||
};
|
||||
|
||||
const oldOptionsMap = new Map(
|
||||
oldOptions.map((option) => [option.id, option]),
|
||||
);
|
||||
const newOptionsMap = new Map(
|
||||
newOptions.map((option) => [option.id, option]),
|
||||
);
|
||||
const oldOptionsMap = new Map(oldOptions.map((opt) => [opt.id, opt]));
|
||||
const newOptionsMap = new Map(newOptions.map((opt) => [opt.id, opt]));
|
||||
|
||||
for (const newOption of newOptions) {
|
||||
const oldOption = oldOptionsMap.get(newOption.id);
|
||||
@ -150,7 +178,7 @@ export class FieldMetadataRelatedRecordsService {
|
||||
'view',
|
||||
);
|
||||
|
||||
return await viewRepository.find({
|
||||
return viewRepository.find({
|
||||
where: {
|
||||
viewGroups: {
|
||||
fieldMetadataId: fieldMetadata.id,
|
||||
@ -159,4 +187,8 @@ export class FieldMetadataRelatedRecordsService {
|
||||
relations: ['viewGroups'],
|
||||
});
|
||||
}
|
||||
|
||||
private getMaxPosition(viewGroups: ViewGroupWorkspaceEntity[]): number {
|
||||
return viewGroups.reduce((max, group) => Math.max(max, group.position), 0);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user