@nauedu/frontend-component-header 14.0.0-semantically-released

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.
Files changed (59) hide show
  1. package/LICENSE +661 -0
  2. package/README.rst +113 -0
  3. package/dist/Avatar.js +45 -0
  4. package/dist/Avatar.js.map +1 -0
  5. package/dist/DesktopHeader.js +218 -0
  6. package/dist/DesktopHeader.js.map +1 -0
  7. package/dist/Header.js +86 -0
  8. package/dist/Header.js.map +1 -0
  9. package/dist/Header.messages.js +100 -0
  10. package/dist/Header.messages.js.map +1 -0
  11. package/dist/Header.test.jsx +127 -0
  12. package/dist/Icons.js +53 -0
  13. package/dist/Icons.js.map +1 -0
  14. package/dist/Logo.js +51 -0
  15. package/dist/Logo.js.map +1 -0
  16. package/dist/Menu/Menu.js +367 -0
  17. package/dist/Menu/Menu.js.map +1 -0
  18. package/dist/Menu/index.js +3 -0
  19. package/dist/Menu/index.js.map +1 -0
  20. package/dist/Menu/menu.scss +45 -0
  21. package/dist/MobileHeader.js +240 -0
  22. package/dist/MobileHeader.js.map +1 -0
  23. package/dist/__snapshots__/Header.test.jsx.snap +443 -0
  24. package/dist/generic/messages.js +15 -0
  25. package/dist/generic/messages.js.map +1 -0
  26. package/dist/i18n/index.js +31 -0
  27. package/dist/i18n/index.js.map +1 -0
  28. package/dist/i18n/messages/ar.json +30 -0
  29. package/dist/i18n/messages/ca.json +1 -0
  30. package/dist/i18n/messages/es_419.json +30 -0
  31. package/dist/i18n/messages/fr.json +30 -0
  32. package/dist/i18n/messages/fr_CA.json +30 -0
  33. package/dist/i18n/messages/he.json +1 -0
  34. package/dist/i18n/messages/id.json +1 -0
  35. package/dist/i18n/messages/ko_KR.json +2 -0
  36. package/dist/i18n/messages/pl.json +1 -0
  37. package/dist/i18n/messages/pt_BR.json +2 -0
  38. package/dist/i18n/messages/ru.json +1 -0
  39. package/dist/i18n/messages/th.json +1 -0
  40. package/dist/i18n/messages/uk.json +1 -0
  41. package/dist/i18n/messages/zh_CN.json +30 -0
  42. package/dist/index.js +6 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/index.scss +120 -0
  45. package/dist/learning-header/AnonymousUserMenu.js +24 -0
  46. package/dist/learning-header/AnonymousUserMenu.js.map +1 -0
  47. package/dist/learning-header/AuthenticatedUserDropdown.js +48 -0
  48. package/dist/learning-header/AuthenticatedUserDropdown.js.map +1 -0
  49. package/dist/learning-header/LearningHeader.js +121 -0
  50. package/dist/learning-header/LearningHeader.js.map +1 -0
  51. package/dist/learning-header/_header.scss +7 -0
  52. package/dist/learning-header/data/api.js +57 -0
  53. package/dist/learning-header/data/api.js.map +1 -0
  54. package/dist/learning-header/data/api.test.js +216 -0
  55. package/dist/learning-header/data/api.test.js.map +1 -0
  56. package/dist/learning-header/messages.js +40 -0
  57. package/dist/learning-header/messages.js.map +1 -0
  58. package/dist/setupTest.js +129 -0
  59. package/package.json +76 -0
