Add ability to save any field filter to view (#13401)

This PR adds the ability to save an any field filter to a view.

It adds a new `anyFieldFilterValue` on both core view and workspace view
entities.

It also introduces the necessary utils that mimic the logic that manages
the save of record filters and record sorts on views.
This commit is contained in:
Lucas Bordeau
2025-07-24 12:08:16 +02:00
committed by GitHub
parent 7653be8fde
commit d468c3dc84
20 changed files with 302 additions and 6 deletions

View File

@ -252,6 +252,7 @@ export class MigrateViewsToCoreCommand extends ActiveOrSuspendedWorkspacesMigrat
deletedAt: workspaceView.deletedAt
? new Date(workspaceView.deletedAt)
: null,
anyFieldFilterValue: workspaceView.anyFieldFilterValue,
};
const repository = queryRunner.manager.getRepository(View);

View File

@ -0,0 +1,19 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
export class CreateAnyFieldFilterValueColumnOnView1753349164408
implements MigrationInterface
{
name = 'CreateAnyFieldFilterValueColumnOnView1753349164408';
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "core"."view" ADD "anyFieldFilterValue" text`,
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "core"."view" DROP COLUMN "anyFieldFilterValue"`,
);
}
}

View File

@ -88,6 +88,9 @@ export class View {
@DeleteDateColumn({ type: 'timestamptz' })
deletedAt?: Date | null;
@Column({ nullable: true, type: 'text', default: null })
anyFieldFilterValue?: string | null;
@ManyToOne(() => Workspace, {
onDelete: 'CASCADE',
})

View File

@ -444,6 +444,7 @@ export const VIEW_STANDARD_FIELD_IDS = {
viewFilterGroups: '20202020-0318-474a-84a1-bac895ceaa5a',
viewSorts: '20202020-891b-45c3-9fe1-80a75b4aa043',
favorites: '20202020-c818-4a86-8284-9ec0ef0a59a5',
anyFieldFilterValue: '20202020-3143-46c0-bb05-034063ce0703',
};
export const WEBHOOK_STANDARD_FIELD_IDS = {

View File

@ -307,4 +307,14 @@ export class ViewWorkspaceEntity extends BaseWorkspaceEntity {
})
@WorkspaceIsNullable()
kanbanAggregateOperationFieldMetadataId?: string | null;
@WorkspaceField({
standardId: VIEW_STANDARD_FIELD_IDS.anyFieldFilterValue,
type: FieldMetadataType.TEXT,
label: msg`Any field filter value`,
description: msg`Any field filter value`,
defaultValue: null,
})
@WorkspaceIsNullable()
anyFieldFilterValue?: string | null;
}