diff --git a/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx b/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx index dee3dfea9..c77884b1a 100644 --- a/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx +++ b/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx @@ -431,15 +431,15 @@ export const SettingsRoutes = ({ element={} /> } /> } /> } /> theme.border.color.light}; @@ -55,7 +55,7 @@ export const SettingsApiKeysTable = () => { diff --git a/packages/twenty-front/src/modules/settings/developers/components/SettingsWebhooksTable.tsx b/packages/twenty-front/src/modules/settings/developers/components/SettingsWebhooksTable.tsx index 11321b99d..5d191f6ee 100644 --- a/packages/twenty-front/src/modules/settings/developers/components/SettingsWebhooksTable.tsx +++ b/packages/twenty-front/src/modules/settings/developers/components/SettingsWebhooksTable.tsx @@ -4,10 +4,12 @@ import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSi import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { SettingsDevelopersWebhookTableRow } from '@/settings/developers/components/SettingsDevelopersWebhookTableRow'; import { Webhook } from '@/settings/developers/types/webhook/Webhook'; +import { SettingsPath } from '@/types/SettingsPath'; import { Table } from '@/ui/layout/table/components/Table'; import { TableBody } from '@/ui/layout/table/components/TableBody'; import { TableHeader } from '@/ui/layout/table/components/TableHeader'; import { TableRow } from '@/ui/layout/table/components/TableRow'; +import { getSettingsPath } from '~/utils/navigation/getSettingsPath'; const StyledTableBody = styled(TableBody)` border-bottom: 1px solid ${({ theme }) => theme.border.color.light}; @@ -36,7 +38,9 @@ export const SettingsWebhooksTable = () => { ))} diff --git a/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx b/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx index 4cfc355ed..7b3e374dc 100644 --- a/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx +++ b/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx @@ -8,7 +8,6 @@ import { useSettingsPermissionMap } from '@/settings/roles/hooks/useSettingsPerm import { NavigationDrawerItemIndentationLevel } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerItem'; import { t } from '@lingui/core/macro'; import { useRecoilValue } from 'recoil'; -import { SettingPermissionType } from '~/generated/graphql'; import { IconApi, IconApps, @@ -31,6 +30,7 @@ import { IconUsers, IconWebhook, } from 'twenty-ui/display'; +import { SettingPermissionType } from '~/generated/graphql'; export type SettingsNavigationSection = { label: string; @@ -203,6 +203,7 @@ const useSettingsNavigationItems = (): SettingsNavigationSection[] => { label: t`Logout`, onClick: signOut, Icon: IconDoorEnter, + matchSubPages: false, }, ], }, diff --git a/packages/twenty-front/src/modules/types/SettingsPath.ts b/packages/twenty-front/src/modules/types/SettingsPath.ts index 8ee7cebf7..9e45b83c4 100644 --- a/packages/twenty-front/src/modules/types/SettingsPath.ts +++ b/packages/twenty-front/src/modules/types/SettingsPath.ts @@ -16,14 +16,14 @@ export enum SettingsPath { ServerlessFunctions = 'functions', NewServerlessFunction = 'functions/new', ServerlessFunctionDetail = 'functions/:serverlessFunctionId', - WorkspaceMembersPage = 'workspace-members', - Workspace = 'workspace', - Domain = 'domain', - APIs = 'api-keys', + WorkspaceMembersPage = 'members', + Workspace = 'general', + Domain = 'general/domain', + APIs = 'apis', RestPlayground = 'playground/rest/:schema', GraphQLPlayground = 'playground/graphql/:schema', - DevelopersNewApiKey = 'api-keys/new', - DevelopersApiKeyDetail = 'api-keys/:apiKeyId', + NewApiKey = 'apis/new', + ApiKeyDetail = 'apis/:apiKeyId', Integrations = 'integrations', IntegrationDatabase = 'integrations/:databaseKey', IntegrationDatabaseConnection = 'integrations/:databaseKey/:connectionId', @@ -33,8 +33,7 @@ export enum SettingsPath { NewSSOIdentityProvider = 'security/sso/new', NewApprovedAccessDomain = 'security/approved-access-domain/new', Webhooks = 'webhooks', - DevelopersNewWebhook = 'developers/webhooks/new', - DevelopersNewWebhookDetail = 'developers/webhooks/:webhookId', + WebhookDetail = 'webhooks/:webhookId', Releases = 'releases', AdminPanel = 'admin-panel', AdminPanelHealthStatus = 'admin-panel#health-status', diff --git a/packages/twenty-front/src/pages/settings/SettingsWorkspaceMembers.tsx b/packages/twenty-front/src/pages/settings/SettingsWorkspaceMembers.tsx index 55d96592d..ad671d5da 100644 --- a/packages/twenty-front/src/pages/settings/SettingsWorkspaceMembers.tsx +++ b/packages/twenty-front/src/pages/settings/SettingsWorkspaceMembers.tsx @@ -208,7 +208,7 @@ export const SettingsWorkspaceMembers = () => {
= { title: 'Pages/Settings/SettingsWorkspace', component: SettingsWorkspace, decorators: [PageDecorator], - args: { routePath: '/settings/workspace' }, + args: { routePath: '/settings/general' }, parameters: { msw: graphqlMocks, }, diff --git a/packages/twenty-front/src/pages/settings/__stories__/SettingsWorkspaceMembers.stories.tsx b/packages/twenty-front/src/pages/settings/__stories__/SettingsWorkspaceMembers.stories.tsx index e03563b52..8f3cb0a38 100644 --- a/packages/twenty-front/src/pages/settings/__stories__/SettingsWorkspaceMembers.stories.tsx +++ b/packages/twenty-front/src/pages/settings/__stories__/SettingsWorkspaceMembers.stories.tsx @@ -15,7 +15,7 @@ const meta: Meta = { title: 'Pages/Settings/SettingsWorkspaceMembers', component: SettingsWorkspaceMembers, decorators: [PageDecorator], - args: { routePath: '/settings/workspace-members' }, + args: { routePath: '/settings/members' }, parameters: { msw: graphqlMocks, }, diff --git a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldSelect.tsx b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldSelect.tsx index 884918113..0c4570975 100644 --- a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldSelect.tsx +++ b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldSelect.tsx @@ -69,7 +69,7 @@ export const SettingsObjectNewFieldSelect = () => { = { component: SettingsDevelopersApiKeyDetail, decorators: [PageDecorator], args: { - routePath: '/settings/developers/api-keys/:apiKeyId', + routePath: '/settings/apis/:apiKeyId', routeParams: { ':apiKeyId': 'f7c6d736-8fcd-4e9c-ab99-28f6a9031570', }, @@ -50,14 +50,14 @@ export type Story = StoryObj; export const Default: Story = { play: async ({ canvasElement }) => { const canvas = within(canvasElement); - await canvas.findByText('sfsfdsf API Key', undefined, { timeout: 3000 }); + await canvas.findByText('sfsfdsf', undefined, { timeout: 3000 }); }, }; export const RegenerateApiKey: Story = { play: async ({ step }) => { const canvas = within(document.body); - await canvas.findByText('sfsfdsf API Key', undefined, { timeout: 3000 }); + await canvas.findByText('sfsfdsf', undefined, { timeout: 3000 }); await userEvent.click(await canvas.findByText('Regenerate Key')); @@ -85,7 +85,7 @@ export const RegenerateApiKey: Story = { export const DeleteApiKey: Story = { play: async ({ canvasElement, step }) => { const canvas = within(canvasElement); - await canvas.findByText('sfsfdsf API Key', undefined, { timeout: 3000 }); + await canvas.findByText('sfsfdsf', undefined, { timeout: 3000 }); await userEvent.click(await canvas.findByText('Delete')); diff --git a/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysNew.stories.tsx b/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysNew.stories.tsx index d1e5ba1e7..a7a82c9d9 100644 --- a/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysNew.stories.tsx +++ b/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysNew.stories.tsx @@ -14,7 +14,7 @@ const meta: Meta = { title: 'Pages/Settings/ApiKeys/SettingsDevelopersApiKeysNew', component: SettingsDevelopersApiKeysNew, decorators: [PageDecorator], - args: { routePath: getSettingsPath(SettingsPath.DevelopersNewApiKey) }, + args: { routePath: getSettingsPath(SettingsPath.NewApiKey) }, parameters: { msw: graphqlMocks, }, diff --git a/packages/twenty-front/src/pages/settings/developers/__stories__/webhooks/SettingsDevelopersWebhooksDetail.stories.tsx b/packages/twenty-front/src/pages/settings/developers/__stories__/webhooks/SettingsDevelopersWebhooksDetail.stories.tsx index e59b04a84..b6fc47e77 100644 --- a/packages/twenty-front/src/pages/settings/developers/__stories__/webhooks/SettingsDevelopersWebhooksDetail.stories.tsx +++ b/packages/twenty-front/src/pages/settings/developers/__stories__/webhooks/SettingsDevelopersWebhooksDetail.stories.tsx @@ -14,7 +14,7 @@ const meta: Meta = { component: SettingsDevelopersWebhooksDetail, decorators: [PageDecorator], args: { - routePath: '/settings/developers/webhooks/:webhookId', + routePath: '/settings/webhooks/:webhookId', routeParams: { ':webhookId': '1234' }, }, parameters: { diff --git a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsApiKeys.tsx b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsApiKeys.tsx index 50de32bd2..4f2aa21d5 100644 --- a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsApiKeys.tsx +++ b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsApiKeys.tsx @@ -66,7 +66,7 @@ export const SettingsApiKeys = () => { title={t`Create API key`} size="small" variant="secondary" - to={getSettingsPath(SettingsPath.DevelopersNewApiKey)} + to={getSettingsPath(SettingsPath.NewApiKey)} />
diff --git a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx index f7a7ac33f..ce5fd7b58 100644 --- a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx +++ b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx @@ -143,7 +143,7 @@ export const SettingsDevelopersApiKeyDetail = () => { if (isNonEmptyString(apiKey?.token)) { setApiKeyTokenCallback(apiKey.id, apiKey.token); - navigate(SettingsPath.DevelopersApiKeyDetail, { + navigate(SettingsPath.ApiKeyDetail, { apiKeyId: apiKey.id, }); } @@ -173,7 +173,7 @@ export const SettingsDevelopersApiKeyDetail = () => { children: t`APIs`, href: getSettingsPath(SettingsPath.APIs), }, - { children: t`${apiKeyName} API Key` }, + { children: t`${apiKeyName}` }, ]} > diff --git a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx index 4c0544200..34f681f20 100644 --- a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx +++ b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx @@ -15,12 +15,12 @@ import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBa import { useLingui } from '@lingui/react/macro'; import { useRecoilCallback } from 'recoil'; import { Key } from 'ts-key-enum'; -import { useGenerateApiKeyTokenMutation } from '~/generated/graphql'; -import { useNavigateSettings } from '~/hooks/useNavigateSettings'; -import { getSettingsPath } from '~/utils/navigation/getSettingsPath'; import { isDefined } from 'twenty-shared/utils'; import { H2Title } from 'twenty-ui/display'; import { Section } from 'twenty-ui/layout'; +import { useGenerateApiKeyTokenMutation } from '~/generated/graphql'; +import { useNavigateSettings } from '~/hooks/useNavigateSettings'; +import { getSettingsPath } from '~/utils/navigation/getSettingsPath'; export const SettingsDevelopersApiKeysNew = () => { const { t } = useLingui(); @@ -72,7 +72,7 @@ export const SettingsDevelopersApiKeysNew = () => { newApiKey.id, tokenData.data.generateApiKeyToken.token, ); - navigateSettings(SettingsPath.DevelopersApiKeyDetail, { + navigateSettings(SettingsPath.ApiKeyDetail, { apiKeyId: newApiKey.id, }); } diff --git a/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx b/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx index 47fe83954..aaae58f20 100644 --- a/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx +++ b/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx @@ -5,6 +5,7 @@ import { useParams, useSearchParams } from 'react-router-dom'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; +import { SettingsSkeletonLoader } from '@/settings/components/SettingsSkeletonLoader'; import { useWebhookUpdateForm } from '@/settings/developers/hooks/useWebhookUpdateForm'; import { SettingsPath } from '@/types/SettingsPath'; import { Select } from '@/ui/input/components/Select'; @@ -101,7 +102,7 @@ export const SettingsDevelopersWebhooksDetail = () => { ]; if (loading || !formData) { - return <>; + return ; } const confirmationText = t`yes`; @@ -115,7 +116,11 @@ export const SettingsDevelopersWebhooksDetail = () => { children: t`Workspace`, href: getSettingsPath(SettingsPath.Workspace), }, - { children: t`Webhook` }, + { + children: t`Webhooks`, + href: getSettingsPath(SettingsPath.Webhooks), + }, + { children: title }, ]} > diff --git a/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsWebhooks.tsx b/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsWebhooks.tsx index 2952cbbf6..4262e0307 100644 --- a/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsWebhooks.tsx +++ b/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsWebhooks.tsx @@ -5,12 +5,12 @@ import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBa import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile'; import styled from '@emotion/styled'; import { Trans, useLingui } from '@lingui/react/macro'; +import { H2Title, IconPlus } from 'twenty-ui/display'; +import { Button } from 'twenty-ui/input'; +import { Section } from 'twenty-ui/layout'; +import { MOBILE_VIEWPORT } from 'twenty-ui/theme'; import { v4 } from 'uuid'; import { getSettingsPath } from '~/utils/navigation/getSettingsPath'; -import { Button } from 'twenty-ui/input'; -import { H2Title, IconPlus } from 'twenty-ui/display'; -import { MOBILE_VIEWPORT } from 'twenty-ui/theme'; -import { Section } from 'twenty-ui/layout'; const StyledButtonContainer = styled.div` display: flex; @@ -58,7 +58,7 @@ export const SettingsWebhooks = () => { size="small" variant="secondary" to={getSettingsPath( - SettingsPath.DevelopersNewWebhookDetail, + SettingsPath.WebhookDetail, { webhookId: v4(), }, diff --git a/packages/twenty-front/src/utils/__tests__/title-utils.test.ts b/packages/twenty-front/src/utils/__tests__/title-utils.test.ts index c5d9168ed..82dc34c56 100644 --- a/packages/twenty-front/src/utils/__tests__/title-utils.test.ts +++ b/packages/twenty-front/src/utils/__tests__/title-utils.test.ts @@ -36,10 +36,10 @@ describe('title-utils', () => { expect(getPageTitleFromPath('/settings/accounts/emails/:accountUuid')).toBe( SettingsPageTitles.Accounts, ); - expect(getPageTitleFromPath('/settings/workspace-members')).toBe( + expect(getPageTitleFromPath('/settings/members')).toBe( SettingsPageTitles.Members, ); - expect(getPageTitleFromPath('/settings/workspace')).toBe( + expect(getPageTitleFromPath('/settings/general')).toBe( SettingsPageTitles.General, ); expect(getPageTitleFromPath('/')).toBe('Twenty'); diff --git a/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.factory.ts b/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.factory.ts index 882b2518c..2103627f9 100644 --- a/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.factory.ts +++ b/packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.factory.ts @@ -3,6 +3,7 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { Request } from 'express'; import { CreateManyQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/create-many-query.factory'; +import { CreateVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/create-variables.factory'; import { FindDuplicatesQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/find-duplicates-query.factory'; import { FindDuplicatesVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/find-duplicates-variables.factory'; import { computeDepth } from 'src/engine/api/rest/core/query-builder/utils/compute-depth.utils'; @@ -17,7 +18,6 @@ import { getObjectMetadataMapItemByNamePlural } from 'src/engine/metadata-module import { getObjectMetadataMapItemByNameSingular } from 'src/engine/metadata-modules/utils/get-object-metadata-map-item-by-name-singular.util'; import { WorkspaceMetadataCacheService } from 'src/engine/metadata-modules/workspace-metadata-cache/services/workspace-metadata-cache.service'; import { WorkspaceCacheStorageService } from 'src/engine/workspace-cache-storage/workspace-cache-storage.service'; -import { CreateVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/create-variables.factory'; @Injectable() export class CoreQueryBuilderFactory { @@ -63,7 +63,7 @@ export class CoreQueryBuilderFactory { `No object was found for the workspace associated with this API key. You may generate a new one here ${this.domainManagerService .buildWorkspaceURL({ workspace, - pathname: '/settings/developers', + pathname: '/settings/apis', }) .toString()}`, ); diff --git a/packages/twenty-website/src/app/_components/playground/playground.tsx b/packages/twenty-website/src/app/_components/playground/playground.tsx index 836184282..5ce774490 100644 --- a/packages/twenty-website/src/app/_components/playground/playground.tsx +++ b/packages/twenty-website/src/app/_components/playground/playground.tsx @@ -61,11 +61,8 @@ const Playground = ({ A token is required as APIs are dynamically generated for each workspace based on their unique metadata.
Generate your token under{' '} - - Settings > Developers + + Settings > APIs {isLoading && ( diff --git a/packages/twenty-zapier/src/authentication.ts b/packages/twenty-zapier/src/authentication.ts index f2e694a79..93a16cfd6 100644 --- a/packages/twenty-zapier/src/authentication.ts +++ b/packages/twenty-zapier/src/authentication.ts @@ -21,7 +21,7 @@ export default { label: 'Api Key', type: 'string', helpText: - 'Create an API key in [your twenty workspace](https://app.twenty.com/settings/developers)', + 'Create an API key in [your twenty workspace](https://app.twenty.com/settings/apis)', }, { computed: false,