@nauedu/frontend-component-header 14.0.0-semantically-released → 18.0.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/README.rst +107 -33
- package/dist/Avatar.js +5 -7
- package/dist/Avatar.js.map +1 -1
- package/dist/DesktopHeader.js +88 -71
- package/dist/DesktopHeader.js.map +1 -1
- package/dist/Header.js +79 -39
- package/dist/Header.js.map +1 -1
- package/dist/Header.messages.js +15 -0
- package/dist/Header.messages.js.map +1 -1
- package/dist/Header.test.jsx +67 -90
- package/dist/Icons.js +1 -2
- package/dist/Icons.js.map +1 -1
- package/dist/Logo.js +11 -21
- package/dist/Logo.js.map +1 -1
- package/dist/Menu/Menu.js +42 -88
- package/dist/Menu/Menu.js.map +1 -1
- package/dist/Menu/index.js.map +1 -1
- package/dist/MobileHeader.js +80 -76
- package/dist/MobileHeader.js.map +1 -1
- package/dist/__snapshots__/Header.test.jsx.snap +8 -8
- package/dist/generic/messages.js.map +1 -1
- package/dist/i18n/index.js +1 -30
- package/dist/i18n/index.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/index.scss +11 -1
- package/dist/learning-header/AnonymousUserMenu.js +3 -5
- package/dist/learning-header/AnonymousUserMenu.js.map +1 -1
- package/dist/learning-header/AuthenticatedUserDropdown.js +8 -10
- package/dist/learning-header/AuthenticatedUserDropdown.js.map +1 -1
- package/dist/learning-header/LearningHeader.js +22 -42
- package/dist/learning-header/LearningHeader.js.map +1 -1
- package/dist/learning-header/_header.scss +5 -2
- package/dist/learning-header/data/api.js +30 -42
- package/dist/learning-header/data/api.js.map +1 -1
- package/dist/learning-header/data/api.test.js +124 -175
- package/dist/learning-header/data/api.test.js.map +1 -1
- package/dist/learning-header/messages.js.map +1 -1
- package/dist/setupTest.js +9 -13
- 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 +49 -0
- package/dist/studio-header/UserMenu.js +55 -0
- package/dist/studio-header/UserMenu.js.map +1 -0
- package/dist/studio-header/index.js +3 -0
- package/dist/studio-header/index.js.map +1 -0
- package/dist/studio-header/messages.js +60 -0
- 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 +26 -0
- package/dist/test-utils.js.map +1 -0
- package/package.json +33 -33
- package/dist/i18n/messages/ar.json +0 -30
- package/dist/i18n/messages/ca.json +0 -1
- package/dist/i18n/messages/es_419.json +0 -30
- package/dist/i18n/messages/fr.json +0 -30
- package/dist/i18n/messages/fr_CA.json +0 -30
- package/dist/i18n/messages/he.json +0 -1
- package/dist/i18n/messages/id.json +0 -1
- package/dist/i18n/messages/ko_KR.json +0 -2
- package/dist/i18n/messages/pl.json +0 -1
- package/dist/i18n/messages/pt_BR.json +0 -2
- package/dist/i18n/messages/ru.json +0 -1
- package/dist/i18n/messages/th.json +0 -1
- package/dist/i18n/messages/uk.json +0 -1
- package/dist/i18n/messages/zh_CN.json +0 -30
package/dist/setupTest.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
/* eslint-disable import/no-extraneous-dependencies */
|
|
2
2
|
|
|
3
|
-
import Enzyme from 'enzyme';
|
|
4
3
|
import React from 'react';
|
|
5
4
|
import PropTypes from 'prop-types';
|
|
6
|
-
import Adapter from 'enzyme-adapter-react-16';
|
|
7
5
|
import '@testing-library/jest-dom';
|
|
8
6
|
import '@testing-library/jest-dom/extend-expect';
|
|
9
7
|
import 'babel-polyfill';
|
|
@@ -17,11 +15,11 @@ import { IntlProvider } from 'react-intl';
|
|
|
17
15
|
import AppProvider from '@edx/frontend-platform/react/AppProvider';
|
|
18
16
|
import appMessages from './i18n';
|
|
19
17
|
|
|
20
|
-
Enzyme.configure({ adapter: new Adapter() });
|
|
21
|
-
|
|
22
18
|
// These configuration values are usually set in webpack's EnvironmentPlugin however
|
|
23
19
|
// Jest does not use webpack so we need to set these so for testing
|
|
24
20
|
process.env.ACCESS_TOKEN_COOKIE_NAME = 'edx-jwt-cookie-header-payload';
|
|
21
|
+
process.env.ACCOUNT_PROFILE_URL = 'http://localhost:1995';
|
|
22
|
+
process.env.ACCOUNT_SETTINGS_URL = 'http://localhost:1997';
|
|
25
23
|
process.env.BASE_URL = 'localhost:1995';
|
|
26
24
|
process.env.CREDENTIALS_BASE_URL = 'http://localhost:18150';
|
|
27
25
|
process.env.CSRF_TOKEN_API_PATH = '/csrf/api/v1/token';
|
|
@@ -102,16 +100,14 @@ function render(
|
|
|
102
100
|
...renderOptions
|
|
103
101
|
} = {},
|
|
104
102
|
) {
|
|
105
|
-
|
|
106
|
-
return (
|
|
103
|
+
const Wrapper = ({ children }) => (
|
|
107
104
|
// eslint-disable-next-line react/jsx-filename-extension
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
105
|
+
<IntlProvider locale="en">
|
|
106
|
+
<AppProvider store={store}>
|
|
107
|
+
{children}
|
|
108
|
+
</AppProvider>
|
|
109
|
+
</IntlProvider>
|
|
110
|
+
);
|
|
115
111
|
|
|
116
112
|
Wrapper.propTypes = {
|
|
117
113
|
children: PropTypes.node.isRequired,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
var BrandNav = function BrandNav(_ref) {
|
|
4
|
+
var studioBaseUrl = _ref.studioBaseUrl,
|
|
5
|
+
logo = _ref.logo,
|
|
6
|
+
logoAltText = _ref.logoAltText;
|
|
7
|
+
return /*#__PURE__*/React.createElement("a", {
|
|
8
|
+
href: studioBaseUrl
|
|
9
|
+
}, /*#__PURE__*/React.createElement("img", {
|
|
10
|
+
src: logo,
|
|
11
|
+
alt: logoAltText,
|
|
12
|
+
className: "d-block logo"
|
|
13
|
+
}));
|
|
14
|
+
};
|
|
15
|
+
BrandNav.propTypes = {
|
|
16
|
+
studioBaseUrl: PropTypes.string.isRequired,
|
|
17
|
+
logo: PropTypes.string.isRequired,
|
|
18
|
+
logoAltText: PropTypes.string.isRequired
|
|
19
|
+
};
|
|
20
|
+
export default BrandNav;
|
|
21
|
+
//# sourceMappingURL=BrandNav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrandNav.js","names":["React","PropTypes","BrandNav","_ref","studioBaseUrl","logo","logoAltText","createElement","href","src","alt","className","propTypes","string","isRequired"],"sources":["../../src/studio-header/BrandNav.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst BrandNav = ({\n studioBaseUrl,\n logo,\n logoAltText,\n}) => (\n <a href={studioBaseUrl}>\n <img\n src={logo}\n alt={logoAltText}\n className=\"d-block logo\"\n />\n </a>\n);\n\nBrandNav.propTypes = {\n studioBaseUrl: PropTypes.string.isRequired,\n logo: PropTypes.string.isRequired,\n logoAltText: PropTypes.string.isRequired,\n};\n\nexport default BrandNav;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,SAAS,MAAM,YAAY;AAElC,IAAMC,QAAQ,GAAG,SAAXA,QAAQA,CAAAC,IAAA;EAAA,IACZC,aAAa,GAAAD,IAAA,CAAbC,aAAa;IACbC,IAAI,GAAAF,IAAA,CAAJE,IAAI;IACJC,WAAW,GAAAH,IAAA,CAAXG,WAAW;EAAA,oBAEXN,KAAA,CAAAO,aAAA;IAAGC,IAAI,EAAEJ;EAAc,gBACrBJ,KAAA,CAAAO,aAAA;IACEE,GAAG,EAAEJ,IAAK;IACVK,GAAG,EAAEJ,WAAY;IACjBK,SAAS,EAAC;EAAc,CACzB,CACA,CAAC;AAAA,CACL;AAEDT,QAAQ,CAACU,SAAS,GAAG;EACnBR,aAAa,EAAEH,SAAS,CAACY,MAAM,CAACC,UAAU;EAC1CT,IAAI,EAAEJ,SAAS,CAACY,MAAM,CAACC,UAAU;EACjCR,WAAW,EAAEL,SAAS,CAACY,MAAM,CAACC;AAChC,CAAC;AAED,eAAeZ,QAAQ","ignoreList":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
|
|
4
|
+
import { OverlayTrigger, Tooltip } from '@openedx/paragon';
|
|
5
|
+
import messages from './messages';
|
|
6
|
+
var CourseLockUp = function CourseLockUp(_ref) {
|
|
7
|
+
var outlineLink = _ref.outlineLink,
|
|
8
|
+
org = _ref.org,
|
|
9
|
+
number = _ref.number,
|
|
10
|
+
title = _ref.title,
|
|
11
|
+
intl = _ref.intl;
|
|
12
|
+
return /*#__PURE__*/React.createElement(OverlayTrigger, {
|
|
13
|
+
placement: "bottom",
|
|
14
|
+
overlay: /*#__PURE__*/React.createElement(Tooltip, {
|
|
15
|
+
id: "course-lock-up"
|
|
16
|
+
}, title)
|
|
17
|
+
}, /*#__PURE__*/React.createElement("a", {
|
|
18
|
+
className: "course-title-lockup mr-2",
|
|
19
|
+
href: outlineLink,
|
|
20
|
+
"aria-label": intl.formatMessage(messages['header.label.courseOutline']),
|
|
21
|
+
"data-testid": "course-lock-up-block"
|
|
22
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
23
|
+
className: "d-block small m-0 text-gray-800",
|
|
24
|
+
"data-testid": "course-org-number"
|
|
25
|
+
}, org, " ", number), /*#__PURE__*/React.createElement("span", {
|
|
26
|
+
className: "d-block m-0 font-weight-bold text-gray-800",
|
|
27
|
+
"data-testid": "course-title"
|
|
28
|
+
}, title)));
|
|
29
|
+
};
|
|
30
|
+
CourseLockUp.propTypes = {
|
|
31
|
+
number: PropTypes.string,
|
|
32
|
+
org: PropTypes.string,
|
|
33
|
+
title: PropTypes.string,
|
|
34
|
+
outlineLink: PropTypes.string,
|
|
35
|
+
// injected
|
|
36
|
+
intl: intlShape.isRequired
|
|
37
|
+
};
|
|
38
|
+
CourseLockUp.defaultProps = {
|
|
39
|
+
number: null,
|
|
40
|
+
org: null,
|
|
41
|
+
title: null,
|
|
42
|
+
outlineLink: null
|
|
43
|
+
};
|
|
44
|
+
export default injectIntl(CourseLockUp);
|
|
45
|
+
//# sourceMappingURL=CourseLockUp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CourseLockUp.js","names":["React","PropTypes","injectIntl","intlShape","OverlayTrigger","Tooltip","messages","CourseLockUp","_ref","outlineLink","org","number","title","intl","createElement","placement","overlay","id","className","href","formatMessage","propTypes","string","isRequired","defaultProps"],"sources":["../../src/studio-header/CourseLockUp.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n OverlayTrigger,\n Tooltip,\n} from '@openedx/paragon';\nimport messages from './messages';\n\nconst CourseLockUp = ({\n outlineLink,\n org,\n number,\n title,\n // injected\n intl,\n}) => (\n <OverlayTrigger\n placement=\"bottom\"\n overlay={(\n <Tooltip id=\"course-lock-up\">\n {title}\n </Tooltip>\n )}\n >\n <a\n className=\"course-title-lockup mr-2\"\n href={outlineLink}\n aria-label={intl.formatMessage(messages['header.label.courseOutline'])}\n data-testid=\"course-lock-up-block\"\n >\n <span className=\"d-block small m-0 text-gray-800\" data-testid=\"course-org-number\">{org} {number}</span>\n <span className=\"d-block m-0 font-weight-bold text-gray-800\" data-testid=\"course-title\">{title}</span>\n </a>\n </OverlayTrigger>\n);\n\nCourseLockUp.propTypes = {\n number: PropTypes.string,\n org: PropTypes.string,\n title: PropTypes.string,\n outlineLink: PropTypes.string,\n // injected\n intl: intlShape.isRequired,\n};\n\nCourseLockUp.defaultProps = {\n number: null,\n org: null,\n title: null,\n outlineLink: null,\n};\n\nexport default injectIntl(CourseLockUp);\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,SAAS,MAAM,YAAY;AAClC,SAASC,UAAU,EAAEC,SAAS,QAAQ,6BAA6B;AACnE,SACEC,cAAc,EACdC,OAAO,QACF,kBAAkB;AACzB,OAAOC,QAAQ,MAAM,YAAY;AAEjC,IAAMC,YAAY,GAAG,SAAfA,YAAYA,CAAAC,IAAA;EAAA,IAChBC,WAAW,GAAAD,IAAA,CAAXC,WAAW;IACXC,GAAG,GAAAF,IAAA,CAAHE,GAAG;IACHC,MAAM,GAAAH,IAAA,CAANG,MAAM;IACNC,KAAK,GAAAJ,IAAA,CAALI,KAAK;IAELC,IAAI,GAAAL,IAAA,CAAJK,IAAI;EAAA,oBAEJb,KAAA,CAAAc,aAAA,CAACV,cAAc;IACbW,SAAS,EAAC,QAAQ;IAClBC,OAAO,eACLhB,KAAA,CAAAc,aAAA,CAACT,OAAO;MAACY,EAAE,EAAC;IAAgB,GACzBL,KACM;EACT,gBAEFZ,KAAA,CAAAc,aAAA;IACEI,SAAS,EAAC,0BAA0B;IACpCC,IAAI,EAAEV,WAAY;IAClB,cAAYI,IAAI,CAACO,aAAa,CAACd,QAAQ,CAAC,4BAA4B,CAAC,CAAE;IACvE,eAAY;EAAsB,gBAElCN,KAAA,CAAAc,aAAA;IAAMI,SAAS,EAAC,iCAAiC;IAAC,eAAY;EAAmB,GAAER,GAAG,EAAC,GAAC,EAACC,MAAa,CAAC,eACvGX,KAAA,CAAAc,aAAA;IAAMI,SAAS,EAAC,4CAA4C;IAAC,eAAY;EAAc,GAAEN,KAAY,CACpG,CACW,CAAC;AAAA,CAClB;AAEDL,YAAY,CAACc,SAAS,GAAG;EACvBV,MAAM,EAAEV,SAAS,CAACqB,MAAM;EACxBZ,GAAG,EAAET,SAAS,CAACqB,MAAM;EACrBV,KAAK,EAAEX,SAAS,CAACqB,MAAM;EACvBb,WAAW,EAAER,SAAS,CAACqB,MAAM;EAC7B;EACAT,IAAI,EAAEV,SAAS,CAACoB;AAClB,CAAC;AAEDhB,YAAY,CAACiB,YAAY,GAAG;EAC1Bb,MAAM,EAAE,IAAI;EACZD,GAAG,EAAE,IAAI;EACTE,KAAK,EAAE,IAAI;EACXH,WAAW,EAAE;AACf,CAAC;AAED,eAAeP,UAAU,CAACK,YAAY,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { useIntl } from '@edx/frontend-platform/i18n';
|
|
4
|
+
import { ActionRow, Button, Container, Icon, IconButton, Nav, Row } from '@openedx/paragon';
|
|
5
|
+
import { Close, MenuIcon, Search } from '@openedx/paragon/icons';
|
|
6
|
+
import CourseLockUp from './CourseLockUp';
|
|
7
|
+
import UserMenu from './UserMenu';
|
|
8
|
+
import BrandNav from './BrandNav';
|
|
9
|
+
import NavDropdownMenu from './NavDropdownMenu';
|
|
10
|
+
import messages from './messages';
|
|
11
|
+
var HeaderBody = function HeaderBody(_ref) {
|
|
12
|
+
var logo = _ref.logo,
|
|
13
|
+
logoAltText = _ref.logoAltText,
|
|
14
|
+
number = _ref.number,
|
|
15
|
+
org = _ref.org,
|
|
16
|
+
title = _ref.title,
|
|
17
|
+
username = _ref.username,
|
|
18
|
+
isAdmin = _ref.isAdmin,
|
|
19
|
+
studioBaseUrl = _ref.studioBaseUrl,
|
|
20
|
+
logoutUrl = _ref.logoutUrl,
|
|
21
|
+
authenticatedUserAvatar = _ref.authenticatedUserAvatar,
|
|
22
|
+
isMobile = _ref.isMobile,
|
|
23
|
+
setModalPopupTarget = _ref.setModalPopupTarget,
|
|
24
|
+
toggleModalPopup = _ref.toggleModalPopup,
|
|
25
|
+
isModalPopupOpen = _ref.isModalPopupOpen,
|
|
26
|
+
isHiddenMainMenu = _ref.isHiddenMainMenu,
|
|
27
|
+
mainMenuDropdowns = _ref.mainMenuDropdowns,
|
|
28
|
+
outlineLink = _ref.outlineLink,
|
|
29
|
+
searchButtonAction = _ref.searchButtonAction;
|
|
30
|
+
var intl = useIntl();
|
|
31
|
+
var renderBrandNav = /*#__PURE__*/React.createElement(BrandNav, {
|
|
32
|
+
studioBaseUrl: studioBaseUrl,
|
|
33
|
+
logo: logo,
|
|
34
|
+
logoAltText: logoAltText
|
|
35
|
+
});
|
|
36
|
+
return /*#__PURE__*/React.createElement(Container, {
|
|
37
|
+
size: "xl",
|
|
38
|
+
className: "px-2.5"
|
|
39
|
+
}, /*#__PURE__*/React.createElement(ActionRow, {
|
|
40
|
+
as: "header"
|
|
41
|
+
}, isHiddenMainMenu ? /*#__PURE__*/React.createElement(Row, {
|
|
42
|
+
className: "flex-nowrap ml-4"
|
|
43
|
+
}, renderBrandNav) : /*#__PURE__*/React.createElement(React.Fragment, null, isMobile ? /*#__PURE__*/React.createElement(Button, {
|
|
44
|
+
ref: setModalPopupTarget,
|
|
45
|
+
className: "d-inline-flex align-items-center",
|
|
46
|
+
variant: "tertiary",
|
|
47
|
+
onClick: toggleModalPopup,
|
|
48
|
+
iconBefore: isModalPopupOpen ? Close : MenuIcon,
|
|
49
|
+
"data-testid": "mobile-menu-button"
|
|
50
|
+
}, "Menu") : /*#__PURE__*/React.createElement("div", {
|
|
51
|
+
className: "w-25"
|
|
52
|
+
}, /*#__PURE__*/React.createElement(Row, {
|
|
53
|
+
className: "m-0 flex-nowrap"
|
|
54
|
+
}, renderBrandNav, /*#__PURE__*/React.createElement(CourseLockUp, {
|
|
55
|
+
outlineLink: outlineLink,
|
|
56
|
+
number: number,
|
|
57
|
+
org: org,
|
|
58
|
+
title: title
|
|
59
|
+
}))), isMobile ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ActionRow.Spacer, null), renderBrandNav) : /*#__PURE__*/React.createElement(Nav, {
|
|
60
|
+
"data-testid": "desktop-menu",
|
|
61
|
+
className: "ml-2"
|
|
62
|
+
}, mainMenuDropdowns.map(function (dropdown) {
|
|
63
|
+
var id = dropdown.id,
|
|
64
|
+
buttonTitle = dropdown.buttonTitle,
|
|
65
|
+
items = dropdown.items;
|
|
66
|
+
return /*#__PURE__*/React.createElement(NavDropdownMenu, {
|
|
67
|
+
key: id,
|
|
68
|
+
id: id,
|
|
69
|
+
buttonTitle: buttonTitle,
|
|
70
|
+
items: items
|
|
71
|
+
});
|
|
72
|
+
}))), /*#__PURE__*/React.createElement(ActionRow.Spacer, null), searchButtonAction && /*#__PURE__*/React.createElement(Nav, null, /*#__PURE__*/React.createElement(IconButton, {
|
|
73
|
+
src: Search,
|
|
74
|
+
iconAs: Icon,
|
|
75
|
+
onClick: searchButtonAction,
|
|
76
|
+
"aria-label": intl.formatMessage(messages['header.label.search.nav'])
|
|
77
|
+
})), /*#__PURE__*/React.createElement(Nav, null, /*#__PURE__*/React.createElement(UserMenu, {
|
|
78
|
+
username: username,
|
|
79
|
+
studioBaseUrl: studioBaseUrl,
|
|
80
|
+
logoutUrl: logoutUrl,
|
|
81
|
+
authenticatedUserAvatar: authenticatedUserAvatar,
|
|
82
|
+
isAdmin: isAdmin
|
|
83
|
+
}))));
|
|
84
|
+
};
|
|
85
|
+
HeaderBody.propTypes = {
|
|
86
|
+
studioBaseUrl: PropTypes.string.isRequired,
|
|
87
|
+
logoutUrl: PropTypes.string.isRequired,
|
|
88
|
+
setModalPopupTarget: PropTypes.func,
|
|
89
|
+
toggleModalPopup: PropTypes.func,
|
|
90
|
+
isModalPopupOpen: PropTypes.bool,
|
|
91
|
+
number: PropTypes.string,
|
|
92
|
+
org: PropTypes.string,
|
|
93
|
+
title: PropTypes.string,
|
|
94
|
+
logo: PropTypes.string,
|
|
95
|
+
logoAltText: PropTypes.string,
|
|
96
|
+
authenticatedUserAvatar: PropTypes.string,
|
|
97
|
+
username: PropTypes.string,
|
|
98
|
+
isAdmin: PropTypes.bool,
|
|
99
|
+
isMobile: PropTypes.bool,
|
|
100
|
+
isHiddenMainMenu: PropTypes.bool,
|
|
101
|
+
mainMenuDropdowns: PropTypes.arrayOf(PropTypes.shape({
|
|
102
|
+
id: PropTypes.string,
|
|
103
|
+
buttonTitle: PropTypes.string,
|
|
104
|
+
items: PropTypes.arrayOf(PropTypes.shape({
|
|
105
|
+
href: PropTypes.string,
|
|
106
|
+
title: PropTypes.string
|
|
107
|
+
}))
|
|
108
|
+
})),
|
|
109
|
+
outlineLink: PropTypes.string,
|
|
110
|
+
searchButtonAction: PropTypes.func
|
|
111
|
+
};
|
|
112
|
+
HeaderBody.defaultProps = {
|
|
113
|
+
setModalPopupTarget: null,
|
|
114
|
+
toggleModalPopup: null,
|
|
115
|
+
isModalPopupOpen: false,
|
|
116
|
+
logo: null,
|
|
117
|
+
logoAltText: null,
|
|
118
|
+
number: '',
|
|
119
|
+
org: '',
|
|
120
|
+
title: '',
|
|
121
|
+
authenticatedUserAvatar: null,
|
|
122
|
+
username: null,
|
|
123
|
+
isAdmin: false,
|
|
124
|
+
isMobile: false,
|
|
125
|
+
isHiddenMainMenu: false,
|
|
126
|
+
mainMenuDropdowns: [],
|
|
127
|
+
outlineLink: null,
|
|
128
|
+
searchButtonAction: null
|
|
129
|
+
};
|
|
130
|
+
export default HeaderBody;
|
|
131
|
+
//# sourceMappingURL=HeaderBody.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeaderBody.js","names":["React","PropTypes","useIntl","ActionRow","Button","Container","Icon","IconButton","Nav","Row","Close","MenuIcon","Search","CourseLockUp","UserMenu","BrandNav","NavDropdownMenu","messages","HeaderBody","_ref","logo","logoAltText","number","org","title","username","isAdmin","studioBaseUrl","logoutUrl","authenticatedUserAvatar","isMobile","setModalPopupTarget","toggleModalPopup","isModalPopupOpen","isHiddenMainMenu","mainMenuDropdowns","outlineLink","searchButtonAction","intl","renderBrandNav","createElement","size","className","as","Fragment","ref","variant","onClick","iconBefore","Spacer","map","dropdown","id","buttonTitle","items","key","src","iconAs","formatMessage","propTypes","string","isRequired","func","bool","arrayOf","shape","href","defaultProps"],"sources":["../../src/studio-header/HeaderBody.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow,\n Button,\n Container,\n Icon,\n IconButton,\n Nav,\n Row,\n} from '@openedx/paragon';\nimport { Close, MenuIcon, Search } from '@openedx/paragon/icons';\n\nimport CourseLockUp from './CourseLockUp';\nimport UserMenu from './UserMenu';\nimport BrandNav from './BrandNav';\nimport NavDropdownMenu from './NavDropdownMenu';\nimport messages from './messages';\n\nconst HeaderBody = ({\n logo,\n logoAltText,\n number,\n org,\n title,\n username,\n isAdmin,\n studioBaseUrl,\n logoutUrl,\n authenticatedUserAvatar,\n isMobile,\n setModalPopupTarget,\n toggleModalPopup,\n isModalPopupOpen,\n isHiddenMainMenu,\n mainMenuDropdowns,\n outlineLink,\n searchButtonAction,\n}) => {\n const intl = useIntl();\n\n const renderBrandNav = (\n <BrandNav\n {...{\n studioBaseUrl,\n logo,\n logoAltText,\n }}\n />\n );\n\n return (\n <Container size=\"xl\" className=\"px-2.5\">\n <ActionRow as=\"header\">\n {isHiddenMainMenu ? (\n <Row className=\"flex-nowrap ml-4\">\n {renderBrandNav}\n </Row>\n ) : (\n <>\n {isMobile ? (\n <Button\n ref={setModalPopupTarget}\n className=\"d-inline-flex align-items-center\"\n variant=\"tertiary\"\n onClick={toggleModalPopup}\n iconBefore={isModalPopupOpen ? Close : MenuIcon}\n data-testid=\"mobile-menu-button\"\n >\n Menu\n </Button>\n ) : (\n <div className=\"w-25\">\n <Row className=\"m-0 flex-nowrap\">\n {renderBrandNav}\n <CourseLockUp\n {...{\n outlineLink,\n number,\n org,\n title,\n }}\n />\n </Row>\n </div>\n )}\n {isMobile ? (\n <>\n <ActionRow.Spacer />\n {renderBrandNav}\n </>\n ) : (\n <Nav data-testid=\"desktop-menu\" className=\"ml-2\">\n {mainMenuDropdowns.map(dropdown => {\n const { id, buttonTitle, items } = dropdown;\n return (\n <NavDropdownMenu key={id} {...{ id, buttonTitle, items }} />\n );\n })}\n </Nav>\n )}\n </>\n )}\n <ActionRow.Spacer />\n {searchButtonAction && (\n <Nav>\n <IconButton\n src={Search}\n iconAs={Icon}\n onClick={searchButtonAction}\n aria-label={intl.formatMessage(messages['header.label.search.nav'])}\n />\n </Nav>\n )}\n <Nav>\n <UserMenu\n {...{\n username,\n studioBaseUrl,\n logoutUrl,\n authenticatedUserAvatar,\n isAdmin,\n }}\n />\n </Nav>\n </ActionRow>\n </Container>\n );\n};\n\nHeaderBody.propTypes = {\n studioBaseUrl: PropTypes.string.isRequired,\n logoutUrl: PropTypes.string.isRequired,\n setModalPopupTarget: PropTypes.func,\n toggleModalPopup: PropTypes.func,\n isModalPopupOpen: PropTypes.bool,\n number: PropTypes.string,\n org: PropTypes.string,\n title: PropTypes.string,\n logo: PropTypes.string,\n logoAltText: PropTypes.string,\n authenticatedUserAvatar: PropTypes.string,\n username: PropTypes.string,\n isAdmin: PropTypes.bool,\n isMobile: PropTypes.bool,\n isHiddenMainMenu: PropTypes.bool,\n mainMenuDropdowns: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string,\n buttonTitle: PropTypes.string,\n items: PropTypes.arrayOf(PropTypes.shape({\n href: PropTypes.string,\n title: PropTypes.string,\n })),\n })),\n outlineLink: PropTypes.string,\n searchButtonAction: PropTypes.func,\n};\n\nHeaderBody.defaultProps = {\n setModalPopupTarget: null,\n toggleModalPopup: null,\n isModalPopupOpen: false,\n logo: null,\n logoAltText: null,\n number: '',\n org: '',\n title: '',\n authenticatedUserAvatar: null,\n username: null,\n isAdmin: false,\n isMobile: false,\n isHiddenMainMenu: false,\n mainMenuDropdowns: [],\n outlineLink: null,\n searchButtonAction: null,\n};\n\nexport default HeaderBody;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
var _excluded = ["mainMenuDropdowns"];
|
|
2
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
3
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
4
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
5
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
6
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
7
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
8
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
9
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
10
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
11
|
+
import React, { useState } from 'react';
|
|
12
|
+
import PropTypes from 'prop-types';
|
|
13
|
+
import { useToggle, ModalPopup } from '@openedx/paragon';
|
|
14
|
+
import HeaderBody from './HeaderBody';
|
|
15
|
+
import MobileMenu from './MobileMenu';
|
|
16
|
+
var MobileHeader = function MobileHeader(_ref) {
|
|
17
|
+
var mainMenuDropdowns = _ref.mainMenuDropdowns,
|
|
18
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
19
|
+
var _useToggle = useToggle(false),
|
|
20
|
+
_useToggle2 = _slicedToArray(_useToggle, 4),
|
|
21
|
+
isOpen = _useToggle2[0],
|
|
22
|
+
close = _useToggle2[2],
|
|
23
|
+
toggle = _useToggle2[3];
|
|
24
|
+
var _useState = useState(null),
|
|
25
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
26
|
+
target = _useState2[0],
|
|
27
|
+
setTarget = _useState2[1];
|
|
28
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(HeaderBody, _extends({}, props, {
|
|
29
|
+
isMobile: true,
|
|
30
|
+
setModalPopupTarget: setTarget,
|
|
31
|
+
toggleModalPopup: toggle,
|
|
32
|
+
isModalPopupOpen: isOpen
|
|
33
|
+
})), /*#__PURE__*/React.createElement(ModalPopup, {
|
|
34
|
+
hasArrow: true,
|
|
35
|
+
placement: "bottom",
|
|
36
|
+
positionRef: target,
|
|
37
|
+
isOpen: isOpen,
|
|
38
|
+
onClose: close,
|
|
39
|
+
onEscapeKey: close,
|
|
40
|
+
className: "mobile-menu-container"
|
|
41
|
+
}, /*#__PURE__*/React.createElement(MobileMenu, {
|
|
42
|
+
mainMenuDropdowns: mainMenuDropdowns
|
|
43
|
+
})));
|
|
44
|
+
};
|
|
45
|
+
MobileHeader.propTypes = {
|
|
46
|
+
studioBaseUrl: PropTypes.string.isRequired,
|
|
47
|
+
logoutUrl: PropTypes.string.isRequired,
|
|
48
|
+
number: PropTypes.string,
|
|
49
|
+
org: PropTypes.string,
|
|
50
|
+
title: PropTypes.string,
|
|
51
|
+
logo: PropTypes.string,
|
|
52
|
+
logoAltText: PropTypes.string,
|
|
53
|
+
authenticatedUserAvatar: PropTypes.string,
|
|
54
|
+
username: PropTypes.string,
|
|
55
|
+
isAdmin: PropTypes.bool,
|
|
56
|
+
mainMenuDropdowns: PropTypes.arrayOf(PropTypes.shape({
|
|
57
|
+
id: PropTypes.string,
|
|
58
|
+
buttonTitle: PropTypes.string,
|
|
59
|
+
items: PropTypes.arrayOf(PropTypes.shape({
|
|
60
|
+
href: PropTypes.string,
|
|
61
|
+
title: PropTypes.string
|
|
62
|
+
}))
|
|
63
|
+
})),
|
|
64
|
+
outlineLink: PropTypes.string
|
|
65
|
+
};
|
|
66
|
+
MobileHeader.defaultProps = {
|
|
67
|
+
logo: null,
|
|
68
|
+
logoAltText: null,
|
|
69
|
+
number: null,
|
|
70
|
+
org: null,
|
|
71
|
+
title: null,
|
|
72
|
+
authenticatedUserAvatar: null,
|
|
73
|
+
username: null,
|
|
74
|
+
isAdmin: false,
|
|
75
|
+
mainMenuDropdowns: [],
|
|
76
|
+
outlineLink: null
|
|
77
|
+
};
|
|
78
|
+
export default MobileHeader;
|
|
79
|
+
//# sourceMappingURL=MobileHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobileHeader.js","names":["React","useState","PropTypes","useToggle","ModalPopup","HeaderBody","MobileMenu","MobileHeader","_ref","mainMenuDropdowns","props","_objectWithoutProperties","_excluded","_useToggle","_useToggle2","_slicedToArray","isOpen","close","toggle","_useState","_useState2","target","setTarget","createElement","Fragment","_extends","isMobile","setModalPopupTarget","toggleModalPopup","isModalPopupOpen","hasArrow","placement","positionRef","onClose","onEscapeKey","className","propTypes","studioBaseUrl","string","isRequired","logoutUrl","number","org","title","logo","logoAltText","authenticatedUserAvatar","username","isAdmin","bool","arrayOf","shape","id","buttonTitle","items","href","outlineLink","defaultProps"],"sources":["../../src/studio-header/MobileHeader.jsx"],"sourcesContent":["import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useToggle, ModalPopup } from '@openedx/paragon';\nimport HeaderBody from './HeaderBody';\nimport MobileMenu from './MobileMenu';\n\nconst MobileHeader = ({\n mainMenuDropdowns,\n ...props\n}) => {\n const [isOpen, , close, toggle] = useToggle(false);\n const [target, setTarget] = useState(null);\n\n return (\n <>\n <HeaderBody\n {...props}\n isMobile\n setModalPopupTarget={setTarget}\n toggleModalPopup={toggle}\n isModalPopupOpen={isOpen}\n />\n <ModalPopup\n hasArrow\n placement=\"bottom\"\n positionRef={target}\n isOpen={isOpen}\n onClose={close}\n onEscapeKey={close}\n className=\"mobile-menu-container\"\n >\n <MobileMenu {...{ mainMenuDropdowns }} />\n </ModalPopup>\n </>\n );\n};\n\nMobileHeader.propTypes = {\n studioBaseUrl: PropTypes.string.isRequired,\n logoutUrl: PropTypes.string.isRequired,\n number: PropTypes.string,\n org: PropTypes.string,\n title: PropTypes.string,\n logo: PropTypes.string,\n logoAltText: PropTypes.string,\n authenticatedUserAvatar: PropTypes.string,\n username: PropTypes.string,\n isAdmin: PropTypes.bool,\n mainMenuDropdowns: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string,\n buttonTitle: PropTypes.string,\n items: PropTypes.arrayOf(PropTypes.shape({\n href: PropTypes.string,\n title: PropTypes.string,\n })),\n })),\n outlineLink: PropTypes.string,\n};\n\nMobileHeader.defaultProps = {\n logo: null,\n logoAltText: null,\n number: null,\n org: null,\n title: null,\n authenticatedUserAvatar: null,\n username: null,\n isAdmin: false,\n mainMenuDropdowns: [],\n outlineLink: null,\n};\n\nexport default MobileHeader;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { Collapsible } from '@openedx/paragon';
|
|
4
|
+
var MobileMenu = function MobileMenu(_ref) {
|
|
5
|
+
var mainMenuDropdowns = _ref.mainMenuDropdowns;
|
|
6
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
7
|
+
className: "ml-4 p-2 bg-light-100 border border-gray-200 small rounded",
|
|
8
|
+
"data-testid": "mobile-menu"
|
|
9
|
+
}, /*#__PURE__*/React.createElement("div", null, mainMenuDropdowns.map(function (dropdown) {
|
|
10
|
+
var id = dropdown.id,
|
|
11
|
+
buttonTitle = dropdown.buttonTitle,
|
|
12
|
+
items = dropdown.items;
|
|
13
|
+
return /*#__PURE__*/React.createElement(Collapsible, {
|
|
14
|
+
className: "border-light-100",
|
|
15
|
+
title: buttonTitle,
|
|
16
|
+
key: id
|
|
17
|
+
}, /*#__PURE__*/React.createElement("ul", {
|
|
18
|
+
className: "p-0",
|
|
19
|
+
style: {
|
|
20
|
+
listStyleType: 'none'
|
|
21
|
+
}
|
|
22
|
+
}, items.map(function (item) {
|
|
23
|
+
return /*#__PURE__*/React.createElement("li", {
|
|
24
|
+
className: "mobile-menu-item"
|
|
25
|
+
}, /*#__PURE__*/React.createElement("a", {
|
|
26
|
+
href: item.href
|
|
27
|
+
}, item.title));
|
|
28
|
+
})));
|
|
29
|
+
})));
|
|
30
|
+
};
|
|
31
|
+
MobileMenu.propTypes = {
|
|
32
|
+
mainMenuDropdowns: PropTypes.arrayOf(PropTypes.shape({
|
|
33
|
+
id: PropTypes.string,
|
|
34
|
+
buttonTitle: PropTypes.string,
|
|
35
|
+
items: PropTypes.arrayOf(PropTypes.shape({
|
|
36
|
+
href: PropTypes.string,
|
|
37
|
+
title: PropTypes.string
|
|
38
|
+
}))
|
|
39
|
+
}))
|
|
40
|
+
};
|
|
41
|
+
MobileMenu.defaultProps = {
|
|
42
|
+
mainMenuDropdowns: []
|
|
43
|
+
};
|
|
44
|
+
export default MobileMenu;
|
|
45
|
+
//# sourceMappingURL=MobileMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobileMenu.js","names":["React","PropTypes","Collapsible","MobileMenu","_ref","mainMenuDropdowns","createElement","className","map","dropdown","id","buttonTitle","items","title","key","style","listStyleType","item","href","propTypes","arrayOf","shape","string","defaultProps"],"sources":["../../src/studio-header/MobileMenu.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Collapsible } from '@openedx/paragon';\n\nconst MobileMenu = ({\n mainMenuDropdowns,\n}) => (\n <div\n className=\"ml-4 p-2 bg-light-100 border border-gray-200 small rounded\"\n data-testid=\"mobile-menu\"\n >\n <div>\n {mainMenuDropdowns.map(dropdown => {\n const { id, buttonTitle, items } = dropdown;\n return (\n <Collapsible\n className=\"border-light-100\"\n title={buttonTitle}\n key={id}\n >\n <ul className=\"p-0\" style={{ listStyleType: 'none' }}>\n {items.map(item => (\n <li className=\"mobile-menu-item\">\n <a href={item.href}>\n {item.title}\n </a>\n </li>\n ))}\n </ul>\n </Collapsible>\n );\n })}\n </div>\n </div>\n);\n\nMobileMenu.propTypes = {\n mainMenuDropdowns: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string,\n buttonTitle: PropTypes.string,\n items: PropTypes.arrayOf(PropTypes.shape({\n href: PropTypes.string,\n title: PropTypes.string,\n })),\n })),\n};\nMobileMenu.defaultProps = {\n mainMenuDropdowns: [],\n};\n\nexport default MobileMenu;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,SAAS,MAAM,YAAY;AAClC,SAASC,WAAW,QAAQ,kBAAkB;AAE9C,IAAMC,UAAU,GAAG,SAAbA,UAAUA,CAAAC,IAAA;EAAA,IACdC,iBAAiB,GAAAD,IAAA,CAAjBC,iBAAiB;EAAA,oBAEjBL,KAAA,CAAAM,aAAA;IACEC,SAAS,EAAC,4DAA4D;IACtE,eAAY;EAAa,gBAEzBP,KAAA,CAAAM,aAAA,cACGD,iBAAiB,CAACG,GAAG,CAAC,UAAAC,QAAQ,EAAI;IACjC,IAAQC,EAAE,GAAyBD,QAAQ,CAAnCC,EAAE;MAAEC,WAAW,GAAYF,QAAQ,CAA/BE,WAAW;MAAEC,KAAK,GAAKH,QAAQ,CAAlBG,KAAK;IAC9B,oBACEZ,KAAA,CAAAM,aAAA,CAACJ,WAAW;MACVK,SAAS,EAAC,kBAAkB;MAC5BM,KAAK,EAAEF,WAAY;MACnBG,GAAG,EAAEJ;IAAG,gBAERV,KAAA,CAAAM,aAAA;MAAIC,SAAS,EAAC,KAAK;MAACQ,KAAK,EAAE;QAAEC,aAAa,EAAE;MAAO;IAAE,GAClDJ,KAAK,CAACJ,GAAG,CAAC,UAAAS,IAAI;MAAA,oBACbjB,KAAA,CAAAM,aAAA;QAAIC,SAAS,EAAC;MAAkB,gBAC9BP,KAAA,CAAAM,aAAA;QAAGY,IAAI,EAAED,IAAI,CAACC;MAAK,GAChBD,IAAI,CAACJ,KACL,CACD,CAAC;IAAA,CACN,CACC,CACO,CAAC;EAElB,CAAC,CACE,CACF,CAAC;AAAA,CACP;AAEDV,UAAU,CAACgB,SAAS,GAAG;EACrBd,iBAAiB,EAAEJ,SAAS,CAACmB,OAAO,CAACnB,SAAS,CAACoB,KAAK,CAAC;IACnDX,EAAE,EAAET,SAAS,CAACqB,MAAM;IACpBX,WAAW,EAAEV,SAAS,CAACqB,MAAM;IAC7BV,KAAK,EAAEX,SAAS,CAACmB,OAAO,CAACnB,SAAS,CAACoB,KAAK,CAAC;MACvCH,IAAI,EAAEjB,SAAS,CAACqB,MAAM;MACtBT,KAAK,EAAEZ,SAAS,CAACqB;IACnB,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC;AACDnB,UAAU,CAACoB,YAAY,GAAG;EACxBlB,iBAAiB,EAAE;AACrB,CAAC;AAED,eAAeF,UAAU","ignoreList":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { Dropdown, DropdownButton } from '@openedx/paragon';
|
|
4
|
+
var NavDropdownMenu = function NavDropdownMenu(_ref) {
|
|
5
|
+
var id = _ref.id,
|
|
6
|
+
buttonTitle = _ref.buttonTitle,
|
|
7
|
+
items = _ref.items;
|
|
8
|
+
return /*#__PURE__*/React.createElement(DropdownButton, {
|
|
9
|
+
id: id,
|
|
10
|
+
title: buttonTitle,
|
|
11
|
+
variant: "outline-primary",
|
|
12
|
+
className: "mr-2"
|
|
13
|
+
}, items.map(function (item) {
|
|
14
|
+
return /*#__PURE__*/React.createElement(Dropdown.Item, {
|
|
15
|
+
key: "".concat(item.title, "-dropdown-item"),
|
|
16
|
+
href: item.href,
|
|
17
|
+
className: "small"
|
|
18
|
+
}, item.title);
|
|
19
|
+
}));
|
|
20
|
+
};
|
|
21
|
+
NavDropdownMenu.propTypes = {
|
|
22
|
+
id: PropTypes.string.isRequired,
|
|
23
|
+
buttonTitle: PropTypes.string.isRequired,
|
|
24
|
+
items: PropTypes.arrayOf(PropTypes.shape({
|
|
25
|
+
href: PropTypes.string,
|
|
26
|
+
title: PropTypes.string
|
|
27
|
+
})).isRequired
|
|
28
|
+
};
|
|
29
|
+
export default NavDropdownMenu;
|
|
30
|
+
//# sourceMappingURL=NavDropdownMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavDropdownMenu.js","names":["React","PropTypes","Dropdown","DropdownButton","NavDropdownMenu","_ref","id","buttonTitle","items","createElement","title","variant","className","map","item","Item","key","concat","href","propTypes","string","isRequired","arrayOf","shape"],"sources":["../../src/studio-header/NavDropdownMenu.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Dropdown,\n DropdownButton,\n} from '@openedx/paragon';\n\nconst NavDropdownMenu = ({\n id,\n buttonTitle,\n items,\n}) => (\n <DropdownButton\n id={id}\n title={buttonTitle}\n variant=\"outline-primary\"\n className=\"mr-2\"\n >\n {items.map(item => (\n <Dropdown.Item\n key={`${item.title}-dropdown-item`}\n href={item.href}\n className=\"small\"\n >\n {item.title}\n </Dropdown.Item>\n ))}\n </DropdownButton>\n);\n\nNavDropdownMenu.propTypes = {\n id: PropTypes.string.isRequired,\n buttonTitle: PropTypes.string.isRequired,\n items: PropTypes.arrayOf(PropTypes.shape({\n href: PropTypes.string,\n title: PropTypes.string,\n })).isRequired,\n};\n\nexport default NavDropdownMenu;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,SAAS,MAAM,YAAY;AAClC,SACEC,QAAQ,EACRC,cAAc,QACT,kBAAkB;AAEzB,IAAMC,eAAe,GAAG,SAAlBA,eAAeA,CAAAC,IAAA;EAAA,IACnBC,EAAE,GAAAD,IAAA,CAAFC,EAAE;IACFC,WAAW,GAAAF,IAAA,CAAXE,WAAW;IACXC,KAAK,GAAAH,IAAA,CAALG,KAAK;EAAA,oBAELR,KAAA,CAAAS,aAAA,CAACN,cAAc;IACbG,EAAE,EAAEA,EAAG;IACPI,KAAK,EAAEH,WAAY;IACnBI,OAAO,EAAC,iBAAiB;IACzBC,SAAS,EAAC;EAAM,GAEfJ,KAAK,CAACK,GAAG,CAAC,UAAAC,IAAI;IAAA,oBACbd,KAAA,CAAAS,aAAA,CAACP,QAAQ,CAACa,IAAI;MACZC,GAAG,KAAAC,MAAA,CAAKH,IAAI,CAACJ,KAAK,mBAAiB;MACnCQ,IAAI,EAAEJ,IAAI,CAACI,IAAK;MAChBN,SAAS,EAAC;IAAO,GAEhBE,IAAI,CAACJ,KACO,CAAC;EAAA,CACjB,CACa,CAAC;AAAA,CAClB;AAEDN,eAAe,CAACe,SAAS,GAAG;EAC1Bb,EAAE,EAAEL,SAAS,CAACmB,MAAM,CAACC,UAAU;EAC/Bd,WAAW,EAAEN,SAAS,CAACmB,MAAM,CAACC,UAAU;EACxCb,KAAK,EAAEP,SAAS,CAACqB,OAAO,CAACrB,SAAS,CAACsB,KAAK,CAAC;IACvCL,IAAI,EAAEjB,SAAS,CAACmB,MAAM;IACtBV,KAAK,EAAET,SAAS,CAACmB;EACnB,CAAC,CAAC,CAAC,CAACC;AACN,CAAC;AAED,eAAejB,eAAe","ignoreList":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
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
|
+
import MobileHeader from './MobileHeader';
|
|
7
|
+
import HeaderBody from './HeaderBody';
|
|
8
|
+
ensureConfig(['STUDIO_BASE_URL', 'SITE_NAME', 'LOGOUT_URL', 'LOGIN_URL', 'LOGO_URL'], 'Studio Header component');
|
|
9
|
+
var StudioHeader = function StudioHeader(_ref) {
|
|
10
|
+
var number = _ref.number,
|
|
11
|
+
org = _ref.org,
|
|
12
|
+
title = _ref.title,
|
|
13
|
+
isHiddenMainMenu = _ref.isHiddenMainMenu,
|
|
14
|
+
mainMenuDropdowns = _ref.mainMenuDropdowns,
|
|
15
|
+
outlineLink = _ref.outlineLink,
|
|
16
|
+
searchButtonAction = _ref.searchButtonAction;
|
|
17
|
+
var _useContext = useContext(AppContext),
|
|
18
|
+
authenticatedUser = _useContext.authenticatedUser,
|
|
19
|
+
config = _useContext.config;
|
|
20
|
+
var props = {
|
|
21
|
+
logo: config.LOGO_URL,
|
|
22
|
+
logoAltText: "Studio ".concat(config.SITE_NAME),
|
|
23
|
+
number: number,
|
|
24
|
+
org: org,
|
|
25
|
+
title: title,
|
|
26
|
+
username: authenticatedUser === null || authenticatedUser === void 0 ? void 0 : authenticatedUser.username,
|
|
27
|
+
isAdmin: authenticatedUser === null || authenticatedUser === void 0 ? void 0 : authenticatedUser.administrator,
|
|
28
|
+
authenticatedUserAvatar: authenticatedUser === null || authenticatedUser === void 0 ? void 0 : authenticatedUser.avatar,
|
|
29
|
+
studioBaseUrl: config.STUDIO_BASE_URL,
|
|
30
|
+
logoutUrl: config.LOGOUT_URL,
|
|
31
|
+
isHiddenMainMenu: isHiddenMainMenu,
|
|
32
|
+
mainMenuDropdowns: mainMenuDropdowns,
|
|
33
|
+
outlineLink: outlineLink,
|
|
34
|
+
searchButtonAction: searchButtonAction
|
|
35
|
+
};
|
|
36
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
37
|
+
className: "studio-header"
|
|
38
|
+
}, /*#__PURE__*/React.createElement("a", {
|
|
39
|
+
className: "nav-skip sr-only sr-only-focusable",
|
|
40
|
+
href: "#main"
|
|
41
|
+
}, "Skip to content"), /*#__PURE__*/React.createElement(Responsive, {
|
|
42
|
+
maxWidth: 841
|
|
43
|
+
}, /*#__PURE__*/React.createElement(MobileHeader, props)), /*#__PURE__*/React.createElement(Responsive, {
|
|
44
|
+
minWidth: 842
|
|
45
|
+
}, /*#__PURE__*/React.createElement(HeaderBody, props)));
|
|
46
|
+
};
|
|
47
|
+
StudioHeader.propTypes = {
|
|
48
|
+
number: PropTypes.string,
|
|
49
|
+
org: PropTypes.string,
|
|
50
|
+
title: PropTypes.string.isRequired,
|
|
51
|
+
isHiddenMainMenu: PropTypes.bool,
|
|
52
|
+
mainMenuDropdowns: PropTypes.arrayOf(PropTypes.shape({
|
|
53
|
+
id: PropTypes.string,
|
|
54
|
+
buttonTitle: PropTypes.string,
|
|
55
|
+
items: PropTypes.arrayOf(PropTypes.shape({
|
|
56
|
+
href: PropTypes.string,
|
|
57
|
+
title: PropTypes.string
|
|
58
|
+
}))
|
|
59
|
+
})),
|
|
60
|
+
outlineLink: PropTypes.string,
|
|
61
|
+
searchButtonAction: PropTypes.func
|
|
62
|
+
};
|
|
63
|
+
StudioHeader.defaultProps = {
|
|
64
|
+
number: '',
|
|
65
|
+
org: '',
|
|
66
|
+
isHiddenMainMenu: false,
|
|
67
|
+
mainMenuDropdowns: [],
|
|
68
|
+
outlineLink: null,
|
|
69
|
+
searchButtonAction: null
|
|
70
|
+
};
|
|
71
|
+
export default StudioHeader;
|
|
72
|
+
//# sourceMappingURL=StudioHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StudioHeader.js","names":["React","useContext","PropTypes","Responsive","AppContext","ensureConfig","MobileHeader","HeaderBody","StudioHeader","_ref","number","org","title","isHiddenMainMenu","mainMenuDropdowns","outlineLink","searchButtonAction","_useContext","authenticatedUser","config","props","logo","LOGO_URL","logoAltText","concat","SITE_NAME","username","isAdmin","administrator","authenticatedUserAvatar","avatar","studioBaseUrl","STUDIO_BASE_URL","logoutUrl","LOGOUT_URL","createElement","className","href","maxWidth","minWidth","propTypes","string","isRequired","bool","arrayOf","shape","id","buttonTitle","items","func","defaultProps"],"sources":["../../src/studio-header/StudioHeader.jsx"],"sourcesContent":["import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport Responsive from 'react-responsive';\nimport { AppContext } from '@edx/frontend-platform/react';\nimport { ensureConfig } from '@edx/frontend-platform';\n\nimport MobileHeader from './MobileHeader';\nimport HeaderBody from './HeaderBody';\n\nensureConfig([\n 'STUDIO_BASE_URL',\n 'SITE_NAME',\n 'LOGOUT_URL',\n 'LOGIN_URL',\n 'LOGO_URL',\n], 'Studio Header component');\n\nconst StudioHeader = ({\n number, org, title, isHiddenMainMenu, mainMenuDropdowns, outlineLink, searchButtonAction,\n}) => {\n const { authenticatedUser, config } = useContext(AppContext);\n const props = {\n logo: config.LOGO_URL,\n logoAltText: `Studio ${config.SITE_NAME}`,\n number,\n org,\n title,\n username: authenticatedUser?.username,\n isAdmin: authenticatedUser?.administrator,\n authenticatedUserAvatar: authenticatedUser?.avatar,\n studioBaseUrl: config.STUDIO_BASE_URL,\n logoutUrl: config.LOGOUT_URL,\n isHiddenMainMenu,\n mainMenuDropdowns,\n outlineLink,\n searchButtonAction,\n };\n\n return (\n <div className=\"studio-header\">\n <a className=\"nav-skip sr-only sr-only-focusable\" href=\"#main\">Skip to content</a>\n <Responsive maxWidth={841}>\n <MobileHeader {...props} />\n </Responsive>\n <Responsive minWidth={842}>\n <HeaderBody {...props} />\n </Responsive>\n </div>\n );\n};\n\nStudioHeader.propTypes = {\n number: PropTypes.string,\n org: PropTypes.string,\n title: PropTypes.string.isRequired,\n isHiddenMainMenu: PropTypes.bool,\n mainMenuDropdowns: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string,\n buttonTitle: PropTypes.string,\n items: PropTypes.arrayOf(PropTypes.shape({\n href: PropTypes.string,\n title: PropTypes.string,\n })),\n })),\n outlineLink: PropTypes.string,\n searchButtonAction: PropTypes.func,\n};\n\nStudioHeader.defaultProps = {\n number: '',\n org: '',\n isHiddenMainMenu: false,\n mainMenuDropdowns: [],\n outlineLink: null,\n searchButtonAction: null,\n};\n\nexport default StudioHeader;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
$spacer: 1rem;
|
|
2
|
+
$white: #FFFFFF;
|
|
3
|
+
|
|
4
|
+
.studio-header {
|
|
5
|
+
position: relative;
|
|
6
|
+
z-index: 1000;
|
|
7
|
+
|
|
8
|
+
height: 3.75rem;
|
|
9
|
+
box-shadow: 0 1px 0 0 rgb(0 0 0 / .1);
|
|
10
|
+
background: $white;
|
|
11
|
+
|
|
12
|
+
.btn-outline-primary {
|
|
13
|
+
border-color: $white;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.logo {
|
|
17
|
+
display: block;
|
|
18
|
+
box-sizing: content-box;
|
|
19
|
+
position: relative;
|
|
20
|
+
top: -.05em;
|
|
21
|
+
height: 1.75rem;
|
|
22
|
+
padding: $spacer 0;
|
|
23
|
+
margin-right: $spacer;
|
|
24
|
+
|
|
25
|
+
img {
|
|
26
|
+
display: block;
|
|
27
|
+
height: 100%;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.course-title-lockup {
|
|
32
|
+
@media only screen and (min-width: 769px) {
|
|
33
|
+
padding: .5rem;
|
|
34
|
+
padding-right: $spacer;
|
|
35
|
+
border-right: 1px solid #E5E5E5;
|
|
36
|
+
width: 70%;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
|
|
41
|
+
span {
|
|
42
|
+
color: #333333;
|
|
43
|
+
white-space: nowrap;
|
|
44
|
+
overflow: hidden;
|
|
45
|
+
text-overflow: ellipsis;
|
|
46
|
+
line-height: 1.375rem;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|