Skip to content

Commit da00dee

Browse files
Fix settings navigation active state for sub-pages (#12318)
Changes the default behavior for settings navigation items to stay active when navigating to sub-pages. **Problem:** - Navigation items like "Data Model" and "Webhooks" were not staying highlighted when navigating to detail pages - This was because `matchSubPages` defaulted to requiring exact path matches **Solution:** - Updated logic to make sub-page matching the default behavior (`end: item.matchSubPages === false`) - Only "Accounts" explicitly sets `matchSubPages: false` for its custom sub-item navigation - Removed redundant `matchSubPages: true` declarations throughout the codebase **URL Changes:** -- checked with @Bonapara - `/settings/workspace` → `/settings/general` - `/settings/workspace-members` → `/settings/members` - `/settings/api-keys` → `/settings/apis` - `/settings/developers/webhooks` → `/settings/webhooks` before: https://github.com/user-attachments/assets/56b94a49-9c31-4bb5-9875-ec24f4bc4d1e after: https://github.com/user-attachments/assets/38742599-c045-44d1-8020-56f3eacca779 --------- Co-authored-by: Félix Malfait <felix.malfait@gmail.com>
1 parent dc0401e commit da00dee

File tree

22 files changed

+57
-51
lines changed

22 files changed

+57
-51
lines changed

packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -431,15 +431,15 @@ export const SettingsRoutes = ({
431431
element={<SettingsRestPlayground />}
432432
/>
433433
<Route
434-
path={SettingsPath.DevelopersNewApiKey}
434+
path={SettingsPath.NewApiKey}
435435
element={<SettingsDevelopersApiKeysNew />}
436436
/>
437437
<Route
438-
path={SettingsPath.DevelopersApiKeyDetail}
438+
path={SettingsPath.ApiKeyDetail}
439439
element={<SettingsDevelopersApiKeyDetail />}
440440
/>
441441
<Route
442-
path={SettingsPath.DevelopersNewWebhookDetail}
442+
path={SettingsPath.WebhookDetail}
443443
element={<SettingsDevelopersWebhooksDetail />}
444444
/>
445445
<Route

packages/twenty-front/src/modules/settings/components/SettingsNavigationDrawerItem.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import { AdvancedSettingsWrapper } from '@/settings/components/AdvancedSettingsW
44
import { SettingsNavigationItem } from '@/settings/hooks/useSettingsNavigationItems';
55
import { NavigationDrawerItem } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerItem';
66
import { NavigationDrawerSubItemState } from '@/ui/navigation/navigation-drawer/types/NavigationDrawerSubItemState';
7-
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
87
import { isDefined } from 'twenty-shared/utils';
8+
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
99

1010
type SettingsNavigationDrawerItemProps = {
1111
item: SettingsNavigationItem;
@@ -20,7 +20,7 @@ export const SettingsNavigationDrawerItem = ({
2020
const pathName = useResolvedPath(href).pathname;
2121
const isActive = !!useMatch({
2222
path: pathName,
23-
end: !item.matchSubPages,
23+
end: item.matchSubPages === false,
2424
});
2525

2626
if (isDefined(item.isHidden) && item.isHidden) {

packages/twenty-front/src/modules/settings/developers/components/SettingsApiKeysTable.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import { TableHeader } from '@/ui/layout/table/components/TableHeader';
1111
import { TableRow } from '@/ui/layout/table/components/TableRow';
1212
import styled from '@emotion/styled';
1313
import { Trans } from '@lingui/react/macro';
14-
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
1514
import { MOBILE_VIEWPORT } from 'twenty-ui/theme';
15+
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
1616

1717
const StyledTableBody = styled(TableBody)`
1818
border-bottom: 1px solid ${({ theme }) => theme.border.color.light};
@@ -55,7 +55,7 @@ export const SettingsApiKeysTable = () => {
5555
<SettingsApiKeysFieldItemTableRow
5656
key={fieldItem.id}
5757
fieldItem={fieldItem as ApiFieldItem}
58-
to={getSettingsPath(SettingsPath.DevelopersApiKeyDetail, {
58+
to={getSettingsPath(SettingsPath.ApiKeyDetail, {
5959
apiKeyId: fieldItem.id,
6060
})}
6161
/>

packages/twenty-front/src/modules/settings/developers/components/SettingsWebhooksTable.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSi
44
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
55
import { SettingsDevelopersWebhookTableRow } from '@/settings/developers/components/SettingsDevelopersWebhookTableRow';
66
import { Webhook } from '@/settings/developers/types/webhook/Webhook';
7+
import { SettingsPath } from '@/types/SettingsPath';
78
import { Table } from '@/ui/layout/table/components/Table';
89
import { TableBody } from '@/ui/layout/table/components/TableBody';
910
import { TableHeader } from '@/ui/layout/table/components/TableHeader';
1011
import { TableRow } from '@/ui/layout/table/components/TableRow';
12+
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
1113

1214
const StyledTableBody = styled(TableBody)`
1315
border-bottom: 1px solid ${({ theme }) => theme.border.color.light};
@@ -36,7 +38,9 @@ export const SettingsWebhooksTable = () => {
3638
<SettingsDevelopersWebhookTableRow
3739
key={webhookFieldItem.id}
3840
fieldItem={webhookFieldItem}
39-
to={`/settings/developers/webhooks/${webhookFieldItem.id}`}
41+
to={getSettingsPath(SettingsPath.WebhookDetail, {
42+
webhookId: webhookFieldItem.id,
43+
})}
4044
/>
4145
))}
4246
</StyledTableBody>

packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { useSettingsPermissionMap } from '@/settings/roles/hooks/useSettingsPerm
88
import { NavigationDrawerItemIndentationLevel } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerItem';
99
import { t } from '@lingui/core/macro';
1010
import { useRecoilValue } from 'recoil';
11-
import { SettingPermissionType } from '~/generated/graphql';
1211
import {
1312
IconApi,
1413
IconApps,
@@ -31,6 +30,7 @@ import {
3130
IconUsers,
3231
IconWebhook,
3332
} from 'twenty-ui/display';
33+
import { SettingPermissionType } from '~/generated/graphql';
3434

3535
export type SettingsNavigationSection = {
3636
label: string;
@@ -203,6 +203,7 @@ const useSettingsNavigationItems = (): SettingsNavigationSection[] => {
203203
label: t`Logout`,
204204
onClick: signOut,
205205
Icon: IconDoorEnter,
206+
matchSubPages: false,
206207
},
207208
],
208209
},

packages/twenty-front/src/modules/types/SettingsPath.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ export enum SettingsPath {
1616
ServerlessFunctions = 'functions',
1717
NewServerlessFunction = 'functions/new',
1818
ServerlessFunctionDetail = 'functions/:serverlessFunctionId',
19-
WorkspaceMembersPage = 'workspace-members',
20-
Workspace = 'workspace',
21-
Domain = 'domain',
22-
APIs = 'api-keys',
19+
WorkspaceMembersPage = 'members',
20+
Workspace = 'general',
21+
Domain = 'general/domain',
22+
APIs = 'apis',
2323
RestPlayground = 'playground/rest/:schema',
2424
GraphQLPlayground = 'playground/graphql/:schema',
25-
DevelopersNewApiKey = 'api-keys/new',
26-
DevelopersApiKeyDetail = 'api-keys/:apiKeyId',
25+
NewApiKey = 'apis/new',
26+
ApiKeyDetail = 'apis/:apiKeyId',
2727
Integrations = 'integrations',
2828
IntegrationDatabase = 'integrations/:databaseKey',
2929
IntegrationDatabaseConnection = 'integrations/:databaseKey/:connectionId',
@@ -33,8 +33,7 @@ export enum SettingsPath {
3333
NewSSOIdentityProvider = 'security/sso/new',
3434
NewApprovedAccessDomain = 'security/approved-access-domain/new',
3535
Webhooks = 'webhooks',
36-
DevelopersNewWebhook = 'developers/webhooks/new',
37-
DevelopersNewWebhookDetail = 'developers/webhooks/:webhookId',
36+
WebhookDetail = 'webhooks/:webhookId',
3837
Releases = 'releases',
3938
AdminPanel = 'admin-panel',
4039
AdminPanelHealthStatus = 'admin-panel#health-status',

packages/twenty-front/src/pages/settings/SettingsWorkspaceMembers.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ export const SettingsWorkspaceMembers = () => {
208208
<Section>
209209
<H2Title
210210
title={t`Manage Members`}
211-
description={t`Manage the members of your space here`}
211+
description={t`Manage the members of your workspace here`}
212212
/>
213213
<StyledSearchContainer>
214214
<StyledSearchInput

packages/twenty-front/src/pages/settings/__stories__/SettingsWorkspace.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const meta: Meta<PageDecoratorArgs> = {
1212
title: 'Pages/Settings/SettingsWorkspace',
1313
component: SettingsWorkspace,
1414
decorators: [PageDecorator],
15-
args: { routePath: '/settings/workspace' },
15+
args: { routePath: '/settings/general' },
1616
parameters: {
1717
msw: graphqlMocks,
1818
},

packages/twenty-front/src/pages/settings/__stories__/SettingsWorkspaceMembers.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const meta: Meta<PageDecoratorArgs> = {
1515
title: 'Pages/Settings/SettingsWorkspaceMembers',
1616
component: SettingsWorkspaceMembers,
1717
decorators: [PageDecorator],
18-
args: { routePath: '/settings/workspace-members' },
18+
args: { routePath: '/settings/members' },
1919
parameters: {
2020
msw: graphqlMocks,
2121
},

packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldSelect.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export const SettingsObjectNewFieldSelect = () => {
6969
<SubMenuTopBarContainer
7070
title={t`1. Select a field type`}
7171
links={[
72-
{ children: t`Workspace`, href: '/settings/workspace' },
72+
{ children: t`Workspace`, href: '/settings/general' },
7373
{ children: t`Objects`, href: '/settings/objects' },
7474
{
7575
children: activeObjectMetadataItem.labelPlural,

packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysDetail.stories.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const meta: Meta<PageDecoratorArgs> = {
1515
component: SettingsDevelopersApiKeyDetail,
1616
decorators: [PageDecorator],
1717
args: {
18-
routePath: '/settings/developers/api-keys/:apiKeyId',
18+
routePath: '/settings/apis/:apiKeyId',
1919
routeParams: {
2020
':apiKeyId': 'f7c6d736-8fcd-4e9c-ab99-28f6a9031570',
2121
},
@@ -50,14 +50,14 @@ export type Story = StoryObj<typeof SettingsDevelopersApiKeyDetail>;
5050
export const Default: Story = {
5151
play: async ({ canvasElement }) => {
5252
const canvas = within(canvasElement);
53-
await canvas.findByText('sfsfdsf API Key', undefined, { timeout: 3000 });
53+
await canvas.findByText('sfsfdsf', undefined, { timeout: 3000 });
5454
},
5555
};
5656

5757
export const RegenerateApiKey: Story = {
5858
play: async ({ step }) => {
5959
const canvas = within(document.body);
60-
await canvas.findByText('sfsfdsf API Key', undefined, { timeout: 3000 });
60+
await canvas.findByText('sfsfdsf', undefined, { timeout: 3000 });
6161

6262
await userEvent.click(await canvas.findByText('Regenerate Key'));
6363

@@ -85,7 +85,7 @@ export const RegenerateApiKey: Story = {
8585
export const DeleteApiKey: Story = {
8686
play: async ({ canvasElement, step }) => {
8787
const canvas = within(canvasElement);
88-
await canvas.findByText('sfsfdsf API Key', undefined, { timeout: 3000 });
88+
await canvas.findByText('sfsfdsf', undefined, { timeout: 3000 });
8989

9090
await userEvent.click(await canvas.findByText('Delete'));
9191

packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysNew.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const meta: Meta<PageDecoratorArgs> = {
1414
title: 'Pages/Settings/ApiKeys/SettingsDevelopersApiKeysNew',
1515
component: SettingsDevelopersApiKeysNew,
1616
decorators: [PageDecorator],
17-
args: { routePath: getSettingsPath(SettingsPath.DevelopersNewApiKey) },
17+
args: { routePath: getSettingsPath(SettingsPath.NewApiKey) },
1818
parameters: {
1919
msw: graphqlMocks,
2020
},

packages/twenty-front/src/pages/settings/developers/__stories__/webhooks/SettingsDevelopersWebhooksDetail.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const meta: Meta<PageDecoratorArgs> = {
1414
component: SettingsDevelopersWebhooksDetail,
1515
decorators: [PageDecorator],
1616
args: {
17-
routePath: '/settings/developers/webhooks/:webhookId',
17+
routePath: '/settings/webhooks/:webhookId',
1818
routeParams: { ':webhookId': '1234' },
1919
},
2020
parameters: {

packages/twenty-front/src/pages/settings/developers/api-keys/SettingsApiKeys.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export const SettingsApiKeys = () => {
6666
title={t`Create API key`}
6767
size="small"
6868
variant="secondary"
69-
to={getSettingsPath(SettingsPath.DevelopersNewApiKey)}
69+
to={getSettingsPath(SettingsPath.NewApiKey)}
7070
/>
7171
</StyledButtonContainer>
7272
</Section>

packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ export const SettingsDevelopersApiKeyDetail = () => {
143143

144144
if (isNonEmptyString(apiKey?.token)) {
145145
setApiKeyTokenCallback(apiKey.id, apiKey.token);
146-
navigate(SettingsPath.DevelopersApiKeyDetail, {
146+
navigate(SettingsPath.ApiKeyDetail, {
147147
apiKeyId: apiKey.id,
148148
});
149149
}
@@ -173,7 +173,7 @@ export const SettingsDevelopersApiKeyDetail = () => {
173173
children: t`APIs`,
174174
href: getSettingsPath(SettingsPath.APIs),
175175
},
176-
{ children: t`${apiKeyName} API Key` },
176+
{ children: t`${apiKeyName}` },
177177
]}
178178
>
179179
<SettingsPageContainer>

packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBa
1515
import { useLingui } from '@lingui/react/macro';
1616
import { useRecoilCallback } from 'recoil';
1717
import { Key } from 'ts-key-enum';
18-
import { useGenerateApiKeyTokenMutation } from '~/generated/graphql';
19-
import { useNavigateSettings } from '~/hooks/useNavigateSettings';
20-
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
2118
import { isDefined } from 'twenty-shared/utils';
2219
import { H2Title } from 'twenty-ui/display';
2320
import { Section } from 'twenty-ui/layout';
21+
import { useGenerateApiKeyTokenMutation } from '~/generated/graphql';
22+
import { useNavigateSettings } from '~/hooks/useNavigateSettings';
23+
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
2424

2525
export const SettingsDevelopersApiKeysNew = () => {
2626
const { t } = useLingui();
@@ -72,7 +72,7 @@ export const SettingsDevelopersApiKeysNew = () => {
7272
newApiKey.id,
7373
tokenData.data.generateApiKeyToken.token,
7474
);
75-
navigateSettings(SettingsPath.DevelopersApiKeyDetail, {
75+
navigateSettings(SettingsPath.ApiKeyDetail, {
7676
apiKeyId: newApiKey.id,
7777
});
7878
}

packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { useParams, useSearchParams } from 'react-router-dom';
55

66
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
77
import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer';
8+
import { SettingsSkeletonLoader } from '@/settings/components/SettingsSkeletonLoader';
89
import { useWebhookUpdateForm } from '@/settings/developers/hooks/useWebhookUpdateForm';
910
import { SettingsPath } from '@/types/SettingsPath';
1011
import { Select } from '@/ui/input/components/Select';
@@ -101,7 +102,7 @@ export const SettingsDevelopersWebhooksDetail = () => {
101102
];
102103

103104
if (loading || !formData) {
104-
return <></>;
105+
return <SettingsSkeletonLoader />;
105106
}
106107

107108
const confirmationText = t`yes`;
@@ -115,7 +116,11 @@ export const SettingsDevelopersWebhooksDetail = () => {
115116
children: t`Workspace`,
116117
href: getSettingsPath(SettingsPath.Workspace),
117118
},
118-
{ children: t`Webhook` },
119+
{
120+
children: t`Webhooks`,
121+
href: getSettingsPath(SettingsPath.Webhooks),
122+
},
123+
{ children: title },
119124
]}
120125
>
121126
<SettingsPageContainer>

packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsWebhooks.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBa
55
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
66
import styled from '@emotion/styled';
77
import { Trans, useLingui } from '@lingui/react/macro';
8-
import { v4 } from 'uuid';
9-
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
10-
import { Button } from 'twenty-ui/input';
118
import { H2Title, IconPlus } from 'twenty-ui/display';
12-
import { MOBILE_VIEWPORT } from 'twenty-ui/theme';
9+
import { Button } from 'twenty-ui/input';
1310
import { Section } from 'twenty-ui/layout';
11+
import { MOBILE_VIEWPORT } from 'twenty-ui/theme';
12+
import { v4 } from 'uuid';
13+
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
1414

1515
const StyledButtonContainer = styled.div`
1616
display: flex;
@@ -58,7 +58,7 @@ export const SettingsWebhooks = () => {
5858
size="small"
5959
variant="secondary"
6060
to={getSettingsPath(
61-
SettingsPath.DevelopersNewWebhookDetail,
61+
SettingsPath.WebhookDetail,
6262
{
6363
webhookId: v4(),
6464
},

packages/twenty-front/src/utils/__tests__/title-utils.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ describe('title-utils', () => {
3636
expect(getPageTitleFromPath('/settings/accounts/emails/:accountUuid')).toBe(
3737
SettingsPageTitles.Accounts,
3838
);
39-
expect(getPageTitleFromPath('/settings/workspace-members')).toBe(
39+
expect(getPageTitleFromPath('/settings/members')).toBe(
4040
SettingsPageTitles.Members,
4141
);
42-
expect(getPageTitleFromPath('/settings/workspace')).toBe(
42+
expect(getPageTitleFromPath('/settings/general')).toBe(
4343
SettingsPageTitles.General,
4444
);
4545
expect(getPageTitleFromPath('/')).toBe('Twenty');

packages/twenty-server/src/engine/api/rest/core/query-builder/core-query-builder.factory.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { BadRequestException, Injectable } from '@nestjs/common';
33
import { Request } from 'express';
44

55
import { CreateManyQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/create-many-query.factory';
6+
import { CreateVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/create-variables.factory';
67
import { FindDuplicatesQueryFactory } from 'src/engine/api/rest/core/query-builder/factories/find-duplicates-query.factory';
78
import { FindDuplicatesVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/find-duplicates-variables.factory';
89
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
1718
import { getObjectMetadataMapItemByNameSingular } from 'src/engine/metadata-modules/utils/get-object-metadata-map-item-by-name-singular.util';
1819
import { WorkspaceMetadataCacheService } from 'src/engine/metadata-modules/workspace-metadata-cache/services/workspace-metadata-cache.service';
1920
import { WorkspaceCacheStorageService } from 'src/engine/workspace-cache-storage/workspace-cache-storage.service';
20-
import { CreateVariablesFactory } from 'src/engine/api/rest/core/query-builder/factories/create-variables.factory';
2121

2222
@Injectable()
2323
export class CoreQueryBuilderFactory {
@@ -63,7 +63,7 @@ export class CoreQueryBuilderFactory {
6363
`No object was found for the workspace associated with this API key. You may generate a new one here ${this.domainManagerService
6464
.buildWorkspaceURL({
6565
workspace,
66-
pathname: '/settings/developers',
66+
pathname: '/settings/apis',
6767
})
6868
.toString()}`,
6969
);

packages/twenty-website/src/app/_components/playground/playground.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,8 @@ const Playground = ({
6161
A token is required as APIs are dynamically generated for each
6262
workspace based on their unique metadata. <br /> Generate your token
6363
under{' '}
64-
<a
65-
className="link"
66-
href="https://app.twenty.com/settings/developers"
67-
>
68-
Settings &gt; Developers
64+
<a className="link" href="https://app.twenty.com/settings/apis">
65+
Settings &gt; APIs
6966
</a>
7067
</div>
7168
{isLoading && (

packages/twenty-zapier/src/authentication.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export default {
2121
label: 'Api Key',
2222
type: 'string',
2323
helpText:
24-
'Create an API key in [your twenty workspace](https://app.twenty.com/settings/developers)',
24+
'Create an API key in [your twenty workspace](https://app.twenty.com/settings/apis)',
2525
},
2626
{
2727
computed: false,

0 commit comments

Comments
 (0)