@@ -0,0 +1,30 @@
1
+ {
2
+ "general.register.sentenceCase": "Register",
3
+ "general.signIn.sentenceCase": "Sign in",
4
+ "header.links.courses": "Courses",
5
+ "header.links.programs": "Programs",
6
+ "header.links.content.search": "Discover New",
7
+ "header.links.schools": "Schools & Partners",
8
+ "header.user.menu.dashboard": "Dashboard",
9
+ "header.user.menu.profile": "Profile",
10
+ "header.user.menu.account.settings": "Account",
11
+ "header.user.menu.order.history": "Order History",
12
+ "header.user.menu.logout": "Logout",
13
+ "header.user.menu.login": "Login",
14
+ "header.user.menu.register": "Sign Up",
15
+ "header.label.account.nav": "Account",
16
+ "header.label.account.menu": "Account Menu",
17
+ "header.label.account.menu.for": "Account menu for {username}",
18
+ "header.label.main.nav": "Main",
19
+ "header.label.main.menu": "Main Menu",
20
+ "header.label.main.header": "Main",
21
+ "header.label.secondary.nav": "Secondary",
22
+ "header.label.skip.nav": "Skip to main content",
23
+ "header.menu.dashboard.label": "Dashboard",
24
+ "header.help.label": "Help",
25
+ "header.menu.profile.label": "Profile",
26
+ "header.menu.account.label": "Account",
27
+ "header.menu.orderHistory.label": "Order History",
28
+ "header.navigation.skipNavLink": "Skip to main content.",
29
+ "header.menu.signOut.label": "Sign Out"
30
+ }
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ import Header from './Header';
2
+ import LearningHeader from './learning-header/LearningHeader';
3
+ import messages from './i18n/index';
4
+ export { LearningHeader, messages };
5
+ export default Header;
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.jsx"],"names":["Header","LearningHeader","messages"],"mappings":"AAAA,OAAOA,MAAP,MAAmB,UAAnB;AACA,OAAOC,cAAP,MAA2B,kCAA3B;AACA,OAAOC,QAAP,MAAqB,cAArB;AAEA,SAASD,cAAT,EAAyBC,QAAzB;AAEA,eAAeF,MAAf","sourcesContent":["import Header from './Header';\nimport LearningHeader from './learning-header/LearningHeader';\nimport messages from './i18n/index';\n\nexport { LearningHeader, messages };\n\nexport default Header;\n"],"file":"index.js"}
@@ -0,0 +1,120 @@
1
+ $spacer: 1rem;
2
+ $blue: #007db8;
3
+ $white: #fff;
4
+
5
+ @import './Menu/menu.scss';
6
+
7
+ .dropdown-item a {
8
+ text-decoration: none;
9
+ }
10
+
11
+ .icon-button {
12
+ display: inline-flex;
13
+ line-height: 3rem;
14
+ background: transparent;
15
+ vertical-align: middle;
16
+ text-align: center;
17
+ border: none;
18
+ height: 3rem;
19
+ width: 3rem;
20
+ padding: .75rem;
21
+ justify-content: center;
22
+ align-items:center;
23
+ &:hover, &:focus {
24
+ background: rgba(0,0,0,.1);
25
+ }
26
+ }
27
+
28
+ .learning-header {
29
+ min-width: 0;
30
+
31
+ .course-title-lockup {
32
+ min-width: 0;
33
+
34
+ span {
35
+ white-space: nowrap;
36
+ overflow: hidden;
37
+ text-overflow: ellipsis;
38
+ padding-bottom: 0.1rem;
39
+ }
40
+ }
41
+
42
+ .user-dropdown {
43
+ .btn {
44
+ height: 3rem;
45
+ @media (map-get($grid-breakpoints, "sm")) {
46
+ padding: 0 0.5rem;
47
+ }
48
+ }
49
+ }
50
+ }
51
+
52
+ .site-header-mobile,
53
+ .site-header-desktop {
54
+ position: relative;
55
+ z-index: 1000;
56
+ }
57
+
58
+ .site-header-mobile {
59
+ height: 3rem;
60
+
61
+ .nav-link {
62
+ text-decoration: none;
63
+ cursor: pointer;
64
+ }
65
+ img {
66
+ height: 1.5rem;
67
+ }
68
+ }
69
+
70
+
71
+ .site-header-desktop {
72
+ box-shadow: 0 1px 0 0 rgba(0,0,0,.1);
73
+ background: $white;
74
+ .nav-link {
75
+ text-decoration: none;
76
+ }
77
+ .logo {
78
+ display: block;
79
+ box-sizing: content-box;
80
+ position: relative;
81
+ top: -.05em;
82
+ height: 1.75rem;
83
+ padding: 1rem 0;
84
+ margin-right: 1rem;
85
+ img {
86
+ display: block;
87
+ height: 100%;
88
+ }
89
+ }
90
+ .main-nav {
91
+ .nav-link {
92
+ padding: 1.125rem 1rem;
93
+ text-decoration: none;
94
+ font-weight: 500;
95
+ letter-spacing: .01em;
96
+ }
97
+ .nav-link:hover,
98
+ .nav-link:focus,
99
+ .nav-link.active,
100
+ .expanded .nav-link {
101
+ background: $component-active-bg;
102
+ color: $component-active-color;
103
+ }
104
+ .menu {
105
+ position: static;
106
+ .menu-content {
107
+ border-top: solid 2px $component-active-bg;
108
+ left: 0;
109
+ right: 0;
110
+ box-shadow: 0 1px 2px rgba(0,0,0,.25);
111
+ border-bottom-left-radius: 2px;
112
+ border-bottom-right-radius: 2px;
113
+ padding: 1rem;
114
+ }
115
+ }
116
+ }
117
+ .search-input {
118
+ border-radius: $rounded-pill;
119
+ }
120
+ }
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import { getConfig } from '@edx/frontend-platform';
3
+ import { getLoginRedirectUrl } from '@edx/frontend-platform/auth';
4
+ import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
5
+ import { Button } from '@edx/paragon';
6
+ import genericMessages from '../generic/messages';
7
+
8
+ function AnonymousUserMenu(_ref) {
9
+ var intl = _ref.intl;
10
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Button, {
11
+ className: "mr-3",
12
+ variant: "outline-primary",
13
+ href: "".concat(getConfig().LMS_BASE_URL, "/register?next=").concat(encodeURIComponent(global.location.href))
14
+ }, intl.formatMessage(genericMessages.registerSentenceCase)), /*#__PURE__*/React.createElement(Button, {
15
+ variant: "primary",
16
+ href: "".concat(getLoginRedirectUrl(global.location.href))
17
+ }, intl.formatMessage(genericMessages.signInSentenceCase)));
18
+ }
19
+
20
+ AnonymousUserMenu.propTypes = {
21
+ intl: intlShape.isRequired
22
+ };
23
+ export default injectIntl(AnonymousUserMenu);
24
+ //# sourceMappingURL=AnonymousUserMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/learning-header/AnonymousUserMenu.jsx"],"names":["React","getConfig","getLoginRedirectUrl","injectIntl","intlShape","Button","genericMessages","AnonymousUserMenu","intl","LMS_BASE_URL","encodeURIComponent","global","location","href","formatMessage","registerSentenceCase","signInSentenceCase","propTypes","isRequired"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AAEA,SAASC,SAAT,QAA0B,wBAA1B;AACA,SAASC,mBAAT,QAAoC,6BAApC;AACA,SAASC,UAAT,EAAqBC,SAArB,QAAsC,6BAAtC;AACA,SAASC,MAAT,QAAuB,cAAvB;AAEA,OAAOC,eAAP,MAA4B,qBAA5B;;AAEA,SAASC,iBAAT,OAAqC;AAAA,MAARC,IAAQ,QAARA,IAAQ;AACnC,sBACE,8CACE,oBAAC,MAAD;AACE,IAAA,SAAS,EAAC,MADZ;AAEE,IAAA,OAAO,EAAC,iBAFV;AAGE,IAAA,IAAI,YAAKP,SAAS,GAAGQ,YAAjB,4BAA+CC,kBAAkB,CAACC,MAAM,CAACC,QAAP,CAAgBC,IAAjB,CAAjE;AAHN,KAKGL,IAAI,CAACM,aAAL,CAAmBR,eAAe,CAACS,oBAAnC,CALH,CADF,eAQE,oBAAC,MAAD;AACE,IAAA,OAAO,EAAC,SADV;AAEE,IAAA,IAAI,YAAKb,mBAAmB,CAACS,MAAM,CAACC,QAAP,CAAgBC,IAAjB,CAAxB;AAFN,KAIGL,IAAI,CAACM,aAAL,CAAmBR,eAAe,CAACU,kBAAnC,CAJH,CARF,CADF;AAiBD;;AAEDT,iBAAiB,CAACU,SAAlB,GAA8B;AAC5BT,EAAAA,IAAI,EAAEJ,SAAS,CAACc;AADY,CAA9B;AAIA,eAAef,UAAU,CAACI,iBAAD,CAAzB","sourcesContent":["import React from 'react';\n\nimport { getConfig } from '@edx/frontend-platform';\nimport { getLoginRedirectUrl } from '@edx/frontend-platform/auth';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { Button } from '@edx/paragon';\n\nimport genericMessages from '../generic/messages';\n\nfunction AnonymousUserMenu({ intl }) {\n return (\n <div>\n <Button\n className=\"mr-3\"\n variant=\"outline-primary\"\n href={`${getConfig().LMS_BASE_URL}/register?next=${encodeURIComponent(global.location.href)}`}\n >\n {intl.formatMessage(genericMessages.registerSentenceCase)}\n </Button>\n <Button\n variant=\"primary\"\n href={`${getLoginRedirectUrl(global.location.href)}`}\n >\n {intl.formatMessage(genericMessages.signInSentenceCase)}\n </Button>\n </div>\n );\n}\n\nAnonymousUserMenu.propTypes = {\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(AnonymousUserMenu);\n"],"file":"AnonymousUserMenu.js"}
@@ -0,0 +1,48 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
4
+ import { faUserCircle } from '@fortawesome/free-solid-svg-icons';
5
+ import { getConfig } from '@edx/frontend-platform';
6
+ import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
7
+ import { Dropdown } from '@edx/paragon';
8
+ import messages from './messages';
9
+
10
+ function AuthenticatedUserDropdown(_ref) {
11
+ var intl = _ref.intl,
12
+ username = _ref.username;
13
+ var dashboardMenuItem = /*#__PURE__*/React.createElement(Dropdown.Item, {
14
+ href: "".concat(getConfig().LMS_BASE_URL, "/dashboard")
15
+ }, intl.formatMessage(messages.dashboard));
16
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("a", {
17
+ className: "text-gray-700 mr-3",
18
+ href: "".concat(getConfig().SUPPORT_URL)
19
+ }, intl.formatMessage(messages.help)), /*#__PURE__*/React.createElement(Dropdown, {
20
+ className: "user-dropdown"
21
+ }, /*#__PURE__*/React.createElement(Dropdown.Toggle, {
22
+ variant: "outline-primary"
23
+ }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
24
+ icon: faUserCircle,
25
+ className: "d-md-none",
26
+ size: "lg"
27
+ }), /*#__PURE__*/React.createElement("span", {
28
+ "data-hj-suppress": true,
29
+ className: "d-none d-md-inline"
30
+ }, username)), /*#__PURE__*/React.createElement(Dropdown.Menu, {
31
+ className: "dropdown-menu-right"
32
+ }, dashboardMenuItem, /*#__PURE__*/React.createElement(Dropdown.Item, {
33
+ href: "".concat(getConfig().LMS_BASE_URL, "/u/").concat(username)
34
+ }, intl.formatMessage(messages.profile)), /*#__PURE__*/React.createElement(Dropdown.Item, {
35
+ href: "".concat(getConfig().LMS_BASE_URL, "/account/settings")
36
+ }, intl.formatMessage(messages.account)), getConfig().ORDER_HISTORY_URL && /*#__PURE__*/React.createElement(Dropdown.Item, {
37
+ href: getConfig().ORDER_HISTORY_URL
38
+ }, intl.formatMessage(messages.orderHistory)), /*#__PURE__*/React.createElement(Dropdown.Item, {
39
+ href: getConfig().LOGOUT_URL
40
+ }, intl.formatMessage(messages.signOut)))));
41
+ }
42
+
43
+ AuthenticatedUserDropdown.propTypes = {
44
+ intl: intlShape.isRequired,
45
+ username: PropTypes.string.isRequired
46
+ };
47
+ export default injectIntl(AuthenticatedUserDropdown);
48
+ //# sourceMappingURL=AuthenticatedUserDropdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/learning-header/AuthenticatedUserDropdown.jsx"],"names":["React","PropTypes","FontAwesomeIcon","faUserCircle","getConfig","injectIntl","intlShape","Dropdown","messages","AuthenticatedUserDropdown","intl","username","dashboardMenuItem","LMS_BASE_URL","formatMessage","dashboard","SUPPORT_URL","help","profile","account","ORDER_HISTORY_URL","orderHistory","LOGOUT_URL","signOut","propTypes","isRequired","string"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,SAAP,MAAsB,YAAtB;AAEA,SAASC,eAAT,QAAgC,gCAAhC;AACA,SAASC,YAAT,QAA6B,mCAA7B;AAEA,SAASC,SAAT,QAA0B,wBAA1B;AACA,SAASC,UAAT,EAAqBC,SAArB,QAAsC,6BAAtC;AACA,SAASC,QAAT,QAAyB,cAAzB;AAEA,OAAOC,QAAP,MAAqB,YAArB;;AAEA,SAASC,yBAAT,OAAuD;AAAA,MAAlBC,IAAkB,QAAlBA,IAAkB;AAAA,MAAZC,QAAY,QAAZA,QAAY;AACrD,MAAMC,iBAAiB,gBACrB,oBAAC,QAAD,CAAU,IAAV;AAAe,IAAA,IAAI,YAAKR,SAAS,GAAGS,YAAjB;AAAnB,KACGH,IAAI,CAACI,aAAL,CAAmBN,QAAQ,CAACO,SAA5B,CADH,CADF;AAMA,sBACE,uDACE;AAAG,IAAA,SAAS,EAAC,oBAAb;AAAkC,IAAA,IAAI,YAAKX,SAAS,GAAGY,WAAjB;AAAtC,KAAuEN,IAAI,CAACI,aAAL,CAAmBN,QAAQ,CAACS,IAA5B,CAAvE,CADF,eAEE,oBAAC,QAAD;AAAU,IAAA,SAAS,EAAC;AAApB,kBACE,oBAAC,QAAD,CAAU,MAAV;AAAiB,IAAA,OAAO,EAAC;AAAzB,kBACE,oBAAC,eAAD;AAAiB,IAAA,IAAI,EAAEd,YAAvB;AAAqC,IAAA,SAAS,EAAC,WAA/C;AAA2D,IAAA,IAAI,EAAC;AAAhE,IADF,eAEE;AAAM,4BAAN;AAAuB,IAAA,SAAS,EAAC;AAAjC,KACGQ,QADH,CAFF,CADF,eAOE,oBAAC,QAAD,CAAU,IAAV;AAAe,IAAA,SAAS,EAAC;AAAzB,KACGC,iBADH,eAEE,oBAAC,QAAD,CAAU,IAAV;AAAe,IAAA,IAAI,YAAKR,SAAS,GAAGS,YAAjB,gBAAmCF,QAAnC;AAAnB,KACGD,IAAI,CAACI,aAAL,CAAmBN,QAAQ,CAACU,OAA5B,CADH,CAFF,eAKE,oBAAC,QAAD,CAAU,IAAV;AAAe,IAAA,IAAI,YAAKd,SAAS,GAAGS,YAAjB;AAAnB,KACGH,IAAI,CAACI,aAAL,CAAmBN,QAAQ,CAACW,OAA5B,CADH,CALF,EAQIf,SAAS,GAAGgB,iBAAZ,iBACA,oBAAC,QAAD,CAAU,IAAV;AAAe,IAAA,IAAI,EAAEhB,SAAS,GAAGgB;AAAjC,KACGV,IAAI,CAACI,aAAL,CAAmBN,QAAQ,CAACa,YAA5B,CADH,CATJ,eAaE,oBAAC,QAAD,CAAU,IAAV;AAAe,IAAA,IAAI,EAAEjB,SAAS,GAAGkB;AAAjC,KACGZ,IAAI,CAACI,aAAL,CAAmBN,QAAQ,CAACe,OAA5B,CADH,CAbF,CAPF,CAFF,CADF;AA8BD;;AAEDd,yBAAyB,CAACe,SAA1B,GAAsC;AACpCd,EAAAA,IAAI,EAAEJ,SAAS,CAACmB,UADoB;AAEpCd,EAAAA,QAAQ,EAAEV,SAAS,CAACyB,MAAV,CAAiBD;AAFS,CAAtC;AAKA,eAAepB,UAAU,CAACI,yBAAD,CAAzB","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faUserCircle } from '@fortawesome/free-solid-svg-icons';\n\nimport { getConfig } from '@edx/frontend-platform';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { Dropdown } from '@edx/paragon';\n\nimport messages from './messages';\n\nfunction AuthenticatedUserDropdown({ intl, username }) {\n const dashboardMenuItem = (\n <Dropdown.Item href={`${getConfig().LMS_BASE_URL}/dashboard`}>\n {intl.formatMessage(messages.dashboard)}\n </Dropdown.Item>\n );\n\n return (\n <>\n <a className=\"text-gray-700 mr-3\" href={`${getConfig().SUPPORT_URL}`}>{intl.formatMessage(messages.help)}</a>\n <Dropdown className=\"user-dropdown\">\n <Dropdown.Toggle variant=\"outline-primary\">\n <FontAwesomeIcon icon={faUserCircle} className=\"d-md-none\" size=\"lg\" />\n <span data-hj-suppress className=\"d-none d-md-inline\">\n {username}\n </span>\n </Dropdown.Toggle>\n <Dropdown.Menu className=\"dropdown-menu-right\">\n {dashboardMenuItem}\n <Dropdown.Item href={`${getConfig().LMS_BASE_URL}/u/${username}`}>\n {intl.formatMessage(messages.profile)}\n </Dropdown.Item>\n <Dropdown.Item href={`${getConfig().LMS_BASE_URL}/account/settings`}>\n {intl.formatMessage(messages.account)}\n </Dropdown.Item>\n { getConfig().ORDER_HISTORY_URL && (\n <Dropdown.Item href={getConfig().ORDER_HISTORY_URL}>\n {intl.formatMessage(messages.orderHistory)}\n </Dropdown.Item>\n )}\n <Dropdown.Item href={getConfig().LOGOUT_URL}>\n {intl.formatMessage(messages.signOut)}\n </Dropdown.Item>\n </Dropdown.Menu>\n </Dropdown>\n </>\n );\n}\n\nAuthenticatedUserDropdown.propTypes = {\n intl: intlShape.isRequired,\n username: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(AuthenticatedUserDropdown);\n"],"file":"AuthenticatedUserDropdown.js"}
@@ -0,0 +1,121 @@
1
+ var _excluded = ["href", "src", "alt"];
2
+
3
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
+
5
+ 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."); }
6
+
7
+ 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); }
8
+
9
+ 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; }
10
+
11
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
12
+
13
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
+
15
+ function _extends() { _extends = Object.assign || 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); }
16
+
17
+ 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; }
18
+
19
+ 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; }
20
+
21
+ import React, { useContext, useEffect, useState } from 'react';
22
+ import PropTypes from 'prop-types';
23
+ import { getConfig } from '@edx/frontend-platform';
24
+ import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
25
+ import { AppContext } from '@edx/frontend-platform/react';
26
+ import AnonymousUserMenu from './AnonymousUserMenu';
27
+ import AuthenticatedUserDropdown from './AuthenticatedUserDropdown';
28
+ import messages from './messages';
29
+ import getCourseLogoOrg from './data/api';
30
+ import './_header.scss';
31
+
32
+ function LinkedLogo(_ref) {
33
+ var href = _ref.href,
34
+ src = _ref.src,
35
+ alt = _ref.alt,
36
+ attributes = _objectWithoutProperties(_ref, _excluded);
37
+
38
+ return /*#__PURE__*/React.createElement("a", _extends({
39
+ href: href
40
+ }, attributes), /*#__PURE__*/React.createElement("img", {
41
+ className: "d-block",
42
+ src: src,
43
+ alt: alt
44
+ }));
45
+ }
46
+
47
+ LinkedLogo.propTypes = {
48
+ href: PropTypes.string.isRequired,
49
+ src: PropTypes.string.isRequired,
50
+ alt: PropTypes.string.isRequired
51
+ }; // this feature flag is not included on the frontend-platform, we have to get it directly from ENV
52
+
53
+ var enabledOrgLogo = !!process.env.ENABLED_ORG_LOGO || false;
54
+
55
+ function LearningHeader(_ref2) {
56
+ var courseOrg = _ref2.courseOrg,
57
+ courseTitle = _ref2.courseTitle,
58
+ intl = _ref2.intl,
59
+ showUserDropdown = _ref2.showUserDropdown;
60
+
61
+ var _useContext = useContext(AppContext),
62
+ authenticatedUser = _useContext.authenticatedUser;
63
+
64
+ var _useState = useState(null),
65
+ _useState2 = _slicedToArray(_useState, 2),
66
+ logoOrg = _useState2[0],
67
+ setLogoOrg = _useState2[1];
68
+
69
+ useEffect(function () {
70
+ if (courseOrg) {
71
+ getCourseLogoOrg().then(function (logoOrgUrl) {
72
+ setLogoOrg(logoOrgUrl);
73
+ });
74
+ }
75
+ }, []);
76
+ var headerLogo = /*#__PURE__*/React.createElement(LinkedLogo, {
77
+ className: "logo",
78
+ href: "".concat(getConfig().LMS_BASE_URL, "/dashboard"),
79
+ src: getConfig().LOGO_URL,
80
+ alt: getConfig().SITE_NAME
81
+ });
82
+ return /*#__PURE__*/React.createElement("header", {
83
+ className: "learning-header"
84
+ }, /*#__PURE__*/React.createElement("a", {
85
+ className: "sr-only sr-only-focusable",
86
+ href: "#main-content"
87
+ }, intl.formatMessage(messages.skipNavLink)), /*#__PURE__*/React.createElement("div", {
88
+ className: "container-xl py-2 d-flex align-items-center"
89
+ }, headerLogo, /*#__PURE__*/React.createElement("div", {
90
+ className: "d-none d-md-block flex-grow-1 course-title-lockup"
91
+ }, /*#__PURE__*/React.createElement("div", {
92
+ className: "d-md-flex ".concat(enabledOrgLogo && 'align-items-center justify-content-center', " w-100")
93
+ }, enabledOrgLogo ? courseOrg && logoOrg && /*#__PURE__*/React.createElement("img", {
94
+ src: logoOrg,
95
+ alt: "".concat(courseOrg, " logo"),
96
+ style: {
97
+ maxHeight: '45px'
98
+ }
99
+ }) : null, /*#__PURE__*/React.createElement("span", {
100
+ className: "d-inline-block course-title font-weight-semibold ml-3 text-truncate text-left w-25",
101
+ style: {
102
+ fontSize: '0.85rem'
103
+ }
104
+ }, courseTitle))), showUserDropdown && authenticatedUser && /*#__PURE__*/React.createElement(AuthenticatedUserDropdown, {
105
+ username: authenticatedUser.username
106
+ }), showUserDropdown && !authenticatedUser && /*#__PURE__*/React.createElement(AnonymousUserMenu, null)));
107
+ }
108
+
109
+ LearningHeader.propTypes = {
110
+ courseOrg: PropTypes.string,
111
+ courseTitle: PropTypes.string,
112
+ intl: intlShape.isRequired,
113
+ showUserDropdown: PropTypes.bool
114
+ };
115
+ LearningHeader.defaultProps = {
116
+ courseOrg: null,
117
+ courseTitle: null,
118
+ showUserDropdown: true
119
+ };
120
+ export default injectIntl(LearningHeader);
121
+ //# sourceMappingURL=LearningHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/learning-header/LearningHeader.jsx"],"names":["React","useContext","useEffect","useState","PropTypes","getConfig","injectIntl","intlShape","AppContext","AnonymousUserMenu","AuthenticatedUserDropdown","messages","getCourseLogoOrg","LinkedLogo","href","src","alt","attributes","propTypes","string","isRequired","enabledOrgLogo","process","env","ENABLED_ORG_LOGO","LearningHeader","courseOrg","courseTitle","intl","showUserDropdown","authenticatedUser","logoOrg","setLogoOrg","then","logoOrgUrl","headerLogo","LMS_BASE_URL","LOGO_URL","SITE_NAME","formatMessage","skipNavLink","maxHeight","fontSize","username","bool","defaultProps"],"mappings":"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","sourcesContent":["import React, { useContext, useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { getConfig } from '@edx/frontend-platform';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { AppContext } from '@edx/frontend-platform/react';\n\nimport AnonymousUserMenu from './AnonymousUserMenu';\nimport AuthenticatedUserDropdown from './AuthenticatedUserDropdown';\nimport messages from './messages';\nimport getCourseLogoOrg from './data/api';\n\nimport './_header.scss';\n\nfunction LinkedLogo({\n href,\n src,\n alt,\n ...attributes\n}) {\n return (\n <a href={href} {...attributes}>\n <img className=\"d-block\" src={src} alt={alt} />\n </a>\n );\n}\n\nLinkedLogo.propTypes = {\n href: PropTypes.string.isRequired,\n src: PropTypes.string.isRequired,\n alt: PropTypes.string.isRequired,\n};\n\n// this feature flag is not included on the frontend-platform, we have to get it directly from ENV\nconst enabledOrgLogo = !!process.env.ENABLED_ORG_LOGO || false;\n\nfunction LearningHeader({\n courseOrg, courseTitle, intl, showUserDropdown,\n}) {\n const { authenticatedUser } = useContext(AppContext);\n const [logoOrg, setLogoOrg] = useState(null);\n\n useEffect(() => {\n if (courseOrg) {\n getCourseLogoOrg().then((logoOrgUrl) => { setLogoOrg(logoOrgUrl); });\n }\n }, []);\n\n const headerLogo = (\n <LinkedLogo\n className=\"logo\"\n href={`${getConfig().LMS_BASE_URL}/dashboard`}\n src={getConfig().LOGO_URL}\n alt={getConfig().SITE_NAME}\n />\n );\n\n return (\n <header className=\"learning-header\">\n <a className=\"sr-only sr-only-focusable\" href=\"#main-content\">{intl.formatMessage(messages.skipNavLink)}</a>\n <div className=\"container-xl py-2 d-flex align-items-center\">\n {headerLogo}\n <div className=\"d-none d-md-block flex-grow-1 course-title-lockup\">\n <div className={`d-md-flex ${enabledOrgLogo && 'align-items-center justify-content-center'} w-100`}>\n {enabledOrgLogo ? (\n (courseOrg && logoOrg)\n && <img src={logoOrg} alt={`${courseOrg} logo`} style={{ maxHeight: '45px' }} />\n ) : null}\n <span\n className=\"d-inline-block course-title font-weight-semibold ml-3 text-truncate text-left w-25\"\n style={{ fontSize: '0.85rem' }}\n >\n {courseTitle}\n </span>\n </div>\n </div>\n {showUserDropdown && authenticatedUser && (\n <AuthenticatedUserDropdown\n username={authenticatedUser.username}\n />\n )}\n {showUserDropdown && !authenticatedUser && (\n <AnonymousUserMenu />\n )}\n </div>\n </header>\n );\n}\n\nLearningHeader.propTypes = {\n courseOrg: PropTypes.string,\n courseTitle: PropTypes.string,\n intl: intlShape.isRequired,\n showUserDropdown: PropTypes.bool,\n};\n\nLearningHeader.defaultProps = {\n courseOrg: null,\n courseTitle: null,\n showUserDropdown: true,\n};\n\nexport default injectIntl(LearningHeader);\n"],"file":"LearningHeader.js"}
@@ -0,0 +1,7 @@
1
+ .logo {
2
+ img {
3
+ @media (max-width: 576px) {
4
+ max-width: 85% !important;
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,57 @@
1
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
2
+
3
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
4
+
5
+ import { getConfig } from '@edx/frontend-platform';
6
+ import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
7
+
8
+ var getCourseLogoOrg = /*#__PURE__*/function () {
9
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
10
+ var orgId, _yield$getAuthenticat, data, _ref2, httpErrorStatus;
11
+
12
+ return regeneratorRuntime.wrap(function _callee$(_context) {
13
+ while (1) {
14
+ switch (_context.prev = _context.next) {
15
+ case 0:
16
+ _context.prev = 0;
17
+ orgId = window.location.pathname.match(/course-(.*?):([^+]+)/)[2];
18
+ _context.next = 4;
19
+ return getAuthenticatedHttpClient().get("".concat(getConfig().LMS_BASE_URL, "/api/organizations/v0/organizations/").concat(orgId, "/"), {
20
+ useCache: true
21
+ });
22
+
23
+ case 4:
24
+ _yield$getAuthenticat = _context.sent;
25
+ data = _yield$getAuthenticat.data;
26
+ return _context.abrupt("return", data.logo);
27
+
28
+ case 9:
29
+ _context.prev = 9;
30
+ _context.t0 = _context["catch"](0);
31
+ _ref2 = _context.t0 && _context.t0.customAttributes, httpErrorStatus = _ref2.httpErrorStatus;
32
+
33
+ if (!(httpErrorStatus === 404)) {
34
+ _context.next = 14;
35
+ break;
36
+ }
37
+
38
+ return _context.abrupt("return", null);
39
+
40
+ case 14:
41
+ throw _context.t0;
42
+
43
+ case 15:
44
+ case "end":
45
+ return _context.stop();
46
+ }
47
+ }
48
+ }, _callee, null, [[0, 9]]);
49
+ }));
50
+
51
+ return function getCourseLogoOrg() {
52
+ return _ref.apply(this, arguments);
53
+ };
54
+ }();
55
+
56
+ export default getCourseLogoOrg;
57
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/learning-header/data/api.js"],"names":["getConfig","getAuthenticatedHttpClient","getCourseLogoOrg","orgId","window","location","pathname","match","get","LMS_BASE_URL","useCache","data","logo","customAttributes","httpErrorStatus"],"mappings":";;;;AAAA,SAASA,SAAT,QAA0B,wBAA1B;AACA,SAASC,0BAAT,QAA2C,6BAA3C;;AAEA,IAAMC,gBAAgB;AAAA,qEAAG;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEfC,YAAAA,KAFe,GAEPC,MAAM,CAACC,QAAP,CAAgBC,QAAhB,CAAyBC,KAAzB,CAA+B,sBAA/B,EAAuD,CAAvD,CAFO;AAAA;AAAA,mBAGEN,0BAA0B,GAC9CO,GADoB,WAEhBR,SAAS,GAAGS,YAFI,iDAE+CN,KAF/C,QAGnB;AAAEO,cAAAA,QAAQ,EAAE;AAAZ,aAHmB,CAHF;;AAAA;AAAA;AAGbC,YAAAA,IAHa,yBAGbA,IAHa;AAAA,6CAQdA,IAAI,CAACC,IARS;;AAAA;AAAA;AAAA;AAAA,oBAUO,eAAS,YAAMC,gBAVtB,EAUbC,eAVa,SAUbA,eAVa;;AAAA,kBAWjBA,eAAe,KAAK,GAXH;AAAA;AAAA;AAAA;;AAAA,6CAYZ,IAZY;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAH;;AAAA,kBAAhBZ,gBAAgB;AAAA;AAAA;AAAA,GAAtB;;AAkBA,eAAeA,gBAAf","sourcesContent":["import { getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nconst getCourseLogoOrg = async () => {\n try {\n const orgId = window.location.pathname.match(/course-(.*?):([^+]+)/)[2];\n const { data } = await getAuthenticatedHttpClient()\n .get(\n `${getConfig().LMS_BASE_URL}/api/organizations/v0/organizations/${orgId}/`,\n { useCache: true },\n );\n return data.logo;\n } catch (error) {\n const { httpErrorStatus } = error && error.customAttributes;\n if (httpErrorStatus === 404) {\n return null;\n }\n throw error;\n }\n};\n\nexport default getCourseLogoOrg;\n"],"file":"api.js"}