import { Field, HideField, InputType, Int } from '@nestjs/graphql'; import { IsBoolean, IsEnum, IsInt, IsNotEmpty, IsNumber, IsOptional, IsString, IsUUID, Max, Min, } from 'class-validator'; import { AggregateOperations, ViewCalendarLayout, ViewOpenRecordIn, ViewKey, ViewType, ViewVisibility, } from 'twenty-shared/types'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; import { IsValidMetadataName } from 'src/engine/decorators/metadata/is-valid-metadata-name.decorator'; import { KANBAN_COLUMN_MAX_WIDTH } from 'src/engine/metadata-modules/view/constants/kanban-column-max-width.constant'; import { KANBAN_COLUMN_MIN_WIDTH } from 'src/engine/metadata-modules/view/constants/kanban-column-min-width.constant'; @InputType() export class CreateViewInput { @IsOptional() @IsUUID() @Field(() => UUIDScalarType, { nullable: true }) id?: string; @IsString() @IsNotEmpty() @IsValidMetadataName() @Field({ nullable: false }) name: string; @IsUUID() @Field(() => UUIDScalarType, { nullable: false }) objectMetadataId: string; @IsEnum(ViewType) @Field(() => ViewType, { nullable: true, defaultValue: ViewType.TABLE }) type?: ViewType; @IsOptional() @IsEnum(ViewKey) @Field(() => ViewKey, { nullable: true }) key?: ViewKey; @IsString() @Field({ nullable: false }) icon: string; @IsOptional() @IsNumber() @Field({ nullable: true, defaultValue: 0 }) position?: number; @IsOptional() @IsBoolean() @Field({ nullable: true, defaultValue: false }) isCompact?: boolean; @IsOptional() @IsBoolean() @Field({ nullable: true, defaultValue: false }) shouldHideEmptyGroups?: boolean; @IsOptional() @IsInt() @Min(KANBAN_COLUMN_MIN_WIDTH) @Max(KANBAN_COLUMN_MAX_WIDTH) @Field(() => Int, { nullable: true }) kanbanColumnWidth?: number; @IsOptional() @IsEnum(ViewOpenRecordIn) @Field(() => ViewOpenRecordIn, { nullable: true, defaultValue: ViewOpenRecordIn.SIDE_PANEL, }) openRecordIn?: ViewOpenRecordIn; @IsOptional() @IsEnum(AggregateOperations) @Field(() => AggregateOperations, { nullable: true }) kanbanAggregateOperation?: AggregateOperations; @IsOptional() @IsUUID() @Field(() => UUIDScalarType, { nullable: true }) kanbanAggregateOperationFieldMetadataId?: string; @IsOptional() @IsString() @Field({ nullable: true }) anyFieldFilterValue?: string; @IsOptional() @IsEnum(ViewCalendarLayout) @Field(() => ViewCalendarLayout, { nullable: true }) calendarLayout?: ViewCalendarLayout; @IsOptional() @IsUUID() @Field(() => UUIDScalarType, { nullable: true }) calendarFieldMetadataId?: string; @IsOptional() @IsUUID() @Field(() => UUIDScalarType, { nullable: true }) mainGroupByFieldMetadataId?: string; @IsOptional() @IsEnum(ViewVisibility) @Field(() => ViewVisibility, { nullable: true, }) visibility?: ViewVisibility; @HideField() universalIdentifier?: string; @HideField() applicationId?: string; }