Fix multi-workspace-registration (#19685)

## Before

<img width="1512" height="915" alt="image"
src="https://github.com/user-attachments/assets/5cb05f76-b672-404e-b31d-ca455802f97a"
/>


## After

<img width="1512" height="726" alt="image"
src="https://github.com/user-attachments/assets/58229c4c-3ac6-4428-9c4d-3586a2b9ee36"
/>
This commit is contained in:
martmull
2026-04-14 14:41:19 +02:00
committed by GitHub
parent 762de40c3d
commit b3354ab6e7
13 changed files with 210 additions and 56 deletions
@@ -3363,6 +3363,7 @@ type Query {
workspaceLookupAdminPanel(workspaceId: UUID!): UserLookup!
getAdminWorkspaceChatThreads(workspaceId: UUID!): [AdminWorkspaceChatThread!]!
getAdminChatThreadMessages(threadId: UUID!): AdminChatThreadMessages!
findOneAdminApplicationRegistration(id: String!): ApplicationRegistration!
getUsageAnalytics(input: UsageAnalyticsInput): UsageAnalytics!
getPostgresCredentials: PostgresCredentials
findManyPublicDomains: [PublicDomain!]!
@@ -2928,6 +2928,7 @@ export interface Query {
workspaceLookupAdminPanel: UserLookup
getAdminWorkspaceChatThreads: AdminWorkspaceChatThread[]
getAdminChatThreadMessages: AdminChatThreadMessages
findOneAdminApplicationRegistration: ApplicationRegistration
getUsageAnalytics: UsageAnalytics
getPostgresCredentials?: PostgresCredentials
findManyPublicDomains: PublicDomain[]
@@ -6294,6 +6295,7 @@ export interface QueryGenqlSelection{
workspaceLookupAdminPanel?: (UserLookupGenqlSelection & { __args: {workspaceId: Scalars['UUID']} })
getAdminWorkspaceChatThreads?: (AdminWorkspaceChatThreadGenqlSelection & { __args: {workspaceId: Scalars['UUID']} })
getAdminChatThreadMessages?: (AdminChatThreadMessagesGenqlSelection & { __args: {threadId: Scalars['UUID']} })
findOneAdminApplicationRegistration?: (ApplicationRegistrationGenqlSelection & { __args: {id: Scalars['String']} })
getUsageAnalytics?: (UsageAnalyticsGenqlSelection & { __args?: {input?: (UsageAnalyticsInput | null)} })
getPostgresCredentials?: PostgresCredentialsGenqlSelection
findManyPublicDomains?: PublicDomainGenqlSelection
@@ -7163,6 +7163,15 @@ export default {
]
}
],
"findOneAdminApplicationRegistration": [
7,
{
"id": [
1,
"String!"
]
}
],
"getUsageAnalytics": [
283,
{
@@ -4412,6 +4412,7 @@ export type Query = {
findManyMarketplaceApps: Array<MarketplaceApp>;
findManyPublicDomains: Array<PublicDomain>;
findMarketplaceAppDetail: MarketplaceAppDetail;
findOneAdminApplicationRegistration: ApplicationRegistration;
findOneAgent: Agent;
findOneApplication: Application;
findOneApplicationRegistration: ApplicationRegistration;
@@ -4625,6 +4626,11 @@ export type QueryFindMarketplaceAppDetailArgs = {
};
export type QueryFindOneAdminApplicationRegistrationArgs = {
id: Scalars['String'];
};
export type QueryFindOneAgentArgs = {
input: AgentIdInput;
};
@@ -7499,6 +7505,13 @@ export type AdminPanelTopWorkspacesQueryVariables = Exact<{
export type AdminPanelTopWorkspacesQuery = { __typename?: 'Query', adminPanelTopWorkspaces: Array<{ __typename?: 'AdminPanelTopWorkspace', id: string, name: string, totalUsers: number, subdomain: string }> };
export type FindOneAdminApplicationRegistrationQueryVariables = Exact<{
id: Scalars['String'];
}>;
export type FindOneAdminApplicationRegistrationQuery = { __typename?: 'Query', findOneAdminApplicationRegistration: { __typename?: 'ApplicationRegistration', id: string, universalIdentifier: string, name: string, oAuthClientId: string, oAuthRedirectUris: Array<string>, oAuthScopes: Array<string>, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, isListed: boolean, isFeatured: boolean, ownerWorkspaceId?: string | null, createdAt: string, updatedAt: string } };
export type GetAdminChatThreadMessagesQueryVariables = Exact<{
threadId: Scalars['UUID'];
}>;
@@ -8710,6 +8723,7 @@ export const GetDatabaseConfigVariableDocument = {"kind":"Document","definitions
export const UpdateWorkspaceFeatureFlagDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateWorkspaceFeatureFlag"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"featureFlag"}},"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":"Boolean"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateWorkspaceFeatureFlag"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workspaceId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}}},{"kind":"Argument","name":{"kind":"Name","value":"featureFlag"},"value":{"kind":"Variable","name":{"kind":"Name","value":"featureFlag"}}},{"kind":"Argument","name":{"kind":"Name","value":"value"},"value":{"kind":"Variable","name":{"kind":"Name","value":"value"}}}]}]}}]} as unknown as DocumentNode<UpdateWorkspaceFeatureFlagMutation, UpdateWorkspaceFeatureFlagMutationVariables>;
export const AdminPanelRecentUsersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"AdminPanelRecentUsers"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"searchTerm"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"adminPanelRecentUsers"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"searchTerm"},"value":{"kind":"Variable","name":{"kind":"Name","value":"searchTerm"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"email"}},{"kind":"Field","name":{"kind":"Name","value":"firstName"}},{"kind":"Field","name":{"kind":"Name","value":"lastName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"workspaceName"}},{"kind":"Field","name":{"kind":"Name","value":"workspaceId"}}]}}]}}]} as unknown as DocumentNode<AdminPanelRecentUsersQuery, AdminPanelRecentUsersQueryVariables>;
export const AdminPanelTopWorkspacesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"AdminPanelTopWorkspaces"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"searchTerm"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"adminPanelTopWorkspaces"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"searchTerm"},"value":{"kind":"Variable","name":{"kind":"Name","value":"searchTerm"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"totalUsers"}},{"kind":"Field","name":{"kind":"Name","value":"subdomain"}}]}}]}}]} as unknown as DocumentNode<AdminPanelTopWorkspacesQuery, AdminPanelTopWorkspacesQueryVariables>;
export const FindOneAdminApplicationRegistrationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindOneAdminApplicationRegistration"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findOneAdminApplicationRegistration"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"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":"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":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode<FindOneAdminApplicationRegistrationQuery, FindOneAdminApplicationRegistrationQueryVariables>;
export const GetAdminChatThreadMessagesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAdminChatThreadMessages"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"threadId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getAdminChatThreadMessages"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"threadId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"threadId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"thread"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"totalInputTokens"}},{"kind":"Field","name":{"kind":"Name","value":"totalOutputTokens"}},{"kind":"Field","name":{"kind":"Name","value":"conversationSize"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"messages"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"parts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"textContent"}},{"kind":"Field","name":{"kind":"Name","value":"toolName"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}}]}}]}}]}}]} as unknown as DocumentNode<GetAdminChatThreadMessagesQuery, GetAdminChatThreadMessagesQueryVariables>;
export const GetAdminWorkspaceChatThreadsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAdminWorkspaceChatThreads"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getAdminWorkspaceChatThreads"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workspaceId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"totalInputTokens"}},{"kind":"Field","name":{"kind":"Name","value":"totalOutputTokens"}},{"kind":"Field","name":{"kind":"Name","value":"conversationSize"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]}}]} as unknown as DocumentNode<GetAdminWorkspaceChatThreadsQuery, GetAdminWorkspaceChatThreadsQueryVariables>;
export const GetVersionInfoDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetVersionInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"versionInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currentVersion"}},{"kind":"Field","name":{"kind":"Name","value":"latestVersion"}}]}}]}}]} as unknown as DocumentNode<GetVersionInfoQuery, GetVersionInfoQueryVariables>;
@@ -180,6 +180,14 @@ const SettingsApplicationDetails = lazy(() =>
),
);
const SettingsAdminApplicationRegistrationDetail = lazy(() =>
import(
'~/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail'
).then((module) => ({
default: module.SettingsAdminApplicationRegistrationDetail,
})),
);
const SettingsAvailableApplicationDetails = lazy(() =>
import(
'~/pages/settings/applications/SettingsAvailableApplicationDetails'
@@ -802,6 +810,10 @@ export const SettingsRoutes = ({ isAdminPageEnabled }: SettingsRoutesProps) => (
path={SettingsPath.AdminPanelWorkspaceDetail}
element={<SettingsAdminWorkspaceDetail />}
/>
<Route
path={SettingsPath.AdminPanelApplicationRegistrationDetail}
element={<SettingsAdminApplicationRegistrationDetail />}
/>
<Route
path={SettingsPath.AdminPanelWorkspaceChatThread}
element={<SettingsAdminWorkspaceChatThread />}
@@ -80,7 +80,7 @@ export const SettingsAdminApps = () => {
<UndecoratedLink
key={registration.id}
to={getSettingsPath(
SettingsPath.ApplicationRegistrationDetail,
SettingsPath.AdminPanelApplicationRegistrationDetail,
{ applicationRegistrationId: registration.id },
)}
fullWidth
@@ -0,0 +1,9 @@
import { SettingsPath } from 'twenty-shared/types';
import { getSettingsPath } from 'twenty-shared/utils';
export const APPLICATION_REGISTRATION_ADMIN_PATH = getSettingsPath(
SettingsPath.AdminPanel,
undefined,
undefined,
'apps',
);
@@ -0,0 +1,12 @@
import { gql } from '@apollo/client';
import { APPLICATION_REGISTRATION_FRAGMENT } from '@/settings/application-registrations/graphql/fragments/applicationRegistrationFragment';
export const FIND_ONE_ADMIN_APPLICATION_REGISTRATION = gql`
query FindOneAdminApplicationRegistration($id: String!) {
findOneAdminApplicationRegistration(id: $id) {
...ApplicationRegistrationFragment
}
}
${APPLICATION_REGISTRATION_FRAGMENT}
`;
@@ -0,0 +1,60 @@
import { useParams } from 'react-router-dom';
import { useQuery } from '@apollo/client/react';
import { FindOneAdminApplicationRegistrationDocument } from '~/generated-metadata/graphql';
import type { ApplicationRegistrationData } from '~/pages/settings/applications/tabs/types/ApplicationRegistrationData';
import { getSettingsPath, isDefined } from 'twenty-shared/utils';
import { SettingsApplicationRegistrationContent } from '~/pages/settings/applications/components/SettingsApplicationRegistrationContent';
import { SettingsPath } from 'twenty-shared/types';
import { useLingui } from '@lingui/react/macro';
import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBarContainer';
import { APPLICATION_REGISTRATION_ADMIN_PATH } from '@/settings/admin-panel/apps/constants/ApplicationRegistrationAdminPath';
export const SettingsAdminApplicationRegistrationDetail = () => {
const { t } = useLingui();
const { applicationRegistrationId = '' } = useParams<{
applicationRegistrationId: string;
}>();
const { data, loading } = useQuery(
FindOneAdminApplicationRegistrationDocument,
{
variables: { id: applicationRegistrationId },
skip: !applicationRegistrationId,
},
);
const registration = data?.findOneAdminApplicationRegistration as
| ApplicationRegistrationData
| undefined;
if (loading || !isDefined(registration)) {
return null;
}
return (
<SubMenuTopBarContainer
title={registration.name}
links={[
{
children: t`Other`,
href: getSettingsPath(SettingsPath.AdminPanel),
},
{
children: t`Admin Panel`,
href: getSettingsPath(SettingsPath.AdminPanel),
},
{
children: t`App registrations`,
href: APPLICATION_REGISTRATION_ADMIN_PATH,
},
{ children: registration.name },
]}
>
<SettingsApplicationRegistrationContent
registration={registration}
hasActiveInstalls={false}
/>
</SubMenuTopBarContainer>
);
};
@@ -1,37 +1,23 @@
import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer';
import { TabList } from '@/ui/layout/tab-list/components/TabList';
import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBarContainer';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useQuery } from '@apollo/client/react';
import { useLingui } from '@lingui/react/macro';
import { useParams } from 'react-router-dom';
import { SettingsPath } from 'twenty-shared/types';
import { getSettingsPath, isDefined } from 'twenty-shared/utils';
import { IconInfoCircle, IconKey, IconWorld } from 'twenty-ui/display';
import {
FindApplicationRegistrationStatsDocument,
FindOneApplicationRegistrationDocument,
} from '~/generated-metadata/graphql';
import { type ApplicationRegistrationData } from '~/pages/settings/applications/tabs/types/ApplicationRegistrationData';
import { SettingsApplicationRegistrationGeneralTab } from '~/pages/settings/applications/tabs/SettingsApplicationRegistrationGeneralTab';
import { SettingsApplicationRegistrationOAuthTab } from '~/pages/settings/applications/tabs/SettingsApplicationRegistrationOAuthTab';
import { SettingsApplicationRegistrationDistributionTab } from '~/pages/settings/applications/tabs/SettingsApplicationRegistrationDistributionTab';
const REGISTRATION_DETAIL_TAB_LIST_ID =
'application-registration-detail-tab-list';
import { SettingsApplicationRegistrationContent } from '~/pages/settings/applications/components/SettingsApplicationRegistrationContent';
import { useLingui } from '@lingui/react/macro';
export const SettingsApplicationRegistrationDetails = () => {
const { t } = useLingui();
const { applicationRegistrationId = '' } = useParams<{
applicationRegistrationId: string;
}>();
const activeTabId = useAtomComponentStateValue(
activeTabIdComponentState,
REGISTRATION_DETAIL_TAB_LIST_ID,
);
const { data, loading } = useQuery(FindOneApplicationRegistrationDocument, {
variables: { id: applicationRegistrationId },
skip: !applicationRegistrationId,
@@ -48,44 +34,15 @@ export const SettingsApplicationRegistrationDetails = () => {
const registration = data?.findOneApplicationRegistration as
| ApplicationRegistrationData
| undefined;
const stats = statsData?.findApplicationRegistrationStats;
const hasActiveInstalls = (stats?.activeInstalls ?? 0) > 0;
if (loading || !isDefined(registration)) {
return null;
}
const tabs = [
{ id: 'general', title: t`General`, Icon: IconInfoCircle },
{ id: 'oauth', title: t`OAuth`, Icon: IconKey },
{ id: 'distribution', title: t`Distribution`, Icon: IconWorld },
];
const renderActiveTabContent = () => {
switch (activeTabId) {
case 'oauth':
return (
<SettingsApplicationRegistrationOAuthTab
registration={registration}
/>
);
case 'distribution':
return (
<SettingsApplicationRegistrationDistributionTab
registration={registration}
/>
);
case 'general':
default:
return (
<SettingsApplicationRegistrationGeneralTab
registration={registration}
hasActiveInstalls={hasActiveInstalls}
/>
);
}
};
return (
<SubMenuTopBarContainer
title={registration.name}
@@ -101,13 +58,10 @@ export const SettingsApplicationRegistrationDetails = () => {
{ children: registration.name },
]}
>
<SettingsPageContainer>
<TabList
tabs={tabs}
componentInstanceId={REGISTRATION_DETAIL_TAB_LIST_ID}
/>
{renderActiveTabContent()}
</SettingsPageContainer>
<SettingsApplicationRegistrationContent
registration={registration}
hasActiveInstalls={hasActiveInstalls}
/>
</SubMenuTopBarContainer>
);
};
@@ -0,0 +1,71 @@
import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer';
import { TabList } from '@/ui/layout/tab-list/components/TabList';
import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useLingui } from '@lingui/react/macro';
import { IconInfoCircle, IconKey, IconWorld } from 'twenty-ui/display';
import { type ApplicationRegistrationData } from '~/pages/settings/applications/tabs/types/ApplicationRegistrationData';
import { SettingsApplicationRegistrationGeneralTab } from '~/pages/settings/applications/tabs/SettingsApplicationRegistrationGeneralTab';
import { SettingsApplicationRegistrationOAuthTab } from '~/pages/settings/applications/tabs/SettingsApplicationRegistrationOAuthTab';
import { SettingsApplicationRegistrationDistributionTab } from '~/pages/settings/applications/tabs/SettingsApplicationRegistrationDistributionTab';
const REGISTRATION_DETAIL_TAB_LIST_ID =
'application-registration-detail-tab-list';
type SettingsApplicationRegistrationContentProps = {
registration: ApplicationRegistrationData;
hasActiveInstalls: boolean;
};
export const SettingsApplicationRegistrationContent = ({
registration,
hasActiveInstalls,
}: SettingsApplicationRegistrationContentProps) => {
const { t } = useLingui();
const activeTabId = useAtomComponentStateValue(
activeTabIdComponentState,
REGISTRATION_DETAIL_TAB_LIST_ID,
);
const tabs = [
{ id: 'general', title: t`General`, Icon: IconInfoCircle },
{ id: 'oauth', title: t`OAuth`, Icon: IconKey },
{ id: 'distribution', title: t`Distribution`, Icon: IconWorld },
];
const renderActiveTabContent = () => {
switch (activeTabId) {
case 'oauth':
return (
<SettingsApplicationRegistrationOAuthTab
registration={registration}
/>
);
case 'distribution':
return (
<SettingsApplicationRegistrationDistributionTab
registration={registration}
/>
);
case 'general':
default:
return (
<SettingsApplicationRegistrationGeneralTab
registration={registration}
hasActiveInstalls={hasActiveInstalls}
/>
);
}
};
return (
<SettingsPageContainer>
<TabList
tabs={tabs}
componentInstanceId={REGISTRATION_DETAIL_TAB_LIST_ID}
/>
{renderActiveTabContent()}
</SettingsPageContainer>
);
};
@@ -71,6 +71,7 @@ import { ModelsDevModelSuggestionDTO } from './dtos/models-dev-model-suggestion.
import { ModelsDevProviderSuggestionDTO } from './dtos/models-dev-provider-suggestion.dto';
import { QueueMetricsDataDTO } from './dtos/queue-metrics-data.dto';
import { SetMaintenanceModeInput } from './dtos/set-maintenance-mode.input';
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
@UsePipes(ResolverValidationPipe)
@MetadataResolver()
@@ -680,4 +681,12 @@ export class AdminPanelResolver {
): Promise<AdminChatThreadMessagesDTO> {
return this.adminChatService.getChatThreadMessages(threadId);
}
@UseGuards(AdminPanelGuard)
@Query(() => ApplicationRegistrationEntity)
async findOneAdminApplicationRegistration(
@Args('id') id: string,
): Promise<ApplicationRegistrationEntity> {
return this.applicationRegistrationService.findOneByIdGlobal(id);
}
}
@@ -71,6 +71,7 @@ export enum SettingsPath {
AdminPanelNewAiModel = 'admin-panel/ai/providers/:providerName/new-model',
AdminPanelUserDetail = 'admin-panel/users/:userId',
AdminPanelWorkspaceDetail = 'admin-panel/workspaces/:workspaceId',
AdminPanelApplicationRegistrationDetail = 'admin-panel/applications/registrations/:applicationRegistrationId',
AdminPanelWorkspaceChatThread = 'admin-panel/workspaces/:workspaceId/threads/:threadId',
Roles = 'roles',