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 10:08:16 +00:00
committed by GitHub
parent 7653be8fde
commit d468c3dc84
20 changed files with 302 additions and 6 deletions
@@ -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);
@@ -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"`,
);
}
}
@@ -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',
})
@@ -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 = {
@@ -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;
}