diff --git a/packages/twenty-sdk/src/cli/utilities/entity/__tests__/get-view-base-file.spec.ts b/packages/twenty-sdk/src/cli/utilities/entity/__tests__/get-view-base-file.spec.ts index 409144bec68..68536985b89 100644 --- a/packages/twenty-sdk/src/cli/utilities/entity/__tests__/get-view-base-file.spec.ts +++ b/packages/twenty-sdk/src/cli/utilities/entity/__tests__/get-view-base-file.spec.ts @@ -27,13 +27,14 @@ describe('getViewBaseFile', () => { expect(result).toContain("objectUniversalIdentifier: 'fill-later'"); }); - it('should include commented fields and filters when no fields provided', () => { + it('should include commented fields, filters and sorts when no fields provided', () => { const result = getViewBaseFile({ name: 'empty-view', }); expect(result).toContain('// fields: ['); expect(result).toContain('// filters: ['); + expect(result).toContain('// sorts: ['); }); it('should render fields block when fields are provided', () => { diff --git a/packages/twenty-sdk/src/cli/utilities/entity/entity-view-template.ts b/packages/twenty-sdk/src/cli/utilities/entity/entity-view-template.ts index 89ab3cdb7cf..98e013c464e 100644 --- a/packages/twenty-sdk/src/cli/utilities/entity/entity-view-template.ts +++ b/packages/twenty-sdk/src/cli/utilities/entity/entity-view-template.ts @@ -68,6 +68,13 @@ ${fieldsBlock} // value: '', // }, // ], + // sorts: [ + // { + // universalIdentifier: '...', + // fieldMetadataUniversalIdentifier: '...', + // direction: 'DESC', + // }, + // ], }); `; }; diff --git a/packages/twenty-sdk/src/sdk/define/index.ts b/packages/twenty-sdk/src/sdk/define/index.ts index 4c318637a45..05697d74d79 100644 --- a/packages/twenty-sdk/src/sdk/define/index.ts +++ b/packages/twenty-sdk/src/sdk/define/index.ts @@ -79,6 +79,15 @@ export { defineSkill } from '@/sdk/define/skills/define-skill'; export { defineView } from '@/sdk/define/views/define-view'; export type { ViewConfig } from '@/sdk/define/views/view-config'; export { ViewKey } from '@/sdk/define/views/view-key'; +export type { + ViewFieldGroupManifest, + ViewFieldManifest, + ViewFilterGroupManifest, + ViewFilterManifest, + ViewGroupManifest, + ViewManifestFilterValue, + ViewSortManifest, +} from 'twenty-shared/application'; export { getPublicAssetUrl } from '@/sdk/define/get-public-asset-url'; @@ -94,6 +103,7 @@ export { ViewFilterGroupLogicalOperator, ViewFilterOperand, ViewOpenRecordIn, + ViewSortDirection, ViewType, ViewVisibility, } from 'twenty-shared/types'; diff --git a/packages/twenty-sdk/src/sdk/define/views/define-view.ts b/packages/twenty-sdk/src/sdk/define/views/define-view.ts index 041604b755f..05bc19cc551 100644 --- a/packages/twenty-sdk/src/sdk/define/views/define-view.ts +++ b/packages/twenty-sdk/src/sdk/define/views/define-view.ts @@ -1,3 +1,5 @@ +import { ViewSortDirection } from 'twenty-shared/types'; + import { type DefineEntity } from '@/sdk/define/common/types/define-entity.type'; import { createValidationResult } from '@/sdk/define/common/utils/create-validation-result'; import { type ViewConfig } from '@/sdk/define/views/view-config'; @@ -63,5 +65,24 @@ export const defineView: DefineEntity = (config) => { } } + if (config.sorts) { + for (const sort of config.sorts) { + if (!sort.universalIdentifier) { + errors.push('ViewSort must have a universalIdentifier'); + } + if (!sort.fieldMetadataUniversalIdentifier) { + errors.push('ViewSort must have a fieldMetadataUniversalIdentifier'); + } + if ( + sort.direction !== ViewSortDirection.ASC && + sort.direction !== ViewSortDirection.DESC + ) { + errors.push( + `ViewSort direction must be '${ViewSortDirection.ASC}' or '${ViewSortDirection.DESC}'`, + ); + } + } + } + return createValidationResult({ config, errors }); }; diff --git a/packages/twenty-server/src/engine/core-modules/application/application-manifest/converters/__tests__/from-view-sort-manifest-to-universal-flat-view-sort.util.spec.ts b/packages/twenty-server/src/engine/core-modules/application/application-manifest/converters/__tests__/from-view-sort-manifest-to-universal-flat-view-sort.util.spec.ts new file mode 100644 index 00000000000..23e9a043432 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/application/application-manifest/converters/__tests__/from-view-sort-manifest-to-universal-flat-view-sort.util.spec.ts @@ -0,0 +1,48 @@ +import { ViewSortDirection } from 'twenty-shared/types'; + +import { fromViewSortManifestToUniversalFlatViewSort } from 'src/engine/core-modules/application/application-manifest/converters/from-view-sort-manifest-to-universal-flat-view-sort.util'; + +describe('fromViewSortManifestToUniversalFlatViewSort', () => { + const now = '2026-01-01T00:00:00.000Z'; + const applicationUniversalIdentifier = 'app-uuid-1'; + const viewUniversalIdentifier = 'view-uuid-1'; + + it('should convert a view sort manifest with ASC direction', () => { + const result = fromViewSortManifestToUniversalFlatViewSort({ + viewSortManifest: { + universalIdentifier: 'vsort-uuid-1', + fieldMetadataUniversalIdentifier: 'field-uuid-1', + direction: ViewSortDirection.ASC, + }, + viewUniversalIdentifier, + applicationUniversalIdentifier, + now, + }); + + expect(result.universalIdentifier).toBe('vsort-uuid-1'); + expect(result.fieldMetadataUniversalIdentifier).toBe('field-uuid-1'); + expect(result.viewUniversalIdentifier).toBe(viewUniversalIdentifier); + expect(result.applicationUniversalIdentifier).toBe( + applicationUniversalIdentifier, + ); + expect(result.direction).toBe(ViewSortDirection.ASC); + expect(result.createdAt).toBe(now); + expect(result.updatedAt).toBe(now); + expect(result.deletedAt).toBeNull(); + }); + + it('should convert a view sort manifest with DESC direction', () => { + const result = fromViewSortManifestToUniversalFlatViewSort({ + viewSortManifest: { + universalIdentifier: 'vsort-uuid-2', + fieldMetadataUniversalIdentifier: 'field-uuid-2', + direction: ViewSortDirection.DESC, + }, + viewUniversalIdentifier, + applicationUniversalIdentifier, + now, + }); + + expect(result.direction).toBe(ViewSortDirection.DESC); + }); +}); diff --git a/packages/twenty-server/src/engine/core-modules/application/application-manifest/converters/from-view-sort-manifest-to-universal-flat-view-sort.util.ts b/packages/twenty-server/src/engine/core-modules/application/application-manifest/converters/from-view-sort-manifest-to-universal-flat-view-sort.util.ts new file mode 100644 index 00000000000..e34d56cf145 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/application/application-manifest/converters/from-view-sort-manifest-to-universal-flat-view-sort.util.ts @@ -0,0 +1,27 @@ +import { type ViewSortManifest } from 'twenty-shared/application'; + +import { type UniversalFlatViewSort } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-sort.type'; + +export const fromViewSortManifestToUniversalFlatViewSort = ({ + viewSortManifest, + viewUniversalIdentifier, + applicationUniversalIdentifier, + now, +}: { + viewSortManifest: ViewSortManifest; + viewUniversalIdentifier: string; + applicationUniversalIdentifier: string; + now: string; +}): UniversalFlatViewSort => { + return { + universalIdentifier: viewSortManifest.universalIdentifier, + applicationUniversalIdentifier, + fieldMetadataUniversalIdentifier: + viewSortManifest.fieldMetadataUniversalIdentifier, + viewUniversalIdentifier, + direction: viewSortManifest.direction, + createdAt: now, + updatedAt: now, + deletedAt: null, + }; +}; diff --git a/packages/twenty-server/src/engine/core-modules/application/application-manifest/utils/compute-application-manifest-all-universal-flat-entity-maps.util.ts b/packages/twenty-server/src/engine/core-modules/application/application-manifest/utils/compute-application-manifest-all-universal-flat-entity-maps.util.ts index 765b671973c..c6c0b26a57b 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application-manifest/utils/compute-application-manifest-all-universal-flat-entity-maps.util.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application-manifest/utils/compute-application-manifest-all-universal-flat-entity-maps.util.ts @@ -25,6 +25,7 @@ import { fromViewFilterGroupManifestToUniversalFlatViewFilterGroup } from 'src/e import { fromViewFilterManifestToUniversalFlatViewFilter } from 'src/engine/core-modules/application/application-manifest/converters/from-view-filter-manifest-to-universal-flat-view-filter.util'; import { fromViewGroupManifestToUniversalFlatViewGroup } from 'src/engine/core-modules/application/application-manifest/converters/from-view-group-manifest-to-universal-flat-view-group.util'; import { fromViewManifestToUniversalFlatView } from 'src/engine/core-modules/application/application-manifest/converters/from-view-manifest-to-universal-flat-view.util'; +import { fromViewSortManifestToUniversalFlatViewSort } from 'src/engine/core-modules/application/application-manifest/converters/from-view-sort-manifest-to-universal-flat-view-sort.util'; import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { fromAgentManifestToUniversalFlatAgent } from 'src/engine/core-modules/application/utils/from-agent-manifest-to-universal-flat-agent.util'; import { createEmptyAllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-all-flat-entity-maps.constant'; @@ -325,6 +326,19 @@ export const computeApplicationManifestAllUniversalFlatEntityMaps = ({ allUniversalFlatEntityMaps.flatViewGroupMaps, }); } + + for (const viewSortManifest of viewManifest.sorts ?? []) { + addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({ + universalFlatEntity: fromViewSortManifestToUniversalFlatViewSort({ + viewSortManifest, + viewUniversalIdentifier: viewManifest.universalIdentifier, + applicationUniversalIdentifier, + now, + }), + universalFlatEntityMapsToMutate: + allUniversalFlatEntityMaps.flatViewSortMaps, + }); + } } for (const navigationMenuItemManifest of manifest.navigationMenuItems ?? []) { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-one-to-many-metadata-relations.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-one-to-many-metadata-relations.constant.ts index 4b5b3160b2e..6a3f9388c66 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-one-to-many-metadata-relations.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/constant/all-one-to-many-metadata-relations.constant.ts @@ -136,8 +136,11 @@ export const ALL_ONE_TO_MANY_METADATA_RELATIONS = { universalFlatEntityForeignKeyAggregator: 'viewFieldGroupUniversalIdentifiers', }, - // @ts-expect-error TODO migrate viewSort to v2 - viewSorts: null, + viewSorts: { + metadataName: 'viewSort', + flatEntityForeignKeyAggregator: 'viewSortIds', + universalFlatEntityForeignKeyAggregator: 'viewSortUniversalIdentifiers', + }, }, viewField: {}, viewFieldGroup: { diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/get-metadata-related-metadata-names.util.spec.ts.snap b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/get-metadata-related-metadata-names.util.spec.ts.snap index 08468f4e3a7..7731907c93a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/get-metadata-related-metadata-names.util.spec.ts.snap +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/__tests__/__snapshots__/get-metadata-related-metadata-names.util.spec.ts.snap @@ -139,6 +139,7 @@ exports[`getMetadataRelatedMetadataNames should return related metadata names fo "viewFilterGroup", "viewGroup", "viewFieldGroup", + "viewSort", ] `; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-sort/utils/from-create-view-sort-input-to-flat-view-sort-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-sort/utils/from-create-view-sort-input-to-flat-view-sort-to-create.util.ts index ff270ab71cf..db40c2f8752 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-sort/utils/from-create-view-sort-input-to-flat-view-sort-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-sort/utils/from-create-view-sort-input-to-flat-view-sort-to-create.util.ts @@ -2,7 +2,7 @@ import { trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties } from 'tw import { v4 } from 'uuid'; import { type CreateViewSortInput } from 'src/engine/metadata-modules/view-sort/dtos/inputs/create-view-sort.input'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; +import { ViewSortDirection } from 'twenty-shared/types'; import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { type UniversalFlatViewSort } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-view-sort.type'; diff --git a/packages/twenty-server/src/engine/metadata-modules/view-sort/controllers/view-sort.controller.ts b/packages/twenty-server/src/engine/metadata-modules/view-sort/controllers/view-sort.controller.ts index 37a7bb9eb4d..1768c23809e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-sort/controllers/view-sort.controller.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-sort/controllers/view-sort.controller.ts @@ -31,7 +31,7 @@ import { } from 'src/engine/metadata-modules/view-sort/exceptions/view-sort.exception'; import { ViewSortRestApiExceptionFilter } from 'src/engine/metadata-modules/view-sort/filters/view-sort-rest-api-exception.filter'; import { ViewSortService } from 'src/engine/metadata-modules/view-sort/services/view-sort.service'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; +import { ViewSortDirection } from 'twenty-shared/types'; @Controller('rest/metadata/viewSorts') @UseGuards(WorkspaceAuthGuard) diff --git a/packages/twenty-server/src/engine/metadata-modules/view-sort/dtos/inputs/create-view-sort.input.ts b/packages/twenty-server/src/engine/metadata-modules/view-sort/dtos/inputs/create-view-sort.input.ts index f5cac727780..8b4c8d690d0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-sort/dtos/inputs/create-view-sort.input.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-sort/dtos/inputs/create-view-sort.input.ts @@ -3,7 +3,7 @@ import { Field, HideField, InputType } from '@nestjs/graphql'; import { IsEnum, IsOptional, IsUUID } from 'class-validator'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; +import { ViewSortDirection } from 'twenty-shared/types'; @InputType() export class CreateViewSortInput { diff --git a/packages/twenty-server/src/engine/metadata-modules/view-sort/dtos/inputs/update-view-sort.input.ts b/packages/twenty-server/src/engine/metadata-modules/view-sort/dtos/inputs/update-view-sort.input.ts index 76819be94c1..d47b289781a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-sort/dtos/inputs/update-view-sort.input.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-sort/dtos/inputs/update-view-sort.input.ts @@ -10,7 +10,7 @@ import { import { Type } from 'class-transformer'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; +import { ViewSortDirection } from 'twenty-shared/types'; @InputType() class UpdateViewSortInputUpdates { diff --git a/packages/twenty-server/src/engine/metadata-modules/view-sort/dtos/view-sort.dto.ts b/packages/twenty-server/src/engine/metadata-modules/view-sort/dtos/view-sort.dto.ts index bb24f4d04b2..8f2d59b7712 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-sort/dtos/view-sort.dto.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-sort/dtos/view-sort.dto.ts @@ -3,7 +3,7 @@ import { Field, ObjectType, registerEnumType } from '@nestjs/graphql'; import { IDField } from '@ptc-org/nestjs-query-graphql'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; +import { ViewSortDirection } from 'twenty-shared/types'; registerEnumType(ViewSortDirection, { name: 'ViewSortDirection' }); diff --git a/packages/twenty-server/src/engine/metadata-modules/view-sort/entities/view-sort.entity.ts b/packages/twenty-server/src/engine/metadata-modules/view-sort/entities/view-sort.entity.ts index d6b4bba8ff8..371987c260d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-sort/entities/view-sort.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-sort/entities/view-sort.entity.ts @@ -12,7 +12,7 @@ import { } from 'typeorm'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; +import { ViewSortDirection } from 'twenty-shared/types'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; import { SyncableEntity } from 'src/engine/workspace-manager/types/syncable-entity.interface'; diff --git a/packages/twenty-server/src/engine/metadata-modules/view-sort/tools/view-sort-tools.factory.ts b/packages/twenty-server/src/engine/metadata-modules/view-sort/tools/view-sort-tools.factory.ts index 9bfedf9015d..894476dfadc 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-sort/tools/view-sort-tools.factory.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-sort/tools/view-sort-tools.factory.ts @@ -4,7 +4,7 @@ import { type ToolSet } from 'ai'; import { z } from 'zod'; import { formatValidationErrors } from 'src/engine/core-modules/tool-provider/utils/format-validation-errors.util'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; +import { ViewSortDirection } from 'twenty-shared/types'; import { ViewSortService } from 'src/engine/metadata-modules/view-sort/services/view-sort.service'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; diff --git a/packages/twenty-server/src/engine/metadata-modules/view/services/__tests__/view-query-params.service.spec.ts b/packages/twenty-server/src/engine/metadata-modules/view/services/__tests__/view-query-params.service.spec.ts index ee335b4bba3..1156655cf4e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view/services/__tests__/view-query-params.service.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view/services/__tests__/view-query-params.service.spec.ts @@ -4,12 +4,12 @@ import { FieldMetadataType, ViewFilterGroupLogicalOperator, ViewFilterOperand, + ViewSortDirection, ViewType, ViewVisibility, } from 'twenty-shared/types'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; import { ViewQueryParamsService } from 'src/engine/metadata-modules/view/services/view-query-params.service'; import { ViewService } from 'src/engine/metadata-modules/view/services/view.service'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; diff --git a/packages/twenty-server/src/engine/metadata-modules/view/services/view-query-params.service.ts b/packages/twenty-server/src/engine/metadata-modules/view/services/view-query-params.service.ts index 912a02aea8c..766b85ea330 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view/services/view-query-params.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view/services/view-query-params.service.ts @@ -5,6 +5,7 @@ import { RecordFilterGroupLogicalOperator, type RecordGqlOperationFilter, ViewFilterGroupLogicalOperator, + ViewSortDirection, ViewType, } from 'twenty-shared/types'; import { @@ -19,7 +20,6 @@ import { type ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; import { DEFAULT_TIMEZONE } from 'src/engine/metadata-modules/view/constants/default-timezone.constant'; import { ViewService } from 'src/engine/metadata-modules/view/services/view.service'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/__tests__/__snapshots__/all-universal-flat-entity-foreign-key-aggregator-properties.constant.spec.ts.snap b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/__tests__/__snapshots__/all-universal-flat-entity-foreign-key-aggregator-properties.constant.spec.ts.snap index a79ca8ee912..fb96fe6916a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/__tests__/__snapshots__/all-universal-flat-entity-foreign-key-aggregator-properties.constant.spec.ts.snap +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/__tests__/__snapshots__/all-universal-flat-entity-foreign-key-aggregator-properties.constant.spec.ts.snap @@ -55,6 +55,7 @@ exports[`ALL_UNIVERSAL_FLAT_ENTITY_FOREIGN_KEY_AGGREGATOR_PROPERTIES should matc "viewFilterGroupUniversalIdentifiers", "viewGroupUniversalIdentifiers", "viewFieldGroupUniversalIdentifiers", + "viewSortUniversalIdentifiers", ], "viewField": [], "viewFieldGroup": [ diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-sort-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-sort-validator.service.ts index a0597f175b7..533f8b888c9 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-sort-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-view-sort-validator.service.ts @@ -9,7 +9,7 @@ import { ViewSortExceptionCode } from 'src/engine/metadata-modules/view-sort/exc import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; +import { ViewSortDirection } from 'twenty-shared/types'; import { UniversalFlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-validation-args.type'; import { findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util'; diff --git a/packages/twenty-server/test/integration/graphql/suites/view/view-sort-resolver.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/view/view-sort-resolver.integration-spec.ts index fbc3718b1e2..e29b2a589df 100644 --- a/packages/twenty-server/test/integration/graphql/suites/view/view-sort-resolver.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/view/view-sort-resolver.integration-spec.ts @@ -19,10 +19,9 @@ import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util'; import { destroyOneView } from 'test/integration/metadata/suites/view/utils/destroy-one-view.util'; import { assertViewSortStructure } from 'test/integration/utils/view-test.util'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, ViewSortDirection } from 'twenty-shared/types'; import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; import { generateViewSortExceptionMessage, ViewSortExceptionMessageKey, diff --git a/packages/twenty-server/test/integration/graphql/utils/view-data-factory.util.ts b/packages/twenty-server/test/integration/graphql/utils/view-data-factory.util.ts index 2f49276ca20..c97a7995732 100644 --- a/packages/twenty-server/test/integration/graphql/utils/view-data-factory.util.ts +++ b/packages/twenty-server/test/integration/graphql/utils/view-data-factory.util.ts @@ -1,13 +1,13 @@ import { ViewFilterGroupLogicalOperator, ViewOpenRecordIn, + ViewSortDirection, ViewType, ViewVisibility, } from 'twenty-shared/types'; import { type ViewFilterGroupEntity } from 'src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity'; import { type ViewSortEntity } from 'src/engine/metadata-modules/view-sort/entities/view-sort.entity'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; export const createViewData = (overrides: Partial = {}) => ({ diff --git a/packages/twenty-server/test/integration/metadata/suites/view-sort/failing-view-sort-creation.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/view-sort/failing-view-sort-creation.integration-spec.ts index 62f970c6457..5605d553770 100644 --- a/packages/twenty-server/test/integration/metadata/suites/view-sort/failing-view-sort-creation.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/view-sort/failing-view-sort-creation.integration-spec.ts @@ -12,7 +12,7 @@ import { v4 } from 'uuid'; import { ViewType } from 'twenty-shared/types'; import { type CreateViewSortInput } from 'src/engine/metadata-modules/view-sort/dtos/inputs/create-view-sort.input'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; +import { ViewSortDirection } from 'twenty-shared/types'; type TestSetup = { createdViewId: string; diff --git a/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-creation.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-creation.integration-spec.ts index 634cd794fac..a29a20c2b6e 100644 --- a/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-creation.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-creation.integration-spec.ts @@ -9,7 +9,7 @@ import { destroyOneView } from 'test/integration/metadata/suites/view/utils/dest import { jestExpectToBeDefined } from 'test/utils/jest-expect-to-be-defined.util.test'; import { FieldMetadataType, ViewType } from 'twenty-shared/types'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; +import { ViewSortDirection } from 'twenty-shared/types'; describe('View Sort creation should succeed', () => { let testObjectMetadataId: string; diff --git a/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-deletion.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-deletion.integration-spec.ts index 51bcff4ebca..f96c30c1e7f 100644 --- a/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-deletion.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-deletion.integration-spec.ts @@ -10,7 +10,7 @@ import { destroyOneView } from 'test/integration/metadata/suites/view/utils/dest import { jestExpectToBeDefined } from 'test/utils/jest-expect-to-be-defined.util.test'; import { FieldMetadataType, ViewType } from 'twenty-shared/types'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; +import { ViewSortDirection } from 'twenty-shared/types'; describe('View Sort deletion should succeed', () => { let testObjectMetadataId: string; diff --git a/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-destroy.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-destroy.integration-spec.ts index db130df3574..53e0a70e62c 100644 --- a/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-destroy.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-destroy.integration-spec.ts @@ -9,7 +9,7 @@ import { destroyOneView } from 'test/integration/metadata/suites/view/utils/dest import { jestExpectToBeDefined } from 'test/utils/jest-expect-to-be-defined.util.test'; import { FieldMetadataType, ViewType } from 'twenty-shared/types'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; +import { ViewSortDirection } from 'twenty-shared/types'; describe('View Sort deletion should succeed', () => { let testObjectMetadataId: string; diff --git a/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-update.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-update.integration-spec.ts index 6bb54587d3f..82ae56113ef 100644 --- a/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-update.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/view-sort/successful-view-sort-update.integration-spec.ts @@ -10,7 +10,7 @@ import { destroyOneView } from 'test/integration/metadata/suites/view/utils/dest import { jestExpectToBeDefined } from 'test/utils/jest-expect-to-be-defined.util.test'; import { FieldMetadataType, ViewType } from 'twenty-shared/types'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; +import { ViewSortDirection } from 'twenty-shared/types'; describe('View Sort update should succeed', () => { let testObjectMetadataId: string; diff --git a/packages/twenty-server/test/integration/rest/suites/view-sort.integration-spec.ts b/packages/twenty-server/test/integration/rest/suites/view-sort.integration-spec.ts index c2a1f0534cd..c721fcef2d0 100644 --- a/packages/twenty-server/test/integration/rest/suites/view-sort.integration-spec.ts +++ b/packages/twenty-server/test/integration/rest/suites/view-sort.integration-spec.ts @@ -15,10 +15,9 @@ import { } from 'test/integration/rest/utils/view-rest-api.util'; import { assertViewSortStructure } from 'test/integration/utils/view-test.util'; import { jestExpectToBeDefined } from 'test/utils/jest-expect-to-be-defined.util.test'; -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, ViewSortDirection } from 'twenty-shared/types'; import { type ViewSortDTO } from 'src/engine/metadata-modules/view-sort/dtos/view-sort.dto'; -import { ViewSortDirection } from 'src/engine/metadata-modules/view-sort/enums/view-sort-direction'; import { generateViewSortExceptionMessage, ViewSortExceptionMessageKey, diff --git a/packages/twenty-shared/src/application/index.ts b/packages/twenty-shared/src/application/index.ts index 773bf25f3d4..20cc78f5909 100644 --- a/packages/twenty-shared/src/application/index.ts +++ b/packages/twenty-shared/src/application/index.ts @@ -62,5 +62,6 @@ export type { ViewFilterGroupManifest, ViewGroupManifest, ViewFieldGroupManifest, + ViewSortManifest, ViewManifest, } from './viewManifestType'; diff --git a/packages/twenty-shared/src/application/viewManifestType.ts b/packages/twenty-shared/src/application/viewManifestType.ts index 479f4cddefc..dca8e5a44e9 100644 --- a/packages/twenty-shared/src/application/viewManifestType.ts +++ b/packages/twenty-shared/src/application/viewManifestType.ts @@ -5,6 +5,7 @@ import { type ViewFilterGroupLogicalOperator, type ViewFilterOperand, type ViewOpenRecordIn, + type ViewSortDirection, type ViewType, type ViewVisibility, } from '@/types'; @@ -52,6 +53,11 @@ export type ViewFieldGroupManifest = SyncableEntityOptions & { isVisible?: boolean; }; +export type ViewSortManifest = SyncableEntityOptions & { + fieldMetadataUniversalIdentifier: string; + direction: ViewSortDirection; +}; + export type ViewManifest = SyncableEntityOptions & { name: string; objectUniversalIdentifier: string; @@ -67,4 +73,5 @@ export type ViewManifest = SyncableEntityOptions & { filterGroups?: ViewFilterGroupManifest[]; groups?: ViewGroupManifest[]; fieldGroups?: ViewFieldGroupManifest[]; + sorts?: ViewSortManifest[]; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/view-sort/enums/view-sort-direction.ts b/packages/twenty-shared/src/types/ViewSortDirection.ts similarity index 100% rename from packages/twenty-server/src/engine/metadata-modules/view-sort/enums/view-sort-direction.ts rename to packages/twenty-shared/src/types/ViewSortDirection.ts diff --git a/packages/twenty-shared/src/types/index.ts b/packages/twenty-shared/src/types/index.ts index fdec892feda..182a8cdb7d6 100644 --- a/packages/twenty-shared/src/types/index.ts +++ b/packages/twenty-shared/src/types/index.ts @@ -284,5 +284,6 @@ export { ViewFilterOperand } from './ViewFilterOperand'; export { ViewFilterOperandDeprecated } from './ViewFilterOperandDeprecated'; export { ViewKey } from './ViewKey'; export { ViewOpenRecordIn } from './ViewOpenRecordIn'; +export { ViewSortDirection } from './ViewSortDirection'; export { ViewType } from './ViewType'; export { ViewVisibility } from './ViewVisibility';