Compare commits

...

37 Commits

Author SHA1 Message Date
renovate[bot]
1ab823481f fix(deps): update font awesome 2026-02-10 22:04:15 +00:00
Braden MacDonald
8a5ba98e96 fix(deps): move test deps to devDependencies (#577)
And remove jest-environment-jsdom altogether as we don't reference it directly.
2026-01-30 22:51:00 -05:00
renovate[bot]
29e96e3b5a chore(deps): update dependency lodash to v4.17.23 [security] (#576)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-27 14:26:14 +00:00
Adolfo R. Brandes
1abf704144 build: Update the release workflow to use OIDC. (#575)
Also make other smaller updates to modernize the release file.
2026-01-27 09:21:51 -05:00
renovate[bot]
9905fff1a0 fix(deps): update dependency jest-environment-jsdom to v30 (#573)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-29 05:06:50 +00:00
renovate[bot]
c63030a52d chore(deps): update dependency @openedx/paragon to v23.18.2 (#572)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-22 05:10:03 +00:00
renovate[bot]
08445d891d chore(deps): update dependency ts-jest to v29.4.6 (#571)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-15 08:56:13 +00:00
renovate[bot]
1dc8f3e654 chore(deps): update dependency @openedx/paragon to v23.18.1 (#570)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-15 05:53:36 +00:00
renovate[bot]
0f56f46109 chore(deps): update dependency @openedx/paragon to v23.18.0 (#568)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-24 06:00:14 +00:00
renovate[bot]
8b9246efe7 chore(deps): update dependency react-router-dom to v6.30.2 (#567)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-17 06:41:59 +00:00
renovate[bot]
b1335b9373 chore(deps): update dependency @openedx/paragon to v23.16.0 (#566)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-10 06:31:34 +00:00
renovate[bot]
bbe3b58620 chore(deps): update dependency @openedx/paragon to v23.15.2 (#564)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-03 05:07:01 +00:00
renovate[bot]
c99804bff4 chore(deps): update dependency @openedx/paragon to v23.15.0 (#563)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-27 08:48:12 +00:00
renovate[bot]
2d03191631 chore(deps): update dependency @edx/frontend-platform to v8.5.2 (#562)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-27 05:30:13 +00:00
renovate[bot]
c23d3fe74d chore(deps): update dependency ts-jest to v29.4.5 (#560)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 19:04:38 +00:00
Sarina Canelake
1d12c6506e fix: Update sandbox link in studio footer (#561) 2025-10-20 19:01:40 +00:00
renovate[bot]
39a88243e5 chore(deps): update dependency @openedx/paragon to v23.14.9 (#558)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 14:59:07 -04:00
oleksandr.buhaienko
9466f6aced test: Remove support for Node 20 2025-09-26 11:55:14 -03:00
bydawen
7cb75a333f build: Upgrade to Node 24 (#546)
Co-authored-by: Peter Kulko <93188219+PKulkoRaccoonGang@users.noreply.github.com>
2025-09-26 09:19:12 -03:00
Feanil Patel
4dcbae37f2 Merge pull request #557 from openedx/feanil/remove-reactifex-packages
build: remove unused @edx/reactifex package
2025-09-25 14:03:22 -04:00
Feanil Patel
636e71e141 build: remove unused @edx/reactifex package
Remove @edx/reactifex package from devDependencies as it is no longer
needed. Translation extraction functionality has been verified to work
correctly without these dependencies.

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-25 14:01:42 -04:00
renovate[bot]
320cfa17a2 chore(deps): update dependency ts-jest to v29.4.4 (#555)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-25 14:01:30 -04:00
bydawen
b61302c3f5 test: Add Node 24 to CI matrix (#545) 2025-09-16 10:40:30 -04:00
renovate[bot]
e6444392a6 chore(deps): update dependency @openedx/paragon to v23.14.2 (#554)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-15 20:15:53 +00:00
renovate[bot]
cd10265c60 chore(deps): update dependency @edx/frontend-platform to v8.5.1 (#553)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-15 05:44:59 +00:00
renovate[bot]
c7a84e62f1 fix(deps): update dependency @fortawesome/react-fontawesome to v0.2.6 (#552)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-08 10:11:45 +00:00
renovate[bot]
2d3c5ecc4c chore(deps): update dependency @openedx/frontend-build to v14.6.2 (#551)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-08 06:18:00 +00:00
renovate[bot]
b6c1f77331 fix(deps): update dependency ts-jest to v29.4.1 (#544)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-31 09:11:17 +00:00
renovate[bot]
a3ef54e2bf chore(deps): update dependency @openedx/frontend-build to v14.6.1 (#543)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-29 17:18:07 +00:00
Jacobo Dominguez
bb69baecb0 refactor: replacing injectIntl with useIntl (#550) 2025-08-29 13:15:46 -04:00
renovate[bot]
95e191cf86 chore(deps): update dependency @openedx/paragon to v23.12.2 (#541)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-16 12:52:14 +00:00
renovate[bot]
61702da769 chore(deps): update dependency @edx/frontend-platform to v8.4.0 (#540)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-16 06:07:06 +00:00
renovate[bot]
47d467747f chore(deps): update dependency @openedx/paragon to v23.10.1 (#539)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-09 11:58:16 +00:00
renovate[bot]
75bd146e72 chore(deps): update dependency @edx/frontend-platform to v8.3.9 (#538)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-09 06:00:23 +00:00
jacobo-dominguez-wgu
db201af910 feat: updating help buttons links and texts (#535) 2025-06-03 13:15:58 -04:00
renovate[bot]
281b817084 chore(deps): update dependency @openedx/paragon to v23.10.0 (#537)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-02 11:18:45 +00:00
renovate[bot]
08b69b8096 chore(deps): update dependency @edx/frontend-platform to v8.3.8 (#536)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-02 06:14:10 +00:00
11 changed files with 9225 additions and 2552 deletions

View File

@@ -4,6 +4,11 @@ on:
branches:
- master
- alpha
permissions:
id-token: write # Required for OIDC
contents: write # For Semantic Release tagging
jobs:
release:
name: Release
@@ -13,12 +18,10 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Nodejs Env
run: echo "NODE_VER=`cat .nvmrc`" >> $GITHUB_ENV
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VER }}
node-version-file: '.nvmrc'
- name: Install dependencies
run: npm ci
- name: Validate package-lock.json changes
@@ -37,7 +40,6 @@ jobs:
- name: Build
run: npm run build
- name: Release
run: npx semantic-release@25
env:
GITHUB_TOKEN: ${{ secrets.SEMANTIC_RELEASE_GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.SEMANTIC_RELEASE_NPM_TOKEN }}
run: npx semantic-release
GITHUB_TOKEN: ${{ secrets.OPENEDX_SEMANTIC_RELEASE_GITHUB_TOKEN }}

2
.nvmrc
View File

@@ -1 +1 @@
20
24

View File

@@ -62,9 +62,9 @@ Cloning and Startup
``git clone https://github.com/openedx/frontend-component-footer.git``
2. Use node v18.x.
2. Use node v24.x.
The current version of the micro-frontend build scripts support node 18.
The current version of the micro-frontend build scripts support node 24.
Using other major versions of node *may* work, but this is unsupported. For
convenience, this repository includes an .nvmrc file to help in setting the
correct node version via `nvm <https://github.com/nvm-sh/nvm>`_.

11579
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -34,7 +34,6 @@
"@edx/brand": "npm:@openedx/brand-openedx@^1.2.2",
"@edx/browserslist-config": "^1.1.1",
"@edx/frontend-platform": "^8.2.1",
"@edx/reactifex": "^2.1.1",
"@openedx/frontend-build": "^14.3.1",
"@openedx/paragon": "^23.3.0",
"@testing-library/jest-dom": "^5.16.4",
@@ -45,22 +44,21 @@
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-redux": "8.1.3",
"react-router-dom": "6.30.1",
"react-router-dom": "6.30.2",
"react-test-renderer": "18.3.1",
"redux": "4.2.1",
"semantic-release": "21.1.2"
"semantic-release": "21.1.2",
"ts-jest": "^29.1.2"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "6.7.2",
"@fortawesome/free-brands-svg-icons": "6.7.2",
"@fortawesome/free-regular-svg-icons": "6.7.2",
"@fortawesome/free-solid-svg-icons": "6.7.2",
"@fortawesome/react-fontawesome": "0.2.2",
"@fortawesome/fontawesome-svg-core": "7.2.0",
"@fortawesome/free-brands-svg-icons": "7.2.0",
"@fortawesome/free-regular-svg-icons": "7.2.0",
"@fortawesome/free-solid-svg-icons": "7.2.0",
"@fortawesome/react-fontawesome": "3.2.0",
"@openedx/frontend-plugin-framework": "^1.7.0",
"classnames": "^2.5.1",
"jest-environment-jsdom": "^29.7.0",
"lodash": "^4.17.21",
"ts-jest": "^29.1.2"
"lodash": "^4.17.21"
},
"peerDependencies": {
"@edx/frontend-platform": "^7.0.0 || ^8.0.0",

View File

@@ -1,6 +1,6 @@
import React from 'react';
import React, { useContext } from 'react';
import PropTypes from 'prop-types';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { useIntl } from '@edx/frontend-platform/i18n';
import { sendTrackEvent } from '@edx/frontend-platform/analytics';
import { ensureConfig } from '@edx/frontend-platform';
import { AppContext } from '@edx/frontend-platform/react';
@@ -17,13 +17,17 @@ const EVENT_NAMES = {
FOOTER_LINK: 'edx.bi.footer.link',
};
class SiteFooter extends React.Component {
constructor(props) {
super(props);
this.externalLinkClickHandler = this.externalLinkClickHandler.bind(this);
}
const SiteFooter = ({
supportedLanguages,
onLanguageSelected,
logo,
}) => {
const intl = useIntl();
const { config } = useContext(AppContext);
externalLinkClickHandler(event) {
const showLanguageSelector = supportedLanguages.length > 0 && onLanguageSelected;
const externalLinkClickHandler = (event) => {
const label = event.currentTarget.getAttribute('href');
const eventName = EVENT_NAMES.FOOTER_LINK;
const properties = {
@@ -31,52 +35,39 @@ class SiteFooter extends React.Component {
label,
};
sendTrackEvent(eventName, properties);
}
};
render() {
const {
supportedLanguages,
onLanguageSelected,
logo,
intl,
} = this.props;
const showLanguageSelector = supportedLanguages.length > 0 && onLanguageSelected;
const { config } = this.context;
return (
<footer
role="contentinfo"
className="footer d-flex border-top py-3 px-4"
>
<div className="container-fluid d-flex">
<a
className="d-block"
href={config.LMS_BASE_URL}
aria-label={intl.formatMessage(messages['footer.logo.ariaLabel'])}
>
<img
style={{ maxHeight: 45 }}
src={logo || config.LOGO_TRADEMARK_URL}
alt={intl.formatMessage(messages['footer.logo.altText'])}
/>
</a>
<div className="flex-grow-1" />
{showLanguageSelector && (
<LanguageSelector
options={supportedLanguages}
onSubmit={onLanguageSelected}
/>
)}
</div>
</footer>
);
}
}
SiteFooter.contextType = AppContext;
return (
<footer
role="contentinfo"
className="footer d-flex border-top py-3 px-4"
>
<div className="container-fluid d-flex">
<a
className="d-block"
href={config.LMS_BASE_URL}
aria-label={intl.formatMessage(messages['footer.logo.ariaLabel'])}
onClick={externalLinkClickHandler}
>
<img
style={{ maxHeight: 45 }}
src={logo || config.LOGO_TRADEMARK_URL}
alt={intl.formatMessage(messages['footer.logo.altText'])}
/>
</a>
<div className="flex-grow-1" />
{showLanguageSelector && (
<LanguageSelector
options={supportedLanguages}
onSubmit={onLanguageSelected}
/>
)}
</div>
</footer>
);
};
SiteFooter.propTypes = {
intl: intlShape.isRequired,
logo: PropTypes.string,
onLanguageSelected: PropTypes.func,
supportedLanguages: PropTypes.arrayOf(PropTypes.shape({
@@ -91,5 +82,5 @@ SiteFooter.defaultProps = {
supportedLanguages: [],
};
export default injectIntl(SiteFooter);
export default SiteFooter;
export { EVENT_NAMES };

View File

@@ -1,10 +1,11 @@
import React from 'react';
import PropTypes from 'prop-types';
import { injectIntl, intlShape, FormattedMessage } from '@edx/frontend-platform/i18n';
import { useIntl, FormattedMessage } from '@edx/frontend-platform/i18n';
const LanguageSelector = ({
intl, options, onSubmit, ...props
options, onSubmit, ...props
}) => {
const intl = useIntl();
const handleSubmit = (e) => {
e.preventDefault();
const languageCode = e.target.elements['site-footer-language-select'].value;
@@ -47,7 +48,6 @@ const LanguageSelector = ({
};
LanguageSelector.propTypes = {
intl: intlShape.isRequired,
onSubmit: PropTypes.func.isRequired,
options: PropTypes.arrayOf(PropTypes.shape({
value: PropTypes.string,
@@ -55,4 +55,4 @@ LanguageSelector.propTypes = {
})).isRequired,
};
export default injectIntl(LanguageSelector);
export default LanguageSelector;

View File

@@ -12,6 +12,7 @@ exports[`<Footer /> renders correctly renders with a language selector 1`] = `
aria-label="edX Home"
className="d-block"
href="http://localhost:18000"
onClick={[Function]}
>
<img
alt="Powered by Open edX"
@@ -81,6 +82,7 @@ exports[`<Footer /> renders correctly renders without a language selector 1`] =
aria-label="edX Home"
className="d-block"
href="http://localhost:18000"
onClick={[Function]}
>
<img
alt="Powered by Open edX"
@@ -111,6 +113,7 @@ exports[`<Footer /> renders correctly renders without a language selector in es
aria-label="edX Home"
className="d-block"
href="http://localhost:18000"
onClick={[Function]}
>
<img
alt="Powered by Open edX"

View File

@@ -16,32 +16,18 @@ ensureConfig([
const BUTTONS = [
{
as: 'a',
href: 'https://docs.openedx.org/',
href: 'https://docs.openedx.org/en/latest/educators/quickstarts/build_a_course.html',
size: 'sm',
message: messages.edxDocumentationButtonLabel,
message: messages.educatorsDocsButtonLabel,
dataTestid: null,
},
{
as: 'a',
href: 'https://openedx.org/',
href: 'https://training.openedx.io/courses/course-v1:OpenedX+DemoX+Demo_Course/about',
size: 'sm',
message: messages.openEdxPortalButtonLabel,
dataTestid: 'openEdXPortalButton',
},
{
as: 'a',
href: 'https://www.edx.org/course/edx101-overview-of-creating-an-edx-course#.VO4eaLPF-n1',
size: 'sm',
message: messages.edx101ButtonLabel,
message: messages.openEdxDemoCourseButtonLabel,
dataTestid: 'openEdXDemoCourseButton',
},
{
as: 'a',
href: 'https://www.edx.org/course/studiox-creating-a-course-with-edx-studio',
size: 'sm',
message: messages.studioXButtonLabel,
dataTestid: null,
},
];
const HelpContent = () => {

View File

@@ -28,8 +28,8 @@ describe('HelpContent', () => {
it('renders all help buttons', () => {
const config = { SUPPORT_EMAIL: 'support@example.com' };
render(<ContentWithContext config={config} />);
expect(screen.getByText(messages.edxDocumentationButtonLabel.defaultMessage)).toBeInTheDocument();
expect(screen.getByText(messages.edx101ButtonLabel.defaultMessage)).toBeInTheDocument();
expect(screen.getByText(messages.educatorsDocsButtonLabel.defaultMessage)).toBeInTheDocument();
expect(screen.getByText(messages.openEdxDemoCourseButtonLabel.defaultMessage)).toBeInTheDocument();
});
it('does not render contact button if SUPPORT_EMAIL is empty', () => {

View File

@@ -11,25 +11,15 @@ const messages = defineMessages({
defaultMessage: 'Hide Studio help',
description: 'Label for button that closes the collapsed section with help buttons',
},
edxDocumentationButtonLabel: {
id: 'authoring.footer.help.edxDocumentation.button.label',
defaultMessage: 'edX documentation',
description: 'Label for button that links to the edX documentation site',
educatorsDocsButtonLabel: {
id: 'authoring.footer.help.educatorsDocs.button.label',
defaultMessage: 'Open edX Educators Docs',
description: 'Label for button that links to the build a course quickstart site',
},
openEdxPortalButtonLabel: {
id: 'authoring.footer.help.openEdxPortal.button.label',
defaultMessage: 'Open edX portal',
description: 'Label for button that links to the Open edX portal',
},
edx101ButtonLabel: {
id: 'authoring.footer.help.edx101.button.label',
defaultMessage: 'Enroll in edX 101',
description: 'Label for button that links to the edX 101 course',
},
studioXButtonLabel: {
id: 'authoring.footer.help.studioX.button.label',
defaultMessage: 'Enroll in StudioX',
description: 'Label for button that links to the edX StudioX course',
openEdxDemoCourseButtonLabel: {
id: 'authoring.footer.help.openEdxDemoCourse.button.label',
defaultMessage: 'Open edX Demo Course',
description: 'Label for button that links to the open edX demo course portal',
},
contactUsButtonLabel: {
id: 'authoring.footer.help.contactUs.button.label',