Compare commits

..
Author SHA1 Message Date
a9ff1a9d3c Fix server variable not shown (#20799)
## Before

<img width="1502" height="675" alt="image"
src="https://github.com/user-attachments/assets/b64b24b4-11a5-4f6b-a3aa-c77108f22e9d"
/>

## After

<img width="1262" height="593" alt="image"
src="https://github.com/user-attachments/assets/42d662b4-2ec6-4ad4-9d19-58f25f52475c"
/>

---------

Co-authored-by: ehconitin <nitinkoche03@gmail.com>
2026-05-21 13:43:05 +00:00
11 changed files with 217 additions and 188 deletions
@@ -1764,6 +1764,18 @@ type WorkspaceUrls {
subdomainUrl: String!
}
type ApplicationRegistrationVariableDTO {
id: UUID!
key: String!
value: String
description: String!
isSecret: Boolean!
isRequired: Boolean!
isFilled: Boolean!
createdAt: DateTime!
updatedAt: DateTime!
}
type BillingTrialPeriod {
duration: Float!
isCreditCardRequired: Boolean!
@@ -1968,18 +1980,6 @@ type RotateClientSecret {
clientSecret: String!
}
type ApplicationRegistrationVariableDTO {
id: UUID!
key: String!
value: String
description: String!
isSecret: Boolean!
isRequired: Boolean!
isFilled: Boolean!
createdAt: DateTime!
updatedAt: DateTime!
}
type Relation {
type: RelationType!
sourceObjectMetadata: Object!
@@ -1401,6 +1401,19 @@ export interface WorkspaceUrls {
__typename: 'WorkspaceUrls'
}
export interface ApplicationRegistrationVariableDTO {
id: Scalars['UUID']
key: Scalars['String']
value?: Scalars['String']
description: Scalars['String']
isSecret: Scalars['Boolean']
isRequired: Scalars['Boolean']
isFilled: Scalars['Boolean']
createdAt: Scalars['DateTime']
updatedAt: Scalars['DateTime']
__typename: 'ApplicationRegistrationVariableDTO'
}
export interface BillingTrialPeriod {
duration: Scalars['Float']
isCreditCardRequired: Scalars['Boolean']
@@ -1609,19 +1622,6 @@ export interface RotateClientSecret {
__typename: 'RotateClientSecret'
}
export interface ApplicationRegistrationVariableDTO {
id: Scalars['UUID']
key: Scalars['String']
value?: Scalars['String']
description: Scalars['String']
isSecret: Scalars['Boolean']
isRequired: Scalars['Boolean']
isFilled: Scalars['Boolean']
createdAt: Scalars['DateTime']
updatedAt: Scalars['DateTime']
__typename: 'ApplicationRegistrationVariableDTO'
}
export interface Relation {
type: RelationType
sourceObjectMetadata: Object
@@ -4332,6 +4332,20 @@ export interface WorkspaceUrlsGenqlSelection{
__scalar?: boolean | number
}
export interface ApplicationRegistrationVariableDTOGenqlSelection{
id?: boolean | number
key?: boolean | number
value?: boolean | number
description?: boolean | number
isSecret?: boolean | number
isRequired?: boolean | number
isFilled?: boolean | number
createdAt?: boolean | number
updatedAt?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface BillingTrialPeriodGenqlSelection{
duration?: boolean | number
isCreditCardRequired?: boolean | number
@@ -4553,20 +4567,6 @@ export interface RotateClientSecretGenqlSelection{
__scalar?: boolean | number
}
export interface ApplicationRegistrationVariableDTOGenqlSelection{
id?: boolean | number
key?: boolean | number
value?: boolean | number
description?: boolean | number
isSecret?: boolean | number
isRequired?: boolean | number
isFilled?: boolean | number
createdAt?: boolean | number
updatedAt?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface RelationGenqlSelection{
type?: boolean | number
sourceObjectMetadata?: ObjectGenqlSelection
@@ -7183,6 +7183,14 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
const ApplicationRegistrationVariableDTO_possibleTypes: string[] = ['ApplicationRegistrationVariableDTO']
export const isApplicationRegistrationVariableDTO = (obj?: { __typename?: any } | null): obj is ApplicationRegistrationVariableDTO => {
if (!obj?.__typename) throw new Error('__typename is missing in "isApplicationRegistrationVariableDTO"')
return ApplicationRegistrationVariableDTO_possibleTypes.includes(obj.__typename)
}
const BillingTrialPeriod_possibleTypes: string[] = ['BillingTrialPeriod']
export const isBillingTrialPeriod = (obj?: { __typename?: any } | null): obj is BillingTrialPeriod => {
if (!obj?.__typename) throw new Error('__typename is missing in "isBillingTrialPeriod"')
@@ -7367,14 +7375,6 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
const ApplicationRegistrationVariableDTO_possibleTypes: string[] = ['ApplicationRegistrationVariableDTO']
export const isApplicationRegistrationVariableDTO = (obj?: { __typename?: any } | null): obj is ApplicationRegistrationVariableDTO => {
if (!obj?.__typename) throw new Error('__typename is missing in "isApplicationRegistrationVariableDTO"')
return ApplicationRegistrationVariableDTO_possibleTypes.includes(obj.__typename)
}
const Relation_possibleTypes: string[] = ['Relation']
export const isRelation = (obj?: { __typename?: any } | null): obj is Relation => {
if (!obj?.__typename) throw new Error('__typename is missing in "isRelation"')
@@ -51,11 +51,11 @@ export default {
163,
167,
169,
173,
174,
181,
184,
187,
175,
182,
185,
188,
201,
226,
262,
@@ -3434,6 +3434,38 @@ export default {
1
]
},
"ApplicationRegistrationVariableDTO": {
"id": [
3
],
"key": [
1
],
"value": [
1
],
"description": [
1
],
"isSecret": [
6
],
"isRequired": [
6
],
"isFilled": [
6
],
"createdAt": [
4
],
"updatedAt": [
4
],
"__typename": [
1
]
},
"BillingTrialPeriod": {
"duration": [
11
@@ -3453,10 +3485,10 @@ export default {
1
],
"type": [
173
174
],
"status": [
174
175
],
"issuer": [
1
@@ -3469,7 +3501,7 @@ export default {
"SSOIdentityProviderStatus": {},
"AuthProviders": {
"sso": [
172
173
],
"google": [
6
@@ -3506,10 +3538,10 @@ export default {
3
],
"authProviders": [
175
176
],
"authBypassProviders": [
176
177
],
"logo": [
1
@@ -3557,7 +3589,7 @@ export default {
1
],
"modelFamily": [
181
182
],
"modelFamilyLabel": [
1
@@ -3572,7 +3604,7 @@ export default {
11
],
"nativeCapabilities": [
179
180
],
"isDeprecated": [
6
@@ -3608,7 +3640,7 @@ export default {
1
],
"trialPeriods": [
171
172
],
"__typename": [
1
@@ -3616,7 +3648,7 @@ export default {
},
"Support": {
"supportDriver": [
184
185
],
"supportFrontChatId": [
1
@@ -3642,7 +3674,7 @@ export default {
},
"Captcha": {
"provider": [
187
188
],
"siteKey": [
1
@@ -3679,7 +3711,7 @@ export default {
169
],
"metadata": [
189
190
],
"__typename": [
1
@@ -3704,13 +3736,13 @@ export default {
1
],
"authProviders": [
175
176
],
"billing": [
182
183
],
"aiModels": [
180
181
],
"signInPrefilled": [
6
@@ -3731,25 +3763,25 @@ export default {
6
],
"support": [
183
184
],
"isAttachmentPreviewEnabled": [
6
],
"sentry": [
185
],
"captcha": [
186
],
"captcha": [
187
],
"api": [
188
189
],
"canManageFeatureFlags": [
6
],
"publicFeatureFlags": [
190
191
],
"isMicrosoftMessagingEnabled": [
6
@@ -3788,7 +3820,7 @@ export default {
6
],
"maintenance": [
191
192
],
"__typename": [
1
@@ -3827,7 +3859,7 @@ export default {
1
],
"versionDistribution": [
194
195
],
"__typename": [
1
@@ -3872,38 +3904,6 @@ export default {
1
]
},
"ApplicationRegistrationVariableDTO": {
"id": [
3
],
"key": [
1
],
"value": [
1
],
"description": [
1
],
"isSecret": [
6
],
"isRequired": [
6
],
"isFilled": [
6
],
"createdAt": [
4
],
"updatedAt": [
4
],
"__typename": [
1
]
},
"Relation": {
"type": [
201
@@ -4095,7 +4095,7 @@ export default {
3
],
"type": [
173
174
],
"issuer": [
1
@@ -4104,7 +4104,7 @@ export default {
1
],
"status": [
174
175
],
"__typename": [
1
@@ -4123,7 +4123,7 @@ export default {
},
"FindAvailableSSOIDP": {
"type": [
173
174
],
"id": [
3
@@ -4135,7 +4135,7 @@ export default {
1
],
"status": [
174
175
],
"workspace": [
218
@@ -4149,7 +4149,7 @@ export default {
3
],
"type": [
173
174
],
"issuer": [
1
@@ -4158,7 +4158,7 @@ export default {
1
],
"status": [
174
175
],
"__typename": [
1
@@ -4166,7 +4166,7 @@ export default {
},
"SSOConnection": {
"type": [
173
174
],
"id": [
3
@@ -4178,7 +4178,7 @@ export default {
1
],
"status": [
174
175
],
"__typename": [
1
@@ -4529,13 +4529,13 @@ export default {
},
"UsageAnalytics": {
"usageByUser": [
193
194
],
"usageByOperationType": [
193
194
],
"usageByModel": [
193
194
],
"timeSeries": [
251
@@ -6293,7 +6293,7 @@ export default {
}
],
"findApplicationRegistrationByClientId": [
197,
198,
{
"clientId": [
1,
@@ -6323,7 +6323,7 @@ export default {
}
],
"findApplicationRegistrationStats": [
195,
196,
{
"id": [
1,
@@ -6332,7 +6332,7 @@ export default {
}
],
"findApplicationRegistrationVariables": [
199,
171,
{
"applicationRegistrationId": [
1,
@@ -6356,7 +6356,7 @@ export default {
75
],
"getPublicWorkspaceDataByDomain": [
177,
178,
{
"origin": [
1
@@ -6364,7 +6364,7 @@ export default {
}
],
"getPublicWorkspaceDataById": [
178,
179,
{
"id": [
3,
@@ -8197,7 +8197,7 @@ export default {
}
],
"createApplicationRegistration": [
196,
197,
{
"input": [
443,
@@ -8224,7 +8224,7 @@ export default {
}
],
"rotateApplicationRegistrationClientSecret": [
198,
199,
{
"id": [
1,
@@ -11010,7 +11010,7 @@ export default {
3
],
"status": [
174
175
],
"__typename": [
1
@@ -195,6 +195,19 @@ export enum ApplicationRegistrationSourceType {
TARBALL = 'TARBALL'
}
export type ApplicationRegistrationVariableDto = {
__typename?: 'ApplicationRegistrationVariableDTO';
createdAt: Scalars['DateTime'];
description: Scalars['String'];
id: Scalars['UUID'];
isFilled: Scalars['Boolean'];
isRequired: Scalars['Boolean'];
isSecret: Scalars['Boolean'];
key: Scalars['String'];
updatedAt: Scalars['DateTime'];
value?: Maybe<Scalars['String']>;
};
export enum ConfigSource {
DATABASE = 'DATABASE',
DEFAULT = 'DEFAULT',
@@ -495,6 +508,7 @@ export type Query = {
__typename?: 'Query';
adminPanelRecentUsers: Array<AdminPanelRecentUser>;
adminPanelTopWorkspaces: Array<AdminPanelTopWorkspace>;
findAdminApplicationRegistrationVariables: Array<ApplicationRegistrationVariableDto>;
findAllApplicationRegistrations: Array<ApplicationRegistration>;
findOneAdminApplicationRegistration: ApplicationRegistration;
getAdminAiModels: AdminAiModels;
@@ -531,6 +545,11 @@ export type QueryAdminPanelTopWorkspacesArgs = {
};
export type QueryFindAdminApplicationRegistrationVariablesArgs = {
applicationRegistrationId: Scalars['String'];
};
export type QueryFindOneAdminApplicationRegistrationArgs = {
id: Scalars['String'];
};
@@ -904,6 +923,13 @@ export type GetModelsDevSuggestionsQueryVariables = Exact<{
export type GetModelsDevSuggestionsQuery = { __typename?: 'Query', getModelsDevSuggestions: Array<{ __typename?: 'ModelsDevModelSuggestion', modelId: string, name: string, inputCostPerMillionTokens: number, outputCostPerMillionTokens: number, cachedInputCostPerMillionTokens?: number | null, cacheCreationCostPerMillionTokens?: number | null, contextWindowTokens: number, maxOutputTokens: number, modalities: Array<string>, supportsReasoning: boolean }> };
export type FindAdminApplicationRegistrationVariablesQueryVariables = Exact<{
applicationRegistrationId: Scalars['String'];
}>;
export type FindAdminApplicationRegistrationVariablesQuery = { __typename?: 'Query', findAdminApplicationRegistrationVariables: Array<{ __typename?: 'ApplicationRegistrationVariableDTO', id: string, key: string, value?: string | null, description: string, isSecret: boolean, isRequired: boolean, isFilled: boolean, createdAt: string, updatedAt: string }> };
export type FindAllApplicationRegistrationsQueryVariables = Exact<{ [key: string]: never; }>;
@@ -1128,6 +1154,7 @@ export const GetAdminAiUsageByWorkspaceDocument = {"kind":"Document","definition
export const GetAiProvidersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAiProviders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getAiProviders"}}]}}]} as unknown as DocumentNode<GetAiProvidersQuery, GetAiProvidersQueryVariables>;
export const GetModelsDevProvidersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModelsDevProviders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getModelsDevProviders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"modelCount"}},{"kind":"Field","name":{"kind":"Name","value":"npm"}}]}}]}}]} as unknown as DocumentNode<GetModelsDevProvidersQuery, GetModelsDevProvidersQueryVariables>;
export const GetModelsDevSuggestionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModelsDevSuggestions"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"providerType"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getModelsDevSuggestions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"providerType"},"value":{"kind":"Variable","name":{"kind":"Name","value":"providerType"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"modelId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"inputCostPerMillionTokens"}},{"kind":"Field","name":{"kind":"Name","value":"outputCostPerMillionTokens"}},{"kind":"Field","name":{"kind":"Name","value":"cachedInputCostPerMillionTokens"}},{"kind":"Field","name":{"kind":"Name","value":"cacheCreationCostPerMillionTokens"}},{"kind":"Field","name":{"kind":"Name","value":"contextWindowTokens"}},{"kind":"Field","name":{"kind":"Name","value":"maxOutputTokens"}},{"kind":"Field","name":{"kind":"Name","value":"modalities"}},{"kind":"Field","name":{"kind":"Name","value":"supportsReasoning"}}]}}]}}]} as unknown as DocumentNode<GetModelsDevSuggestionsQuery, GetModelsDevSuggestionsQueryVariables>;
export const FindAdminApplicationRegistrationVariablesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindAdminApplicationRegistrationVariables"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"applicationRegistrationId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findAdminApplicationRegistrationVariables"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"applicationRegistrationId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"applicationRegistrationId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"value"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isSecret"}},{"kind":"Field","name":{"kind":"Name","value":"isRequired"}},{"kind":"Field","name":{"kind":"Name","value":"isFilled"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]}}]} as unknown as DocumentNode<FindAdminApplicationRegistrationVariablesQuery, FindAdminApplicationRegistrationVariablesQueryVariables>;
export const FindAllApplicationRegistrationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindAllApplicationRegistrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findAllApplicationRegistrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationRegistrationFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationRegistrationFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApplicationRegistration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"logoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthClientId"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthRedirectUris"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthScopes"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"isPreInstalled"}},{"kind":"Field","name":{"kind":"Name","value":"isConfigured"}},{"kind":"Field","name":{"kind":"Name","value":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode<FindAllApplicationRegistrationsQuery, FindAllApplicationRegistrationsQueryVariables>;
export const CreateDatabaseConfigVariableDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateDatabaseConfigVariable"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"value"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"JSON"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createDatabaseConfigVariable"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}},{"kind":"Argument","name":{"kind":"Name","value":"value"},"value":{"kind":"Variable","name":{"kind":"Name","value":"value"}}}]}]}}]} as unknown as DocumentNode<CreateDatabaseConfigVariableMutation, CreateDatabaseConfigVariableMutationVariables>;
export const DeleteDatabaseConfigVariableDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteDatabaseConfigVariable"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteDatabaseConfigVariable"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}]}]}}]} as unknown as DocumentNode<DeleteDatabaseConfigVariableMutation, DeleteDatabaseConfigVariableMutationVariables>;
@@ -129,50 +129,4 @@ describe('usePageLayoutHandleLayoutChange', () => {
expect(Object.keys(result.current.layouts)).toHaveLength(0);
});
it('should not rewrite tab layouts when new layout is identical', () => {
const { result } = renderHook(
() => ({
handler: usePageLayoutHandleLayoutChange({
pageLayoutId: PAGE_LAYOUT_TEST_INSTANCE_ID,
tabListInstanceId: getTabListInstanceIdFromPageLayoutId(
PAGE_LAYOUT_TEST_INSTANCE_ID,
),
}),
layouts: useAtomComponentStateValue(
pageLayoutCurrentLayoutsComponentState,
PAGE_LAYOUT_TEST_INSTANCE_ID,
),
setActiveTabId: useSetAtom(
activeTabIdComponentState.atomFamily({
instanceId: `${PAGE_LAYOUT_TEST_INSTANCE_ID}-tab-list`,
}),
),
}),
{
wrapper: PageLayoutTestWrapper,
},
);
act(() => {
result.current.setActiveTabId('tab-1');
});
const newLayouts = {
desktop: [{ i: 'widget-1', x: 1, y: 0, w: 2, h: 2 }],
mobile: [{ i: 'widget-1', x: 0, y: 0, w: 1, h: 2 }],
};
act(() => {
result.current.handler.handleLayoutChange([], newLayouts);
});
const firstStoredLayouts = result.current.layouts['tab-1'];
act(() => {
result.current.handler.handleLayoutChange([], newLayouts);
});
expect(result.current.layouts['tab-1']).toBe(firstStoredLayouts);
});
});
@@ -10,10 +10,6 @@ import { useCallback } from 'react';
import { type Layout, type Layouts } from 'react-grid-layout';
import { isDefined } from 'twenty-shared/utils';
const areLayoutsEqual = (firstLayouts: Layouts, secondLayouts: Layouts) => {
return JSON.stringify(firstLayouts) === JSON.stringify(secondLayouts);
};
export const usePageLayoutHandleLayoutChange = ({
pageLayoutId: pageLayoutIdFromProps,
tabListInstanceId,
@@ -49,18 +45,11 @@ export const usePageLayoutHandleLayoutChange = ({
if (!isDefined(activeTabId)) return;
const currentTabLayouts = store.get(pageLayoutCurrentLayoutsState);
const activeTabLayouts = currentTabLayouts[activeTabId];
const hasLayoutChanged =
!isDefined(activeTabLayouts) ||
!areLayoutsEqual(activeTabLayouts, allLayouts);
if (hasLayoutChanged) {
store.set(pageLayoutCurrentLayoutsState, {
...currentTabLayouts,
[activeTabId]: structuredClone(allLayouts),
});
}
store.set(pageLayoutCurrentLayoutsState, {
...currentTabLayouts,
[activeTabId]: structuredClone(allLayouts),
});
const pageLayoutDraft = store.get(pageLayoutDraftState);
@@ -0,0 +1,21 @@
import { gql } from '@apollo/client';
export const FIND_ADMIN_APPLICATION_REGISTRATION_VARIABLES = gql`
query FindAdminApplicationRegistrationVariables(
$applicationRegistrationId: String!
) {
findAdminApplicationRegistrationVariables(
applicationRegistrationId: $applicationRegistrationId
) {
id
key
value
description
isSecret
isRequired
isFilled
createdAt
updatedAt
}
}
`;
@@ -66,6 +66,7 @@ export const SettingsAdminApplicationRegistrationDetail = () => {
return (
<SettingsApplicationRegistrationConfigTab
registration={registration}
fromAdmin
/>
);
case 'oauth':
@@ -1,31 +1,47 @@
import type { ApplicationRegistrationData } from '~/pages/settings/applications/tabs/types/ApplicationRegistrationData';
import { useQuery } from '@apollo/client/react';
import { FindApplicationRegistrationVariablesDocument } from '~/generated-metadata/graphql';
import { FindAdminApplicationRegistrationVariablesDocument } from '~/generated-admin/graphql';
import { Section } from 'twenty-ui/layout';
import { H2Title, Status } from 'twenty-ui/display';
import { useLingui } from '@lingui/react/macro';
import { getSettingsPath } from 'twenty-shared/utils';
import { SettingsPath } from 'twenty-shared/types';
import { ConfigVariableTable } from '@/settings/config-variables/components/ConfigVariableTable';
import { useApolloAdminClient } from '@/settings/admin-panel/apollo/hooks/useApolloAdminClient';
export const SettingsApplicationRegistrationConfigTab = ({
registration,
fromAdmin,
}: {
registration: ApplicationRegistrationData;
fromAdmin?: boolean;
}) => {
const { t } = useLingui();
const apolloAdminClient = useApolloAdminClient();
const applicationRegistrationId = registration.id;
const { data: variablesData } = useQuery(
const { data: workspaceVariablesData } = useQuery(
FindApplicationRegistrationVariablesDocument,
{
variables: { applicationRegistrationId },
skip: !applicationRegistrationId,
skip: !applicationRegistrationId || fromAdmin === true,
},
);
const variables = variablesData?.findApplicationRegistrationVariables ?? [];
const { data: adminVariablesData } = useQuery(
FindAdminApplicationRegistrationVariablesDocument,
{
client: apolloAdminClient,
variables: { applicationRegistrationId },
skip: !applicationRegistrationId || fromAdmin !== true,
},
);
const variables = fromAdmin
? (adminVariablesData?.findAdminApplicationRegistrationVariables ?? [])
: (workspaceVariablesData?.findApplicationRegistrationVariables ?? []);
const configVariables = variables.map((variable) => ({
name: variable.key,
@@ -44,6 +44,8 @@ import { AdminPanelSigningKeyService } from 'src/engine/core-modules/admin-panel
import { AdminPanelStatisticsService } from 'src/engine/core-modules/admin-panel/services/admin-panel-statistics.service';
import { AdminPanelUserLookupService } from 'src/engine/core-modules/admin-panel/services/admin-panel-user-lookup.service';
import { AdminPanelVersionService } from 'src/engine/core-modules/admin-panel/services/admin-panel-version.service';
import { ApplicationRegistrationVariableDTO } from 'src/engine/core-modules/application/application-registration-variable/dtos/application-registration-variable.dto';
import { ApplicationRegistrationVariableService } from 'src/engine/core-modules/application/application-registration-variable/application-registration-variable.service';
import { ApplicationRegistrationEntity } from 'src/engine/core-modules/application/application-registration/application-registration.entity';
import { ApplicationRegistrationService } from 'src/engine/core-modules/application/application-registration/application-registration.service';
import { AuthGraphqlApiExceptionFilter } from 'src/engine/core-modules/auth/filters/auth-graphql-api-exception.filter';
@@ -105,6 +107,7 @@ export class AdminPanelResolver {
private readonly adminPanelHealthService: AdminPanelHealthService,
private readonly adminPanelSigningKeyService: AdminPanelSigningKeyService,
private readonly applicationRegistrationService: ApplicationRegistrationService,
private readonly applicationRegistrationVariableService: ApplicationRegistrationVariableService,
private adminPanelQueueService: AdminPanelQueueService,
private featureFlagService: FeatureFlagService,
private readonly twentyConfigService: TwentyConfigService,
@@ -712,6 +715,16 @@ export class AdminPanelResolver {
return this.applicationRegistrationService.findOneByIdGlobal(id);
}
@UseGuards(AdminPanelGuard)
@Query(() => [ApplicationRegistrationVariableDTO])
async findAdminApplicationRegistrationVariables(
@Args('applicationRegistrationId') applicationRegistrationId: string,
): Promise<ApplicationRegistrationVariableDTO[]> {
return this.applicationRegistrationVariableService.findVariablesWithObfuscatedValuesGlobal(
applicationRegistrationId,
);
}
@UseGuards(AdminPanelGuard)
@Query(() => InstanceAndAllWorkspacesUpgradeStatusDTO)
async getInstanceAndAllWorkspacesUpgradeStatus(): Promise<InstanceAndAllWorkspacesUpgradeStatusDTO> {
@@ -35,6 +35,14 @@ export class ApplicationRegistrationVariableService {
workspaceId,
);
return this.findVariablesWithObfuscatedValuesGlobal(
applicationRegistrationId,
);
}
async findVariablesWithObfuscatedValuesGlobal(
applicationRegistrationId: string,
): Promise<ApplicationRegistrationVariableDTO[]> {
const variables = await this.variableRepository.find({
where: { applicationRegistrationId },
order: { key: 'ASC' },