@nauedu/frontend-component-header 20.0.0 → 20.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DesktopHeader.js +242 -0
- package/dist/DesktopHeader.js.map +1 -0
- package/dist/Header.js +9 -13
- package/dist/Header.js.map +1 -1
- package/dist/Header.test.jsx +0 -3
- package/dist/Icons.js +1 -1
- package/dist/LanguageSelector/data/api.js +5 -13
- package/dist/LanguageSelector/data/api.js.map +1 -1
- package/dist/LanguageSelector/index.js +4 -12
- package/dist/LanguageSelector/index.js.map +1 -1
- package/dist/Logo.js +23 -10
- package/dist/Logo.js.map +1 -1
- package/dist/Menu/Menu.js +11 -11
- package/dist/Menu/Menu.js.map +1 -1
- package/dist/Menu/menu.scss +6 -6
- package/dist/MobileHeader.js +244 -0
- package/dist/MobileHeader.js.map +1 -0
- package/dist/__snapshots__/Header.test.jsx.snap +0 -2
- package/dist/index.scss +15 -27
- package/dist/learning-header/AnonymousUserMenu.js +8 -11
- package/dist/learning-header/AnonymousUserMenu.js.map +1 -1
- package/dist/learning-header/AuthenticatedUserDropdown.js +24 -32
- package/dist/learning-header/AuthenticatedUserDropdown.js.map +1 -1
- package/dist/learning-header/LearningHeader.js +14 -15
- package/dist/learning-header/LearningHeader.js.map +1 -1
- package/dist/learning-header/data/api.js +4 -12
- package/dist/learning-header/data/api.js.map +1 -1
- package/dist/learning-header/data/api.test.js +95 -92
- package/dist/learning-header/data/api.test.js.map +1 -1
- package/dist/learning-header/messages.js +0 -5
- package/dist/learning-header/messages.js.map +1 -1
- package/dist/setupTest.js +2 -0
- package/dist/studio-header/BrandNav.js +21 -0
- package/dist/studio-header/BrandNav.js.map +1 -0
- package/dist/studio-header/CourseLockUp.js +45 -0
- package/dist/studio-header/CourseLockUp.js.map +1 -0
- package/dist/studio-header/HeaderBody.js +131 -0
- package/dist/studio-header/HeaderBody.js.map +1 -0
- package/dist/studio-header/MobileHeader.js +79 -0
- package/dist/studio-header/MobileHeader.js.map +1 -0
- package/dist/studio-header/MobileMenu.js +45 -0
- package/dist/studio-header/MobileMenu.js.map +1 -0
- package/dist/studio-header/NavDropdownMenu.js +30 -0
- package/dist/studio-header/NavDropdownMenu.js.map +1 -0
- package/dist/studio-header/StudioHeader.js +72 -0
- package/dist/studio-header/StudioHeader.js.map +1 -0
- package/dist/studio-header/StudioHeader.scss +10 -8
- package/dist/studio-header/UserMenu.js +55 -0
- package/dist/studio-header/UserMenu.js.map +1 -0
- package/dist/studio-header/{index.ts → index.js} +1 -1
- package/dist/studio-header/index.js.map +1 -0
- package/dist/studio-header/{messages.ts → messages.js} +14 -15
- package/dist/studio-header/messages.js.map +1 -0
- package/dist/studio-header/utils.js +29 -0
- package/dist/studio-header/utils.js.map +1 -0
- package/dist/test-utils.js +4 -12
- package/dist/test-utils.js.map +1 -1
- package/package.json +1 -1
- package/dist/desktop-header/DesktopHeader.js +0 -172
- package/dist/desktop-header/DesktopHeader.js.map +0 -1
- package/dist/desktop-header/DesktopHeaderMainOrSecondaryMenu.js +0 -51
- package/dist/desktop-header/DesktopHeaderMainOrSecondaryMenu.js.map +0 -1
- package/dist/desktop-header/DesktopHeaderUserMenu.js +0 -49
- package/dist/desktop-header/DesktopHeaderUserMenu.js.map +0 -1
- package/dist/desktop-header/DesktopLoggedOutItems.js +0 -22
- package/dist/desktop-header/DesktopLoggedOutItems.js.map +0 -1
- package/dist/desktop-header/DesktopUserMenuToggle.js +0 -25
- package/dist/desktop-header/DesktopUserMenuToggle.js.map +0 -1
- package/dist/frontend-platform.d.ts +0 -41
- package/dist/learning-header/LearningHeaderCourseInfo.js +0 -24
- package/dist/learning-header/LearningHeaderCourseInfo.js.map +0 -1
- package/dist/learning-header/LearningHeaderHelpLink.js +0 -13
- package/dist/learning-header/LearningHeaderHelpLink.js.map +0 -1
- package/dist/learning-header/LearningHeaderUserMenuItems.js +0 -20
- package/dist/learning-header/LearningHeaderUserMenuItems.js.map +0 -1
- package/dist/learning-header/LearningLoggedOutButtons.js +0 -24
- package/dist/learning-header/LearningLoggedOutButtons.js.map +0 -1
- package/dist/learning-header/LearningUserMenuToggle.js +0 -26
- package/dist/learning-header/LearningUserMenuToggle.js.map +0 -1
- package/dist/mobile-header/MobileHeader.js +0 -197
- package/dist/mobile-header/MobileHeader.js.map +0 -1
- package/dist/mobile-header/MobileHeaderMainMenu.js +0 -46
- package/dist/mobile-header/MobileHeaderMainMenu.js.map +0 -1
- package/dist/mobile-header/MobileHeaderUserMenu.js +0 -38
- package/dist/mobile-header/MobileHeaderUserMenu.js.map +0 -1
- package/dist/mobile-header/MobileLoggedOutItems.js +0 -27
- package/dist/mobile-header/MobileLoggedOutItems.js.map +0 -1
- package/dist/mobile-header/MobileUserMenuToggle.js +0 -19
- package/dist/mobile-header/MobileUserMenuToggle.js.map +0 -1
- package/dist/plugin-slots/CourseInfoSlot/README.md +0 -128
- package/dist/plugin-slots/CourseInfoSlot/images/add_custom_components_before_and_after_course_info.png +0 -0
- package/dist/plugin-slots/CourseInfoSlot/images/replace_course_info_with_custom_component.png +0 -0
- package/dist/plugin-slots/CourseInfoSlot/images/replace_course_title.png +0 -0
- package/dist/plugin-slots/CourseInfoSlot/index.js +0 -32
- package/dist/plugin-slots/CourseInfoSlot/index.js.map +0 -1
- package/dist/plugin-slots/DesktopHeaderSlot/README.md +0 -44
- package/dist/plugin-slots/DesktopHeaderSlot/images/desktop_header_custom_component.png +0 -0
- package/dist/plugin-slots/DesktopHeaderSlot/index.js +0 -16
- package/dist/plugin-slots/DesktopHeaderSlot/index.js.map +0 -1
- package/dist/plugin-slots/DesktopLoggedOutItemsSlot/README.md +0 -137
- package/dist/plugin-slots/DesktopLoggedOutItemsSlot/images/desktop_logged_out_items_custom_component.png +0 -0
- package/dist/plugin-slots/DesktopLoggedOutItemsSlot/images/desktop_logged_out_items_custom_components_before_after.png +0 -0
- package/dist/plugin-slots/DesktopLoggedOutItemsSlot/images/desktop_logged_out_items_modify_items.png +0 -0
- package/dist/plugin-slots/DesktopLoggedOutItemsSlot/index.js +0 -20
- package/dist/plugin-slots/DesktopLoggedOutItemsSlot/index.js.map +0 -1
- package/dist/plugin-slots/DesktopMainMenuSlot/README.md +0 -137
- package/dist/plugin-slots/DesktopMainMenuSlot/images/desktop_main_menu_custom_component.png +0 -0
- package/dist/plugin-slots/DesktopMainMenuSlot/images/desktop_main_menu_custom_components_before_after.png +0 -0
- package/dist/plugin-slots/DesktopMainMenuSlot/images/desktop_main_menu_modify_items.png +0 -0
- package/dist/plugin-slots/DesktopMainMenuSlot/index.js +0 -20
- package/dist/plugin-slots/DesktopMainMenuSlot/index.js.map +0 -1
- package/dist/plugin-slots/DesktopSecondaryMenuSlot/README.md +0 -132
- package/dist/plugin-slots/DesktopSecondaryMenuSlot/images/desktop_secondary_menu_custom_component.png +0 -0
- package/dist/plugin-slots/DesktopSecondaryMenuSlot/images/desktop_secondary_menu_custom_components_before_after.png +0 -0
- package/dist/plugin-slots/DesktopSecondaryMenuSlot/images/desktop_secondary_menu_modify_items.png +0 -0
- package/dist/plugin-slots/DesktopSecondaryMenuSlot/index.js +0 -20
- package/dist/plugin-slots/DesktopSecondaryMenuSlot/index.js.map +0 -1
- package/dist/plugin-slots/DesktopUserMenuSlot/README.md +0 -144
- package/dist/plugin-slots/DesktopUserMenuSlot/images/desktop_user_menu_custom_component.png +0 -0
- package/dist/plugin-slots/DesktopUserMenuSlot/images/desktop_user_menu_custom_components_before_after.png +0 -0
- package/dist/plugin-slots/DesktopUserMenuSlot/images/desktop_user_menu_modify_items.png +0 -0
- package/dist/plugin-slots/DesktopUserMenuSlot/index.js +0 -20
- package/dist/plugin-slots/DesktopUserMenuSlot/index.js.map +0 -1
- package/dist/plugin-slots/DesktopUserMenuToggleSlot/README.md +0 -74
- package/dist/plugin-slots/DesktopUserMenuToggleSlot/images/desktop_user_menu_custom_component.png +0 -0
- package/dist/plugin-slots/DesktopUserMenuToggleSlot/images/desktop_user_menu_modified_toggle.png +0 -0
- package/dist/plugin-slots/DesktopUserMenuToggleSlot/index.js +0 -19
- package/dist/plugin-slots/DesktopUserMenuToggleSlot/index.js.map +0 -1
- package/dist/plugin-slots/LearningHelpSlot/README.md +0 -44
- package/dist/plugin-slots/LearningHelpSlot/images/learning_help_custom_component.png +0 -0
- package/dist/plugin-slots/LearningHelpSlot/index.js +0 -11
- package/dist/plugin-slots/LearningHelpSlot/index.js.map +0 -1
- package/dist/plugin-slots/LearningLoggedOutItemsSlot/README.md +0 -135
- package/dist/plugin-slots/LearningLoggedOutItemsSlot/images/learning_logged_out_items_custom_component.png +0 -0
- package/dist/plugin-slots/LearningLoggedOutItemsSlot/images/learning_logged_out_items_custom_components_before_after.png +0 -0
- package/dist/plugin-slots/LearningLoggedOutItemsSlot/images/learning_logged_out_items_modified_items.png +0 -0
- package/dist/plugin-slots/LearningLoggedOutItemsSlot/index.js +0 -18
- package/dist/plugin-slots/LearningLoggedOutItemsSlot/index.js.map +0 -1
- package/dist/plugin-slots/LearningUserMenuSlot/README.md +0 -133
- package/dist/plugin-slots/LearningUserMenuSlot/images/learning_user_menu_custom_component.png +0 -0
- package/dist/plugin-slots/LearningUserMenuSlot/images/learning_user_menu_custom_components_before_after.png +0 -0
- package/dist/plugin-slots/LearningUserMenuSlot/images/learning_user_menu_modified_items.png +0 -0
- package/dist/plugin-slots/LearningUserMenuSlot/index.js +0 -18
- package/dist/plugin-slots/LearningUserMenuSlot/index.js.map +0 -1
- package/dist/plugin-slots/LearningUserMenuToggleSlot/README.md +0 -74
- package/dist/plugin-slots/LearningUserMenuToggleSlot/images/learning_user_menu_toggle_custom_component.png +0 -0
- package/dist/plugin-slots/LearningUserMenuToggleSlot/images/learning_user_menu_toggle_modified_items.png +0 -0
- package/dist/plugin-slots/LearningUserMenuToggleSlot/index.js +0 -19
- package/dist/plugin-slots/LearningUserMenuToggleSlot/index.js.map +0 -1
- package/dist/plugin-slots/LogoSlot/README.md +0 -72
- package/dist/plugin-slots/LogoSlot/index.js +0 -27
- package/dist/plugin-slots/LogoSlot/index.js.map +0 -1
- package/dist/plugin-slots/MobileHeaderSlot/README.md +0 -44
- package/dist/plugin-slots/MobileHeaderSlot/images/mobile_header_custom_component.png +0 -0
- package/dist/plugin-slots/MobileHeaderSlot/index.js +0 -16
- package/dist/plugin-slots/MobileHeaderSlot/index.js.map +0 -1
- package/dist/plugin-slots/MobileLoggedOutItemsSlot/README.md +0 -136
- package/dist/plugin-slots/MobileLoggedOutItemsSlot/images/mobile_logged_out_items_custom_component.png +0 -0
- package/dist/plugin-slots/MobileLoggedOutItemsSlot/images/mobile_logged_out_items_custom_components_before_after.png +0 -0
- package/dist/plugin-slots/MobileLoggedOutItemsSlot/images/mobile_logged_out_items_modify_items.png +0 -0
- package/dist/plugin-slots/MobileLoggedOutItemsSlot/index.js +0 -20
- package/dist/plugin-slots/MobileLoggedOutItemsSlot/index.js.map +0 -1
- package/dist/plugin-slots/MobileMainMenuSlot/README.md +0 -136
- package/dist/plugin-slots/MobileMainMenuSlot/images/mobile_main_menu_custom_component.png +0 -0
- package/dist/plugin-slots/MobileMainMenuSlot/images/mobile_main_menu_custom_components_before_after.png +0 -0
- package/dist/plugin-slots/MobileMainMenuSlot/images/mobile_main_menu_modify_items.png +0 -0
- package/dist/plugin-slots/MobileMainMenuSlot/index.js +0 -20
- package/dist/plugin-slots/MobileMainMenuSlot/index.js.map +0 -1
- package/dist/plugin-slots/MobileUserMenuSlot/README.md +0 -144
- package/dist/plugin-slots/MobileUserMenuSlot/images/mobile_user_menu_custom_component.png +0 -0
- package/dist/plugin-slots/MobileUserMenuSlot/images/mobile_user_menu_custom_components_before_after.png +0 -0
- package/dist/plugin-slots/MobileUserMenuSlot/images/mobile_user_menu_modify_items.png +0 -0
- package/dist/plugin-slots/MobileUserMenuSlot/index.js +0 -20
- package/dist/plugin-slots/MobileUserMenuSlot/index.js.map +0 -1
- package/dist/plugin-slots/MobileUserMenuToggleSlot/README.md +0 -74
- package/dist/plugin-slots/MobileUserMenuToggleSlot/images/mobile_user_menu_toggle_custom_component.png +0 -0
- package/dist/plugin-slots/MobileUserMenuToggleSlot/images/mobile_user_menu_toggle_modified_items.png +0 -0
- package/dist/plugin-slots/MobileUserMenuToggleSlot/index.js +0 -19
- package/dist/plugin-slots/MobileUserMenuToggleSlot/index.js.map +0 -1
- package/dist/plugin-slots/README.md +0 -26
- package/dist/studio-header/BrandNav.test.tsx +0 -40
- package/dist/studio-header/BrandNav.tsx +0 -25
- package/dist/studio-header/CourseLockUp.test.tsx +0 -59
- package/dist/studio-header/CourseLockUp.tsx +0 -56
- package/dist/studio-header/HeaderBody.test.tsx +0 -102
- package/dist/studio-header/HeaderBody.tsx +0 -196
- package/dist/studio-header/MobileHeader.tsx +0 -74
- package/dist/studio-header/MobileMenu.test.tsx +0 -81
- package/dist/studio-header/MobileMenu.tsx +0 -50
- package/dist/studio-header/NavDropdownMenu.test.tsx +0 -67
- package/dist/studio-header/NavDropdownMenu.tsx +0 -42
- package/dist/studio-header/StudioHeader.test.tsx +0 -220
- package/dist/studio-header/StudioHeader.tsx +0 -84
- package/dist/studio-header/UserMenu.tsx +0 -69
- package/dist/studio-header/utils.ts +0 -37
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
/* eslint-disable react/prop-types */
|
|
2
|
-
import React, { useMemo } from 'react';
|
|
3
|
-
import {
|
|
4
|
-
render,
|
|
5
|
-
fireEvent,
|
|
6
|
-
waitFor,
|
|
7
|
-
} from '@testing-library/react';
|
|
8
|
-
|
|
9
|
-
import { AppContext } from '@edx/frontend-platform/react';
|
|
10
|
-
import { IntlProvider } from '@edx/frontend-platform/i18n';
|
|
11
|
-
import { Context as ResponsiveContext } from 'react-responsive';
|
|
12
|
-
import { MemoryRouter } from 'react-router-dom';
|
|
13
|
-
|
|
14
|
-
import StudioHeader from './StudioHeader';
|
|
15
|
-
import messages from './messages';
|
|
16
|
-
|
|
17
|
-
const authenticatedUser = {
|
|
18
|
-
userId: 3,
|
|
19
|
-
username: 'abc123',
|
|
20
|
-
administrator: true,
|
|
21
|
-
roles: [],
|
|
22
|
-
avatar: '/imges/test.png',
|
|
23
|
-
};
|
|
24
|
-
let currentUser;
|
|
25
|
-
let screenWidth = 1280;
|
|
26
|
-
|
|
27
|
-
const RootWrapper = ({
|
|
28
|
-
...props
|
|
29
|
-
}: React.ComponentProps<typeof StudioHeader>) => {
|
|
30
|
-
const appContextValue = useMemo(() => ({
|
|
31
|
-
authenticatedUser: currentUser,
|
|
32
|
-
config: {
|
|
33
|
-
LOGOUT_URL: process.env.LOGOUT_URL,
|
|
34
|
-
LOGO_URL: process.env.LOGO_URL,
|
|
35
|
-
SITE_NAME: process.env.SITE_NAME,
|
|
36
|
-
STUDIO_BASE_URL: process.env.STUDIO_BASE_URL,
|
|
37
|
-
LOGIN_URL: process.env.LOGIN_URL,
|
|
38
|
-
},
|
|
39
|
-
}), []);
|
|
40
|
-
const responsiveContextValue = useMemo(() => ({ width: screenWidth }), []);
|
|
41
|
-
|
|
42
|
-
return (
|
|
43
|
-
// eslint-disable-next-line react/jsx-no-constructed-context-values, react/prop-types
|
|
44
|
-
<MemoryRouter>
|
|
45
|
-
<IntlProvider locale="en">
|
|
46
|
-
<AppContext.Provider value={appContextValue}>
|
|
47
|
-
<ResponsiveContext.Provider value={responsiveContextValue}>
|
|
48
|
-
<StudioHeader
|
|
49
|
-
{...props}
|
|
50
|
-
/>
|
|
51
|
-
</ResponsiveContext.Provider>
|
|
52
|
-
</AppContext.Provider>
|
|
53
|
-
</IntlProvider>
|
|
54
|
-
</MemoryRouter>
|
|
55
|
-
);
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const props: React.ComponentProps<typeof StudioHeader> = {
|
|
59
|
-
number: '123',
|
|
60
|
-
org: 'Ed',
|
|
61
|
-
title: 'test',
|
|
62
|
-
mainMenuDropdowns: [
|
|
63
|
-
{
|
|
64
|
-
id: 'testId',
|
|
65
|
-
buttonTitle: 'test',
|
|
66
|
-
items: [
|
|
67
|
-
{
|
|
68
|
-
title: 'link',
|
|
69
|
-
href: '#',
|
|
70
|
-
},
|
|
71
|
-
],
|
|
72
|
-
},
|
|
73
|
-
],
|
|
74
|
-
outlineLink: 'tEsTLInK',
|
|
75
|
-
searchButtonAction: null,
|
|
76
|
-
isNewHomePage: true,
|
|
77
|
-
// These default values shouldn't be needed but typescript is confused by propTypes; can remove after converting
|
|
78
|
-
// from propTypes to TypeScript:
|
|
79
|
-
containerProps: {},
|
|
80
|
-
isHiddenMainMenu: false,
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
describe('Header', () => {
|
|
84
|
-
beforeEach(() => {
|
|
85
|
-
jest.clearAllMocks();
|
|
86
|
-
currentUser = authenticatedUser;
|
|
87
|
-
});
|
|
88
|
-
describe('desktop', () => {
|
|
89
|
-
it('course lock up should be visible', () => {
|
|
90
|
-
const { getByTestId } = render(<RootWrapper {...props} />);
|
|
91
|
-
const courseLockUpBlock = getByTestId('course-lock-up-block');
|
|
92
|
-
|
|
93
|
-
expect(courseLockUpBlock).toBeVisible();
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it('mobile menu should not be visible', () => {
|
|
97
|
-
const { queryByTestId } = render(<RootWrapper {...props} />);
|
|
98
|
-
const mobileMenuButton = queryByTestId('mobile-menu-button');
|
|
99
|
-
|
|
100
|
-
expect(mobileMenuButton).toBeNull();
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('desktop menu should be visible', () => {
|
|
104
|
-
const { getByTestId } = render(<RootWrapper {...props} />);
|
|
105
|
-
const desktopMenu = getByTestId('desktop-menu');
|
|
106
|
-
|
|
107
|
-
expect(desktopMenu).toBeVisible();
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it('should render one dropdown', async () => {
|
|
111
|
-
const { getAllByRole, getByText } = render(<RootWrapper {...props} />);
|
|
112
|
-
const dropdownMenu = getAllByRole('button')[0];
|
|
113
|
-
|
|
114
|
-
expect(dropdownMenu).toBeVisible();
|
|
115
|
-
|
|
116
|
-
await waitFor(() => fireEvent.click(dropdownMenu));
|
|
117
|
-
const dropdownOption = getByText('link');
|
|
118
|
-
|
|
119
|
-
expect(dropdownOption).toBeVisible();
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it('maintenance should not be in user menu', async () => {
|
|
123
|
-
currentUser = { ...authenticatedUser, administrator: false };
|
|
124
|
-
const { getAllByRole, queryByText } = render(<RootWrapper {...props} />);
|
|
125
|
-
const userMenu = getAllByRole('button')[1];
|
|
126
|
-
await waitFor(() => fireEvent.click(userMenu));
|
|
127
|
-
const maintenanceButton = queryByText(messages['header.user.menu.maintenance'].defaultMessage);
|
|
128
|
-
|
|
129
|
-
expect(maintenanceButton).toBeNull();
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
it('user menu should use avatar icon', async () => {
|
|
133
|
-
currentUser = { ...authenticatedUser, avatar: null };
|
|
134
|
-
const { getByTestId } = render(<RootWrapper {...props} />);
|
|
135
|
-
const avatarIcon = getByTestId('avatar-icon');
|
|
136
|
-
|
|
137
|
-
expect(avatarIcon).toBeVisible();
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
it('should hide nav items if prop isHiddenMainMenu true', async () => {
|
|
141
|
-
const initialProps = { ...props, isHiddenMainMenu: true };
|
|
142
|
-
const { queryByTestId } = render(<RootWrapper {...initialProps} />);
|
|
143
|
-
const desktopMenu = queryByTestId('desktop-menu');
|
|
144
|
-
const mobileMenuButton = queryByTestId('mobile-menu-button');
|
|
145
|
-
|
|
146
|
-
expect(mobileMenuButton).toBeNull();
|
|
147
|
-
|
|
148
|
-
expect(desktopMenu).toBeNull();
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it('should show search button', async () => {
|
|
152
|
-
const testProps = { ...props, searchButtonAction: () => undefined };
|
|
153
|
-
const { getByRole } = render(<RootWrapper {...testProps} />);
|
|
154
|
-
const searchButton = getByRole('button', { name: 'Search content' });
|
|
155
|
-
|
|
156
|
-
expect(searchButton).toBeVisible();
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
it('should not show search button', async () => {
|
|
160
|
-
const testProps = { ...props, searchButtonAction: null };
|
|
161
|
-
const { queryByRole } = render(<RootWrapper {...testProps} />);
|
|
162
|
-
expect(queryByRole('button', { name: 'Search content' })).not.toBeInTheDocument();
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
describe('mobile', () => {
|
|
167
|
-
beforeEach(() => { screenWidth = 500; });
|
|
168
|
-
it('course lock up should not be visible', async () => {
|
|
169
|
-
const { queryByTestId } = render(<RootWrapper {...props} />);
|
|
170
|
-
const courseLockUpBlock = queryByTestId('course-lock-up-block');
|
|
171
|
-
|
|
172
|
-
expect(courseLockUpBlock).toBeNull();
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
it('mobile menu should be visible', async () => {
|
|
176
|
-
const { getByTestId } = render(<RootWrapper {...props} />);
|
|
177
|
-
const mobileMenuButton = getByTestId('mobile-menu-button');
|
|
178
|
-
|
|
179
|
-
expect(mobileMenuButton).toBeVisible();
|
|
180
|
-
await waitFor(() => fireEvent.click(mobileMenuButton));
|
|
181
|
-
const mobileMenu = getByTestId('mobile-menu');
|
|
182
|
-
|
|
183
|
-
expect(mobileMenu).toBeVisible();
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
it('desktop menu should not be visible', () => {
|
|
187
|
-
const { queryByTestId } = render(<RootWrapper {...props} />);
|
|
188
|
-
const desktopMenu = queryByTestId('desktop-menu');
|
|
189
|
-
|
|
190
|
-
expect(desktopMenu).toBeNull();
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
it('maintenance should be in user menu', async () => {
|
|
194
|
-
const { getAllByRole, getByText } = render(<RootWrapper {...props} />);
|
|
195
|
-
const userMenu = getAllByRole('button')[1];
|
|
196
|
-
await waitFor(() => fireEvent.click(userMenu));
|
|
197
|
-
const maintenanceButton = getByText(messages['header.user.menu.maintenance'].defaultMessage);
|
|
198
|
-
|
|
199
|
-
expect(maintenanceButton).toBeVisible();
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
it('user menu should use avatar image', async () => {
|
|
203
|
-
const { getByTestId } = render(<RootWrapper {...props} />);
|
|
204
|
-
const avatarImage = getByTestId('avatar-image');
|
|
205
|
-
|
|
206
|
-
expect(avatarImage).toBeVisible();
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
it('should hide nav items if prop isHiddenMainMenu true', async () => {
|
|
210
|
-
const initialProps = { ...props, isHiddenMainMenu: true };
|
|
211
|
-
const { queryByTestId } = render(<RootWrapper {...initialProps} />);
|
|
212
|
-
const desktopMenu = queryByTestId('desktop-menu');
|
|
213
|
-
const mobileMenuButton = queryByTestId('mobile-menu-button');
|
|
214
|
-
|
|
215
|
-
expect(mobileMenuButton).toBeNull();
|
|
216
|
-
|
|
217
|
-
expect(desktopMenu).toBeNull();
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
});
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import React, { useContext } from 'react';
|
|
2
|
-
import PropTypes from 'prop-types';
|
|
3
|
-
import Responsive from 'react-responsive';
|
|
4
|
-
import { AppContext } from '@edx/frontend-platform/react';
|
|
5
|
-
import { ensureConfig } from '@edx/frontend-platform';
|
|
6
|
-
|
|
7
|
-
import MobileHeader from './MobileHeader';
|
|
8
|
-
import HeaderBody from './HeaderBody';
|
|
9
|
-
|
|
10
|
-
ensureConfig([
|
|
11
|
-
'STUDIO_BASE_URL',
|
|
12
|
-
'SITE_NAME',
|
|
13
|
-
'LOGOUT_URL',
|
|
14
|
-
'LOGIN_URL',
|
|
15
|
-
'LOGO_URL',
|
|
16
|
-
], 'Studio Header component');
|
|
17
|
-
|
|
18
|
-
const StudioHeader = ({
|
|
19
|
-
number, org, title, containerProps, isHiddenMainMenu, mainMenuDropdowns,
|
|
20
|
-
outlineLink, searchButtonAction, isNewHomePage,
|
|
21
|
-
}) => {
|
|
22
|
-
// @ts-expect-error - frontend-platform doesn't yet have type information :/
|
|
23
|
-
const { authenticatedUser, config } = useContext(AppContext);
|
|
24
|
-
const props = {
|
|
25
|
-
logo: config.LOGO_URL,
|
|
26
|
-
logoAltText: `Studio ${config.SITE_NAME}`,
|
|
27
|
-
number,
|
|
28
|
-
org,
|
|
29
|
-
title,
|
|
30
|
-
containerProps,
|
|
31
|
-
username: authenticatedUser?.username,
|
|
32
|
-
isAdmin: authenticatedUser?.administrator,
|
|
33
|
-
authenticatedUserAvatar: authenticatedUser?.avatar,
|
|
34
|
-
studioBaseUrl: isNewHomePage ? '/home' : config.STUDIO_BASE_URL,
|
|
35
|
-
logoutUrl: config.LOGOUT_URL,
|
|
36
|
-
isHiddenMainMenu,
|
|
37
|
-
mainMenuDropdowns,
|
|
38
|
-
outlineLink,
|
|
39
|
-
searchButtonAction,
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
return (
|
|
43
|
-
<div className="studio-header">
|
|
44
|
-
<a className="nav-skip sr-only sr-only-focusable" href="#main">Skip to content</a>
|
|
45
|
-
<Responsive maxWidth={841}>
|
|
46
|
-
<MobileHeader {...props} />
|
|
47
|
-
</Responsive>
|
|
48
|
-
<Responsive minWidth={842}>
|
|
49
|
-
<HeaderBody {...props} />
|
|
50
|
-
</Responsive>
|
|
51
|
-
</div>
|
|
52
|
-
);
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
StudioHeader.propTypes = {
|
|
56
|
-
number: PropTypes.string,
|
|
57
|
-
org: PropTypes.string,
|
|
58
|
-
title: PropTypes.string.isRequired,
|
|
59
|
-
containerProps: HeaderBody.propTypes.containerProps,
|
|
60
|
-
isHiddenMainMenu: PropTypes.bool,
|
|
61
|
-
mainMenuDropdowns: PropTypes.arrayOf(PropTypes.shape({
|
|
62
|
-
id: PropTypes.string,
|
|
63
|
-
buttonTitle: PropTypes.node,
|
|
64
|
-
items: PropTypes.arrayOf(PropTypes.shape({
|
|
65
|
-
href: PropTypes.string,
|
|
66
|
-
title: PropTypes.node,
|
|
67
|
-
})),
|
|
68
|
-
})),
|
|
69
|
-
outlineLink: PropTypes.string,
|
|
70
|
-
searchButtonAction: PropTypes.func,
|
|
71
|
-
isNewHomePage: PropTypes.bool.isRequired,
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
StudioHeader.defaultProps = {
|
|
75
|
-
number: '',
|
|
76
|
-
org: '',
|
|
77
|
-
containerProps: {},
|
|
78
|
-
isHiddenMainMenu: false,
|
|
79
|
-
mainMenuDropdowns: [],
|
|
80
|
-
outlineLink: null,
|
|
81
|
-
searchButtonAction: null,
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
export default StudioHeader;
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import PropTypes from 'prop-types';
|
|
3
|
-
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
|
|
4
|
-
import {
|
|
5
|
-
Avatar,
|
|
6
|
-
} from '@openedx/paragon';
|
|
7
|
-
import NavDropdownMenu from './NavDropdownMenu';
|
|
8
|
-
import getUserMenuItems from './utils';
|
|
9
|
-
|
|
10
|
-
const UserMenu = ({
|
|
11
|
-
username,
|
|
12
|
-
studioBaseUrl,
|
|
13
|
-
logoutUrl,
|
|
14
|
-
authenticatedUserAvatar,
|
|
15
|
-
isMobile,
|
|
16
|
-
isAdmin,
|
|
17
|
-
// injected
|
|
18
|
-
intl,
|
|
19
|
-
}) => {
|
|
20
|
-
const avatar = authenticatedUserAvatar ? (
|
|
21
|
-
<img
|
|
22
|
-
className="d-block w-100 h-100"
|
|
23
|
-
src={authenticatedUserAvatar}
|
|
24
|
-
alt={username}
|
|
25
|
-
data-testid="avatar-image"
|
|
26
|
-
/>
|
|
27
|
-
) : (
|
|
28
|
-
<Avatar
|
|
29
|
-
size="sm"
|
|
30
|
-
className="mr-2"
|
|
31
|
-
alt={username}
|
|
32
|
-
data-testid="avatar-icon"
|
|
33
|
-
/>
|
|
34
|
-
);
|
|
35
|
-
const title = isMobile ? avatar : <>{avatar}{username}</>;
|
|
36
|
-
|
|
37
|
-
return (
|
|
38
|
-
<NavDropdownMenu
|
|
39
|
-
buttonTitle={title}
|
|
40
|
-
id="user-dropdown-menu"
|
|
41
|
-
items={getUserMenuItems({
|
|
42
|
-
studioBaseUrl,
|
|
43
|
-
logoutUrl,
|
|
44
|
-
intl,
|
|
45
|
-
isAdmin,
|
|
46
|
-
})}
|
|
47
|
-
/>
|
|
48
|
-
);
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
UserMenu.propTypes = {
|
|
52
|
-
username: PropTypes.string,
|
|
53
|
-
studioBaseUrl: PropTypes.string.isRequired,
|
|
54
|
-
logoutUrl: PropTypes.string.isRequired,
|
|
55
|
-
authenticatedUserAvatar: PropTypes.string,
|
|
56
|
-
isMobile: PropTypes.bool,
|
|
57
|
-
isAdmin: PropTypes.bool,
|
|
58
|
-
// injected
|
|
59
|
-
intl: intlShape.isRequired,
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
UserMenu.defaultProps = {
|
|
63
|
-
isMobile: false,
|
|
64
|
-
isAdmin: false,
|
|
65
|
-
authenticatedUserAvatar: null,
|
|
66
|
-
username: null,
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
export default injectIntl(UserMenu);
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { getConfig } from '@edx/frontend-platform';
|
|
2
|
-
import messages from './messages';
|
|
3
|
-
|
|
4
|
-
const getUserMenuItems = ({
|
|
5
|
-
studioBaseUrl,
|
|
6
|
-
logoutUrl,
|
|
7
|
-
intl,
|
|
8
|
-
isAdmin,
|
|
9
|
-
}) => {
|
|
10
|
-
let items = [
|
|
11
|
-
{
|
|
12
|
-
href: `${studioBaseUrl}`,
|
|
13
|
-
title: intl.formatMessage(messages['header.user.menu.studio']),
|
|
14
|
-
}, {
|
|
15
|
-
href: `${logoutUrl}`,
|
|
16
|
-
title: intl.formatMessage(messages['header.user.menu.logout']),
|
|
17
|
-
},
|
|
18
|
-
];
|
|
19
|
-
if (isAdmin) {
|
|
20
|
-
items = [
|
|
21
|
-
{
|
|
22
|
-
href: `${studioBaseUrl}`,
|
|
23
|
-
title: intl.formatMessage(messages['header.user.menu.studio']),
|
|
24
|
-
}, {
|
|
25
|
-
href: `${getConfig().STUDIO_BASE_URL}/maintenance`,
|
|
26
|
-
title: intl.formatMessage(messages['header.user.menu.maintenance']),
|
|
27
|
-
}, {
|
|
28
|
-
href: `${logoutUrl}`,
|
|
29
|
-
title: intl.formatMessage(messages['header.user.menu.logout']),
|
|
30
|
-
},
|
|
31
|
-
];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return items;
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
export default getUserMenuItems;
|