From 8379e19587dd8264a99df9b8963e2004c6f370b5 Mon Sep 17 00:00:00 2001
From: Marie <51697796+ijreilly@users.noreply.github.com>
Date: Wed, 14 Jan 2026 18:28:51 +0100
Subject: [PATCH] [Apps] Small improvements (#17129)
- Fix undefined in breadcrumbs
- Make role required in app definition
---
.../SettingsServerlessFunctionDetail.tsx | 5 +++--
.../application/__tests__/define-app.spec.ts | 1 +
.../src/application/objects/define-object.ts | 2 +-
.../utils/__tests__/validate-manifest.spec.ts | 1 +
.../src/application/applicationType.ts | 2 +-
.../application/relationFieldManifestType.ts | 22 ++++++++-----------
6 files changed, 16 insertions(+), 17 deletions(-)
diff --git a/packages/twenty-front/src/pages/settings/serverless-functions/SettingsServerlessFunctionDetail.tsx b/packages/twenty-front/src/pages/settings/serverless-functions/SettingsServerlessFunctionDetail.tsx
index 780612199d..9f97c71e7b 100644
--- a/packages/twenty-front/src/pages/settings/serverless-functions/SettingsServerlessFunctionDetail.tsx
+++ b/packages/twenty-front/src/pages/settings/serverless-functions/SettingsServerlessFunctionDetail.tsx
@@ -37,7 +37,7 @@ export const SettingsServerlessFunctionDetail = () => {
const navigate = useNavigate();
const currentWorkspace = useRecoilValue(currentWorkspaceState);
- const { data } = useFindOneApplicationQuery({
+ const { data, loading: applicationLoading } = useFindOneApplicationQuery({
variables: { id: applicationId },
skip: !applicationId,
});
@@ -187,7 +187,8 @@ export const SettingsServerlessFunctionDetail = () => {
];
return (
- !loading && (
+ !loading &&
+ !applicationLoading && (
{
displayName: 'My App',
description: 'My app description',
icon: 'IconWorld',
+ functionRoleUniversalIdentifier: '68bb56f3-8300-4cb5-8cc3-8da9ee66f1b2',
};
const result = defineApp(config);
diff --git a/packages/twenty-sdk/src/application/objects/define-object.ts b/packages/twenty-sdk/src/application/objects/define-object.ts
index 0cb42070d8..66fca225c9 100644
--- a/packages/twenty-sdk/src/application/objects/define-object.ts
+++ b/packages/twenty-sdk/src/application/objects/define-object.ts
@@ -1,5 +1,5 @@
-import { type ObjectManifest } from 'twenty-shared/application';
import { isNonEmptyString } from '@sniptt/guards';
+import { type ObjectManifest } from 'twenty-shared/application';
import { validateFieldsOrThrow } from './validate-fields';
/**
diff --git a/packages/twenty-sdk/src/cli/utils/__tests__/validate-manifest.spec.ts b/packages/twenty-sdk/src/cli/utils/__tests__/validate-manifest.spec.ts
index dde4411432..d05a619bd2 100644
--- a/packages/twenty-sdk/src/cli/utils/__tests__/validate-manifest.spec.ts
+++ b/packages/twenty-sdk/src/cli/utils/__tests__/validate-manifest.spec.ts
@@ -9,6 +9,7 @@ describe('validateManifest - objectExtensions', () => {
const validApplication: Application = {
universalIdentifier: '4ec0391d-18d5-411c-b2f3-266ddc1c3ef7',
displayName: 'Test App',
+ functionRoleUniversalIdentifier: '68bb56f3-8300-4cb5-8cc3-8da9ee66f1b2',
};
const validObjectExtension: ObjectExtensionManifest = {
diff --git a/packages/twenty-shared/src/application/applicationType.ts b/packages/twenty-shared/src/application/applicationType.ts
index 20f36cefb2..78fe3bfddd 100644
--- a/packages/twenty-shared/src/application/applicationType.ts
+++ b/packages/twenty-shared/src/application/applicationType.ts
@@ -2,9 +2,9 @@ import { type ApplicationVariables } from '@/application';
import { type SyncableEntityOptions } from '@/application/syncableEntityOptionsType';
export type Application = SyncableEntityOptions & {
+ functionRoleUniversalIdentifier: string;
displayName?: string;
description?: string;
icon?: string;
applicationVariables?: ApplicationVariables;
- functionRoleUniversalIdentifier?: string;
};
diff --git a/packages/twenty-shared/src/application/relationFieldManifestType.ts b/packages/twenty-shared/src/application/relationFieldManifestType.ts
index 7ad0e610c2..7b3601878a 100644
--- a/packages/twenty-shared/src/application/relationFieldManifestType.ts
+++ b/packages/twenty-shared/src/application/relationFieldManifestType.ts
@@ -1,17 +1,13 @@
-import { type SyncableEntityOptions } from '@/application/syncableEntityOptionsType';
+import { type FieldManifest } from '@/application/fieldManifestType';
import { type FieldMetadataType } from '@/types';
import { type RelationOnDeleteAction } from '@/types/RelationOnDeleteAction.type';
import { type RelationType } from '@/types/RelationType';
-export type RelationFieldManifest = SyncableEntityOptions & {
- name: string;
- label: string;
- description?: string;
- icon?: string;
- relationType: RelationType;
- targetObjectUniversalIdentifier: string;
- targetFieldLabel: string;
- targetFieldIcon?: string;
- onDelete?: RelationOnDeleteAction;
- type: FieldMetadataType.RELATION;
-};
+export type RelationFieldManifest =
+ FieldManifest & {
+ relationType: RelationType;
+ targetObjectUniversalIdentifier: string;
+ targetFieldLabel: string;
+ targetFieldIcon?: string;
+ onDelete?: RelationOnDeleteAction;
+ };