Skip to content

Commit 3b4f966

Browse files
authored
fix(settings): move user settings menu item before docs/gitea in profile menus across all headers (#18322)
1 parent 3a20dc3 commit 3b4f966

File tree

7 files changed

+87
-8
lines changed

7 files changed

+87
-8
lines changed

src/Designer/frontend/admin/layout/PageHeader.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ const ProfileMenu = ({ user, org }: ProfileMenuProps): ReactElement => {
106106
};
107107

108108
const profileMenuGroups: StudioProfileMenuGroup[] = [
109-
{ items: studioOidc ? [docsMenuItem, userSettingsMenuItem] : [docsMenuItem] },
109+
{ items: studioOidc ? [userSettingsMenuItem, docsMenuItem] : [docsMenuItem] },
110110
{ items: [logOutMenuItem] },
111111
];
112112

src/Designer/frontend/app-development/contexts/PageHeaderContext/PageHeaderContext.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ export const PageHeaderContextProvider = ({
7373
const studioOidc = environment?.featureFlags?.studioOidc;
7474

7575
const profileMenuItems: StudioProfileMenuItem[] = [
76-
docsMenuItem,
7776
...(studioOidc ? [userSettingsMenuItem] : []),
77+
docsMenuItem,
7878
logOutMenuItem,
7979
];
8080
const profileMenuGroups: StudioProfileMenuGroup[] = [
81-
{ items: studioOidc ? [docsMenuItem, userSettingsMenuItem] : [docsMenuItem] },
81+
{ items: studioOidc ? [userSettingsMenuItem, docsMenuItem] : [docsMenuItem] },
8282
{ items: [logOutMenuItem] },
8383
];
8484

src/Designer/frontend/app-preview/src/components/UserProfileMenu/UserProfileMenu.test.tsx

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { screen } from '@testing-library/react';
2+
import userEvent from '@testing-library/user-event';
23
import { UserProfileMenu, type UserProfileMenuProps } from './UserProfileMenu';
34
import { textMock } from '@studio/testing/mocks/i18nMock';
45
import { useMediaQuery } from '@studio/components-legacy';
@@ -8,8 +9,12 @@ import { repository } from 'app-shared/mocks/mocks';
89
import { renderWithProviders } from '../../../test/mocks';
910
import { StudioPageHeaderContextProvider } from '@studio/components/src/components/StudioPageHeader/context';
1011

12+
const mockEnvironment: { environment: { featureFlags: { studioOidc: boolean } } | null } = {
13+
environment: null,
14+
};
15+
1116
jest.mock('app-shared/contexts/EnvironmentConfigContext', () => ({
12-
useEnvironmentConfig: () => ({ environment: null, isLoading: false, error: null }),
17+
useEnvironmentConfig: () => mockEnvironment,
1318
}));
1419

1520
jest.mock('@studio/components-legacy/src/hooks/useMediaQuery');
@@ -43,6 +48,10 @@ const defaultProps: UserProfileMenuProps = {
4348
};
4449

4550
describe('UserProfileMenu', () => {
51+
beforeEach(() => {
52+
mockEnvironment.environment = null;
53+
});
54+
4655
afterEach(() => {
4756
jest.clearAllMocks();
4857
});
@@ -76,6 +85,30 @@ describe('UserProfileMenu', () => {
7685

7786
expect(screen.getByAltText(textMock('general.profile_icon'))).toBeInTheDocument();
7887
});
88+
89+
it('should include user settings link in profile menu when studioOidc is enabled', async () => {
90+
const user = userEvent.setup();
91+
mockEnvironment.environment = { featureFlags: { studioOidc: true } };
92+
93+
renderUserProfileMenu();
94+
95+
await user.click(screen.getByRole('button'));
96+
97+
expect(screen.getByRole('menuitem', { name: textMock('user.settings') })).toBeInTheDocument();
98+
});
99+
100+
it('should not include user settings link in profile menu when studioOidc is disabled', async () => {
101+
const user = userEvent.setup();
102+
mockEnvironment.environment = { featureFlags: { studioOidc: false } };
103+
104+
renderUserProfileMenu();
105+
106+
await user.click(screen.getByRole('button'));
107+
108+
expect(
109+
screen.queryByRole('menuitem', { name: textMock('user.settings') }),
110+
).not.toBeInTheDocument();
111+
});
79112
});
80113

81114
const renderUserProfileMenu = (props?: Partial<UserProfileMenuProps>) => {

src/Designer/frontend/app-preview/src/components/UserProfileMenu/UserProfileMenu.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export const UserProfileMenu = ({ user, repository }: UserProfileMenuProps): Rea
4949
};
5050

5151
const profileMenuGroups: StudioProfileMenuGroup[] = [
52-
{ items: studioOidc ? [docsMenuItem, userSettingsMenuItem] : [docsMenuItem] },
52+
{ items: studioOidc ? [userSettingsMenuItem, docsMenuItem] : [docsMenuItem] },
5353
{ items: [logOutMenuItem] },
5454
];
5555

src/Designer/frontend/dashboard/context/HeaderContext/HeaderContext.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ export const HeaderContextProvider = ({
9595
items: [allMenuItem, ...selectableOrgMenuItems, selfMenuItem],
9696
};
9797
const otherMenuItems: NavigationMenuItem[] = [
98-
giteaMenuItem,
9998
...(studioOidc ? [userSettingsMenuItem] : []),
99+
giteaMenuItem,
100100
];
101101
const profileMenuItems: NavigationMenuItem[] = [...otherMenuItems, logOutMenuItem];
102102

src/Designer/frontend/resourceadm/components/ResourceAdmHeader/ResourceAdmHeader.test.tsx

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,12 @@ const testUser = {
3333

3434
const resourceId = 'res-id';
3535

36+
const mockEnvironment: { environment: { featureFlags: { studioOidc: boolean } } | null } = {
37+
environment: null,
38+
};
39+
3640
jest.mock('app-shared/contexts/EnvironmentConfigContext', () => ({
37-
useEnvironmentConfig: () => ({ environment: null, isLoading: false, error: null }),
41+
useEnvironmentConfig: () => mockEnvironment,
3842
}));
3943

4044
const navigateMock = jest.fn();
@@ -48,6 +52,10 @@ jest.mock('react-router-dom', () => ({
4852
}));
4953

5054
describe('ResourceAdmHeader', () => {
55+
beforeEach(() => {
56+
mockEnvironment.environment = null;
57+
});
58+
5159
afterEach(jest.clearAllMocks);
5260

5361
it('should show org name and resource id in header', () => {
@@ -75,6 +83,44 @@ describe('ResourceAdmHeader', () => {
7583

7684
expect(navigateMock).toHaveBeenCalled();
7785
});
86+
87+
it('should include user settings link in profile menu when studioOidc is enabled', async () => {
88+
const user = userEvent.setup();
89+
mockEnvironment.environment = { featureFlags: { studioOidc: true } };
90+
91+
renderResourceAdmHeader();
92+
93+
await user.click(
94+
screen.getByRole('button', {
95+
name: textMock('shared.header_user_for_org', {
96+
user: testUser.full_name,
97+
org: mainOrganization.full_name,
98+
}),
99+
}),
100+
);
101+
102+
expect(screen.getByRole('menuitem', { name: textMock('user.settings') })).toBeInTheDocument();
103+
});
104+
105+
it('should not include user settings link in profile menu when studioOidc is disabled', async () => {
106+
const user = userEvent.setup();
107+
mockEnvironment.environment = { featureFlags: { studioOidc: false } };
108+
109+
renderResourceAdmHeader();
110+
111+
await user.click(
112+
screen.getByRole('button', {
113+
name: textMock('shared.header_user_for_org', {
114+
user: testUser.full_name,
115+
org: mainOrganization.full_name,
116+
}),
117+
}),
118+
);
119+
120+
expect(
121+
screen.queryByRole('menuitem', { name: textMock('user.settings') }),
122+
).not.toBeInTheDocument();
123+
});
78124
});
79125

80126
const renderResourceAdmHeader = () => {

src/Designer/frontend/resourceadm/components/ResourceAdmHeader/ResourceAdmHeader.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ const DashboardHeaderMenu = ({ organizations, user }: ResourceAdmHeaderProps) =>
9999
};
100100

101101
const otherMenuItems: StudioProfileMenuItem[] = [
102-
giteaMenuItem,
103102
...(studioOidc ? [userSettingsMenuItem] : []),
103+
giteaMenuItem,
104104
];
105105

106106
const profileMenuGroups: StudioProfileMenuGroup[] = [

0 commit comments

Comments
 (0)