Compare commits

...

418 Commits

Author SHA1 Message Date
Régis Behmo
ed379258a8 feat: avoid pulling entire lodash library into build (#515)
Importing from lodash was causing the entire library to be pulled. This
change reduces the compressed production build size of
frontend-app-profile by 6kB.
2025-04-02 08:52:10 -04:00
renovate[bot]
ebb87070da chore(deps): update dependency @openedx/frontend-build to v14.4.1 (#514)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31 11:06:12 +00:00
renovate[bot]
cbcaf4c9fe chore(deps): update dependency @openedx/paragon to v23.4.3 (#513)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31 05:44:12 +00:00
renovate[bot]
d3dda9e56d chore(deps): update dependency @openedx/paragon to v23.4.2 (#512)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-24 11:07:50 +00:00
renovate[bot]
db3c54201c chore(deps): update dependency @edx/frontend-platform to v8.3.3 (#511)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-24 07:03:14 +00:00
renovate[bot]
8f8b4645b4 chore(deps): update dependency react-router-dom to v6.30.0 (#510)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-17 11:45:57 +00:00
renovate[bot]
194f93e85e chore(deps): update dependency @openedx/paragon to v23.4.1 (#509)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-17 05:40:47 +00:00
Peter Kulko
10fc7a2d72 feat: add support for Paragon design tokens (#303)
---------

Co-authored-by: Diana Catalina Olarte <diana.olarte@edunext.co>
2025-03-13 10:58:01 -04:00
renovate[bot]
1d7a871cfd chore(deps): update dependency react-redux to v8.1.3 (#505)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 12:27:46 +00:00
renovate[bot]
cf09847e95 chore(deps): update dependency @openedx/paragon to v22.15.3 (#504)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 05:41:21 +00:00
Adam Stankiewicz
84e30f0fb7 feat: enable support for React 18 (#499) 2025-02-24 10:55:09 -05:00
renovate[bot]
288b6c7d0f fix(deps): update dependency ts-jest to v29.2.6 (#503)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 11:43:20 +00:00
renovate[bot]
9a23003f7f chore(deps): update dependency @openedx/paragon to v22.15.2 (#502)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 06:07:02 +00:00
renovate[bot]
922a31b90b chore(deps): update dependency @openedx/paragon to v22.15.1 (#501)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-17 05:54:05 +00:00
Adolfo R. Brandes
73236b296b Merge pull request #500 from openedx/feanil/add_owner
docs: Document the owner and drop the old metadata file
2025-02-14 16:55:10 -03:00
Feanil Patel
eb92d8f1f1 docs: Document the owner and drop the old metadata file
This is going to be changing soon with the module federation work so I
think it makes sense to be maintained by the committers-frontend group.

I'm also cleaning up the old openedx.yaml file which is obsolete and out
of date while I'm adding the new metadata that should be up-to-date.
2025-02-14 14:49:31 -05:00
renovate[bot]
bc79936022 chore(deps): update dependency @openedx/paragon to v22.14.0 (#498)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-27 08:52:28 +00:00
renovate[bot]
2aac71a988 chore(deps): update dependency @edx/browserslist-config to v1.5.0 (#497)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-27 05:27:37 +00:00
renovate[bot]
032105da7f chore(deps): update dependency react-router-dom to v6.28.2 (#496)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-20 05:06:33 +00:00
renovate[bot]
6e2ccf2f2c chore(deps): update dependency @openedx/paragon to v22.13.0 (#495)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-13 08:51:07 +00:00
renovate[bot]
907145be24 chore(deps): update dependency @edx/frontend-platform to v8.1.5 (#494)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-13 05:26:41 +00:00
renovate[bot]
58791757d7 chore(deps): update dependency @edx/frontend-platform to v8.1.4 (#492)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-06 07:47:14 +00:00
renovate[bot]
583aaf676e chore(deps): update dependency @edx/browserslist-config to v1.4.0 (#491)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-30 06:13:49 +00:00
renovate[bot]
2e46ec1f9b fix(deps): update font awesome to v6.7.2 (#490)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-23 06:15:12 +00:00
renovate[bot]
bb80d92512 chore(deps): update dependency react-router-dom to v6.28.1 (#489)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-23 05:32:44 +00:00
renovate[bot]
e138dedd29 chore(deps): update dependency @edx/frontend-platform to v8.1.3 (#488)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-16 06:41:30 +00:00
renovate[bot]
073a6c2a18 chore(deps): update dependency @openedx/frontend-build to v14.2.2 (#487)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-09 06:28:35 +00:00
renovate[bot]
41cf64b9d7 chore(deps): update dependency @openedx/frontend-plugin-framework to v1.4.1 (#485)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-02 05:14:54 +00:00
renovate[bot]
908b5b0b11 fix(deps): update font awesome to v6.7.1 (#484)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-25 11:37:33 +00:00
renovate[bot]
59dd82c919 chore(deps): update dependency @openedx/frontend-build to v14.2.0 (#483)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-25 07:08:46 +00:00
renovate[bot]
afed581a18 chore(deps): update dependency @openedx/paragon to v22.10.0 (#481)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-18 06:59:20 +00:00
renovate[bot]
f6b02cbfe7 chore(deps): update dependency react-router-dom to v6.28.0 (#480)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-11 06:47:54 +00:00
renovate[bot]
ede01dbd20 chore(deps): update dependency @openedx/frontend-plugin-framework to v1.4.0 2024-11-04 07:07:45 +00:00
Bilal Qamar
4a0f244a1a test: Remove support for Node 18 (#472) 2024-10-31 16:04:18 -04:00
renovate[bot]
906d9a78c1 chore(deps): update dependency @openedx/paragon to v22.9.0 2024-10-21 06:15:16 +00:00
renovate[bot]
ac0d5f42f7 chore(deps): update dependency react-router-dom to v6.27.0 2024-10-14 04:18:36 +00:00
renovate[bot]
e9d1b435dd chore(deps): update dependency @edx/frontend-platform to v8.1.2 2024-10-07 07:12:08 +00:00
Rômulo Penido
cc647e7bc8 feat: expose containerProps in StudioFooter [FC-0062] (#463) 2024-10-01 09:44:49 -04:00
renovate[bot]
2d5f5fe787 chore(deps): update dependency @openedx/frontend-build to v14.1.5 2024-09-30 04:09:28 +00:00
renovate[bot]
ef7bd9284a chore(deps): update dependency @openedx/frontend-build to v14.1.4 2024-09-23 04:33:25 +00:00
Bilal Qamar
10f9d7c1cd build: Upgrade to Node 20 (#471) 2024-09-19 17:50:12 -04:00
Bilal Qamar
6b3a49ccec test: Add Node 20 to CI matrix (#467) 2024-09-16 11:41:53 -04:00
renovate[bot]
f473c98bb8 chore(deps): update dependency @openedx/paragon to v22.8.1 2024-09-16 11:27:58 +00:00
renovate[bot]
bd52be3177 chore(deps): update dependency react-router-dom to v6.26.2 2024-09-16 07:18:57 +00:00
renovate[bot]
ef12ac20fe chore(deps): update dependency @openedx/frontend-plugin-framework to v1.3.0 2024-09-09 07:44:24 +00:00
renovate[bot]
7fa6bd8740 chore(deps): update dependency @openedx/frontend-build to v14.1.2 2024-09-09 05:03:32 +00:00
renovate[bot]
8d9178f532 chore(deps): update dependency @openedx/frontend-build to v14.1.1 2024-09-02 07:37:30 +00:00
renovate[bot]
98bcacfced fix(deps): update font awesome to v6.6.0 2024-08-26 11:26:33 +00:00
renovate[bot]
ac78454133 fix(deps): update dependency ts-jest to v29.2.5 2024-08-26 07:03:36 +00:00
renovate[bot]
09b7c8be9a chore(deps): update dependency @openedx/frontend-build to v14.1.0 2024-08-19 10:06:43 +00:00
renovate[bot]
c992a9129a chore(deps): update dependency react-router-dom to v6.26.1 2024-08-19 07:52:04 +00:00
renovate[bot]
7f6ad73a25 chore(deps): update dependency @openedx/frontend-build to v14.0.15 2024-08-12 12:21:16 +00:00
renovate[bot]
cefbd28d9b chore(deps): update dependency @openedx/frontend-plugin-framework to v1.2.3 2024-08-12 06:52:01 +00:00
renovate[bot]
c26bdc54e1 chore(deps): update dependency react-router-dom to v6.26.0 2024-08-05 09:38:33 +00:00
renovate[bot]
02f6b44368 fix(deps): update dependency ts-jest to v29.2.4 2024-08-05 06:46:35 +00:00
renovate[bot]
4cbde7e38f chore(deps): update dependency @openedx/frontend-build to v14.0.14 2024-07-29 10:54:37 +00:00
renovate[bot]
bdb6ecb79f chore(deps): update dependency @edx/frontend-platform to v8.1.1 2024-07-29 07:14:47 +00:00
renovate[bot]
46c1ffd731 chore(deps): update dependency react-router-dom to v6.25.1 2024-07-22 10:14:39 +00:00
renovate[bot]
b6bd211c6e chore(deps): update dependency @openedx/paragon to v22.7.0 2024-07-22 06:29:45 +00:00
renovate[bot]
ef8445a1b2 fix(deps): update dependency ts-jest to v29.2.3 2024-07-22 04:08:27 +00:00
renovate[bot]
5b34595520 fix(deps): update dependency ts-jest to v29.2.2 2024-07-15 09:54:25 +00:00
renovate[bot]
32ae2d8e7c chore(deps): update dependency @edx/frontend-platform to v8.1.0 2024-07-15 06:51:47 +00:00
renovate[bot]
abac1cd6d4 chore(deps): update dependency react-router-dom to v6.24.1 2024-07-08 08:29:05 +00:00
renovate[bot]
e0115e3d88 chore(deps): update dependency @openedx/frontend-plugin-framework to v1.2.2 2024-07-08 04:03:54 +00:00
renovate[bot]
ff18f3add9 fix(deps): update dependency ts-jest to v29.1.5 2024-07-01 12:24:59 +00:00
renovate[bot]
4926c3105b chore(deps): update dependency react-router-dom to v6.24.0 2024-07-01 06:05:04 +00:00
renovate[bot]
838a81a020 chore(deps): update dependency @openedx/paragon to v22.6.1 2024-07-01 04:23:27 +00:00
Adolfo R. Brandes
0ac6840cea Merge pull request #437 from arbrandes/update-codecov
build: Update codecov and use token
2024-06-27 09:23:31 -03:00
Adolfo R. Brandes
26a17bf2e4 build: Update codecov and use token
Update codecov to the latest version and start using the org-wide token for uploads.

See https://github.com/openedx/wg-frontend/issues/179
2024-06-27 09:21:08 -03:00
renovate[bot]
17b9710810 chore(deps): update dependency @openedx/frontend-build to v14.0.10 2024-06-24 07:49:38 +00:00
renovate[bot]
df0129485e chore(deps): update dependency @openedx/frontend-build to v14.0.9 2024-06-17 07:25:48 +00:00
renovate[bot]
1c2f290faa chore(deps): update dependency @openedx/paragon to v22.6.0 2024-06-10 04:43:05 +00:00
renovate[bot]
9af9024bcc chore(deps): update dependency @openedx/frontend-plugin-framework to v1.2.1 2024-06-03 09:31:52 +00:00
renovate[bot]
0008bd485a chore(deps): update dependency @edx/frontend-platform to v8.0.4 2024-06-03 07:09:11 +00:00
renovate[bot]
181b9916a0 fix(deps): update dependency ts-jest to v29.1.4 2024-06-03 04:51:17 +00:00
renovate[bot]
22dbec317c fix(deps): update dependency ts-jest to v29.1.3 2024-05-27 11:12:12 +00:00
renovate[bot]
6f15e4dafa fix(deps): update dependency @fortawesome/react-fontawesome to v0.2.2 2024-05-27 07:24:23 +00:00
renovate[bot]
9f5aed3c76 fix(deps): update dependency @fortawesome/react-fontawesome to v0.2.1 2024-05-20 13:16:53 +00:00
renovate[bot]
54bc04b182 chore(deps): update dependency @edx/frontend-platform to v8.0.3 2024-05-20 04:41:57 +00:00
Brian Smith
ea2578fa15 fix!: remove FooterSlot component
BREAKING CHANGE: the `FooterSlot` component will now be provided by `frontend-slot-footer`.
2024-05-14 11:31:03 -03:00
renovate[bot]
5f7fab236d chore(deps): update dependency @openedx/paragon to v22.4.0 2024-05-13 09:24:28 +00:00
renovate[bot]
adf5f6c9a8 chore(deps): update dependency react-router-dom to v6.23.1 2024-05-13 06:20:49 +00:00
renovate[bot]
132b080195 chore(deps): update dependency @edx/frontend-platform to v8.0.2 2024-05-13 04:57:36 +00:00
Brian Smith
0d4ea96874 feat: provide FooterSlot
This allows consuming MFEs to utilize a standardized Frontend
Plugin Framework `PluginSlot` for replacing the footer.
2024-05-09 13:44:51 -03:00
renovate[bot]
8b9f5fa348 chore(deps): update dependency @openedx/paragon to v22.3.2 2024-05-06 06:47:39 +00:00
renovate[bot]
c014e30ca8 chore(deps): update dependency react-router-dom to v6.23.0 2024-04-29 09:52:14 +00:00
renovate[bot]
0e6ab3c358 chore(deps): update dependency @openedx/paragon to v22.3.1 2024-04-29 06:25:16 +00:00
renovate[bot]
7d0a126580 chore(deps): update dependency @edx/frontend-platform to v8.0.1 2024-04-29 04:40:18 +00:00
Bilal Qamar
c422ce40be feat: Updated frontend-build to bump jest version to v29 (#317)
* refactor: updated frontend-build to bump jest version to v29

* refactor: updated snapshots

* refactor: updated frontend-build & failing snapshots

* refactor: updated package-lock

* refactor: updated frontend-build to alpha, updated snapshots

* refactor: added overrides to resolve dependency issues

* refactor: updated frontend-build to the version which has eslint alpha synced with master

* feat: updated frontend-build and frontend-platform major versions

* refactor: updated peerDependency as per suggestion
2024-04-23 13:56:59 +05:00
renovate[bot]
7299d5367f chore(deps): update dependency @openedx/paragon to v22.2.2 2024-04-22 10:02:00 +00:00
renovate[bot]
38203b91ba chore(deps): update dependency @edx/frontend-platform to v7.1.4 2024-04-22 06:32:01 +00:00
renovate[bot]
83c340fe08 chore(deps): update dependency @openedx/paragon to v22.2.1 2024-04-15 13:02:17 +00:00
renovate[bot]
9eaebf4b11 chore(deps): update dependency @openedx/frontend-build to v13.1.4 2024-04-15 09:58:34 +00:00
renovate[bot]
2a883857cf chore(deps): update dependency @edx/brand to v1.2.3 2024-04-15 06:41:52 +00:00
renovate[bot]
5f26c1ae93 fix(deps): update font awesome to v6.5.2 2024-04-15 05:16:19 +00:00
Samir Sabri
89ad7234ac feat!: remove Transifex calls for OEP-58 (#355) 2024-03-25 11:23:10 -04:00
renovate[bot]
936915f81f chore(deps): update dependency @edx/frontend-platform to v7.1.3 2024-03-25 12:10:00 +00:00
Bilal Qamar
b993992987 chore(deps): update frontend-platform to v7 (#409) 2024-03-22 11:34:48 +05:00
Adolfo R. Brandes
64fc8adeed build: start releasing alpha packages 2024-03-20 13:09:22 -03:00
Braden MacDonald
a49b06349e fix: invalid frontend-platform import in Footer.jsx (#398) 2024-03-11 17:28:12 +05:00
Kristin Aoki
aa13b4946c Merge pull request #406 from openedx/KristinAoki/fix-accessibility-page-link-env-variable
fix: variable name for the accessibility link
2024-03-08 17:58:12 -05:00
KristinAoki
cff78e021c fix: variable name for the accessibility link 2024-03-08 09:32:55 -05:00
renovate[bot]
62bf038a06 chore(deps): update dependency react-router-dom to v6.21.3 2024-01-22 09:08:36 +00:00
Brian Smith
eed127969d fix: update paragon dep to support v22 (#400) 2024-01-19 11:30:50 -05:00
Brian Smith
dcce076942 fix: update frontend-platform peer dependency (#399)
This updates the `frontend-platform` peer dependency to require a version that has `paragon` in the `openedx` scope as a peer dependency, as opposed to the `edx` scope
2024-01-18 12:59:07 -05:00
Brian Smith
6cf8bf3965 chore!: move paragon to peer dependency using @openedx scope (#394)
BREAKING CHANGE: consuming applications must now provide `paragon` from the `@openedx` scope
2024-01-16 11:06:19 -05:00
renovate[bot]
fad5b0925e chore(deps): update dependency react-router-dom to v6.21.2 2024-01-15 14:16:47 +00:00
renovate[bot]
1f5e5fa4dd chore(deps): update dependency @openedx/frontend-build to v13.0.27 2024-01-15 09:27:37 +00:00
renovate[bot]
a94f57dae2 fix(deps): update dependency @openedx/paragon to v21.13.0 2024-01-01 13:35:46 +00:00
renovate[bot]
531ae4a603 chore(deps): update dependency @edx/frontend-platform to v6.2.0 2024-01-01 09:34:17 +00:00
Mashal Malik
2a2f9ed43f refactor: replace @edx/paragon and @edx/frontend-build (#386) 2024-01-01 13:06:16 +05:00
renovate[bot]
5c0ac3de54 chore(deps): update dependency react-router-dom to v6.21.1 2023-12-25 07:23:00 +00:00
Syed Ali Abbas Zaidi
4aec12eae0 feat: migrate enzyme with RTL (#372)
* feat: migrate enzyme with RTL

* fix: fixed lockfile issues

---------

Co-authored-by: Abdullah Waheed <abdullah.waheed@arbisoft.com>
2023-12-25 12:20:11 +05:00
Asad Ali
5059e0dac1 fix: fix config name from MARKETING_BASE_URL to MARKETING_SITE_BASE_URL (#381) 2023-12-22 18:45:15 +05:00
renovate[bot]
ed5aeb8179 chore(deps): update dependency react-router-dom to v6.21.0 2023-12-18 12:33:17 +00:00
renovate[bot]
19fe6680a9 chore(deps): update dependency @edx/frontend-build to v13.0.14 2023-12-18 09:30:13 +00:00
Peter Kulko
59c78ac479 chore: added start:with-theme npm script (#378) 2023-12-15 11:41:15 +02:00
renovate[bot]
238854bdfb chore(deps): update dependency @edx/frontend-platform to v6.1.2 2023-12-11 19:17:34 +00:00
renovate[bot]
07ad578613 chore(deps): update dependency @edx/frontend-build to v13.0.12 2023-12-11 12:17:05 +00:00
dependabot[bot]
fc3c9581f3 build(deps-dev): bump @adobe/css-tools from 4.3.1 to 4.3.2 (#373)
Bumps [@adobe/css-tools](https://github.com/adobe/css-tools) from 4.3.1 to 4.3.2.
- [Changelog](https://github.com/adobe/css-tools/blob/main/History.md)
- [Commits](https://github.com/adobe/css-tools/commits)

---
updated-dependencies:
- dependency-name: "@adobe/css-tools"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-06 13:11:11 +05:00
renovate[bot]
0015b72eb7 fix(deps): update font awesome to v6.5.1 2023-12-04 14:14:17 +00:00
renovate[bot]
f694e322ee chore(deps): update dependency react-router-dom to v6.20.1 2023-12-04 10:33:49 +00:00
renovate[bot]
5e7ac40348 chore(deps): update dependency react-router-dom to v6.20.0 2023-11-27 12:52:56 +00:00
renovate[bot]
c2e5f0f403 chore(deps): update dependency @edx/frontend-platform to v6.1.1 2023-11-27 11:31:56 +00:00
renovate[bot]
d0b9a40f5d chore(deps): update dependency react-router-dom to v6.19.0 2023-11-20 12:22:39 +00:00
renovate[bot]
3f815b386f chore(deps): update dependency @edx/frontend-build to v13.0.8 2023-11-20 10:06:43 +00:00
renovate[bot]
e9bb918925 chore(deps): update actions/checkout action to v4 (#336)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-16 12:21:39 +05:00
renovate[bot]
9b1a3e994a chore(deps): update actions/setup-node action to v4 (#364)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-16 11:44:27 +05:00
Bilal Qamar
7253f9de2b feat: bumped frontend-platform version (#367) 2023-11-15 17:30:54 +05:00
Bilal Qamar
3e6ccb2ea1 Revert "chore: bumped frontend-platform version (#365)" (#366)
This reverts commit 7c3c925838.
2023-11-15 17:11:08 +05:00
Bilal Qamar
7c3c925838 chore: bumped frontend-platform version (#365) 2023-11-15 16:51:39 +05:00
renovate[bot]
cde76129af chore(deps): update dependency @edx/frontend-build to v13.0.5 2023-11-13 10:09:37 +00:00
renovate[bot]
29050d109f chore(deps): update dependency react-router-dom to v6.18.0 2023-11-06 16:36:59 +00:00
renovate[bot]
5caf0ea549 chore(deps): update dependency @edx/frontend-build to v13.0.4 2023-11-06 11:19:32 +00:00
renovate[bot]
3571e5c3ed fix(deps): update dependency @edx/paragon to v21.5.6 2023-10-30 14:35:46 +00:00
renovate[bot]
1011854f51 chore(deps): update dependency react-router-dom to v6.17.0 2023-10-30 09:35:57 +00:00
renovate[bot]
a5859702b5 chore(deps): update dependency @edx/frontend-build to v13.0.3 2023-10-30 07:46:50 +00:00
Bilal Qamar
2b3a13a5a0 chore: bumped frontend-platform version (#356) 2023-10-24 13:58:44 +05:00
Feanil Patel
ca4b4905b7 chore: Update to the new version of brand-openedx in the new scope. (#354)
Part of https://github.com/openedx/axim-engineering/issues/23

This updates the `@edx/brand` alias to point to the `brand-openedx` package at
the `openedx` scope. This does not impact imports because this package is used
via an alias.
2023-10-20 17:17:37 -04:00
dependabot[bot]
c7e42fda3d build(deps-dev): bump @babel/traverse from 7.22.5 to 7.23.2 (#353)
Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.22.5 to 7.23.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse)

---
updated-dependencies:
- dependency-name: "@babel/traverse"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-18 16:46:23 +05:00
Bilal Qamar
2266486398 feat: bumped frontend-platform to v6 (#352) 2023-10-18 16:05:49 +05:00
renovate[bot]
91cd859ffc chore(deps): update dependency @edx/frontend-platform to v5.6.1 2023-10-16 12:39:08 +00:00
renovate[bot]
c5e8a12f89 chore(deps): update dependency @testing-library/jest-dom to v5.17.0 2023-10-16 11:17:40 +00:00
Muhammad Abdullah Waheed
edd4cc4589 feat: babel-plugin-react-intl to babel-plugin-formatjs migration (#346)
* feat: babel-plugin-react-intl to babel-plugin-formatjs migration

* fix: upgraded frontend-build to fix security issue
2023-10-11 17:36:54 +05:00
renovate[bot]
6202398292 chore(deps): update dependency @edx/frontend-platform to v5.5.2 2023-10-09 16:04:26 +00:00
renovate[bot]
f8c26fc369 chore(deps): update dependency @testing-library/react to v12.1.5 2023-10-09 09:21:48 +00:00
Mashal Malik
63656116c5 refactor: update README file (#341)
* refactor: update readMe file

* refactor: update readMe file

* refactor: replace npm install with npm ci
2023-10-04 12:26:27 +05:00
Kristin Aoki
e2ccd1b56a feat: add studio footer for studio mfes 2023-10-02 10:49:55 -04:00
KristinAoki
c0f4b90505 Merge branch 'master' into KristinAoki/add-studio-footer 2023-10-02 10:30:49 -04:00
Mashal Malik
c3f5a07256 refactor: add @openedx in renovate automate configuration (#342)
Co-authored-by: Muhammad Abdullah Waheed <42172960+abdullahwaheed@users.noreply.github.com>
2023-10-02 19:06:37 +05:00
renovate[bot]
7450b8f061 chore(deps): update dependency @edx/paragon to v21.3.1 2023-10-02 09:25:06 +00:00
renovate[bot]
677d72813e chore(deps): update dependency @edx/frontend-build to v12.9.17 2023-10-02 08:00:58 +00:00
KristinAoki
abe24fb46a fix: remove unnecessary test 2023-09-29 16:10:23 -07:00
KristinAoki
ce5396c9ab fix: remove unused message 2023-09-29 15:25:39 -07:00
KristinAoki
dc0982dfd2 fix: remove unused code 2023-09-29 15:20:37 -07:00
KristinAoki
a9f6ca8b77 feat: add studio footer 2023-09-29 15:14:53 -07:00
renovate[bot]
d2e790ce99 chore(deps): update dependency @edx/paragon to v21.2.0 2023-09-25 12:16:29 +00:00
renovate[bot]
f1bd7d2ec2 chore(deps): update dependency @edx/frontend-platform to v5.4.0 2023-09-25 10:41:58 +00:00
renovate[bot]
425616defe chore(deps): update dependency @edx/paragon to v21 (#335)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-25 11:30:07 +05:00
renovate[bot]
fca4a6bd29 chore(deps): update dependency semantic-release to v21.1.2 2023-09-18 12:03:06 +00:00
renovate[bot]
bdaaa8541f chore(deps): update dependency @edx/frontend-platform to v5.3.2 2023-09-18 11:17:44 +00:00
renovate[bot]
0fce9cd9f7 chore(deps): update dependency @edx/frontend-platform to v5.3.1 2023-09-07 12:42:41 +00:00
Mashal Malik
e4adba4f66 refactor: update lock file version (#331)
Co-authored-by: Muhammad Abdullah Waheed <42172960+abdullahwaheed@users.noreply.github.com>
2023-08-31 12:44:46 +05:00
renovate[bot]
be8529246c chore(deps): update dependency semantic-release to v21.1.1 2023-08-28 13:35:14 +00:00
renovate[bot]
98f818e295 chore(deps): update dependency @edx/paragon to v20.46.2 2023-08-28 10:02:44 +00:00
renovate[bot]
fb869bc008 chore(deps): update dependency @edx/frontend-platform to v5.1.0 2023-08-21 15:37:16 +00:00
renovate[bot]
879f384809 fix(deps): update font awesome to v6.4.2 2023-08-21 14:20:50 +00:00
renovate[bot]
b65a80616b chore(deps): update dependency semantic-release to v21.0.9 2023-08-21 10:34:05 +00:00
renovate[bot]
d5f0bca2b7 chore(deps): update dependency @edx/frontend-build to v12.9.10 2023-08-21 07:38:30 +00:00
Syed Ali Abbas Zaidi
3e6eaa1ded feat: upgrade react router to v6 (#275)
* feat: upgrade react router to v6

* chore: update peer deps
2023-08-16 16:48:10 +05:00
renovate[bot]
48b56df115 chore(deps): update dependency @edx/frontend-platform to v4.6.1 2023-08-14 13:25:28 +00:00
renovate[bot]
1d2bfd8e40 chore(deps): update dependency @edx/frontend-build to v12.9.4 2023-08-14 09:47:01 +00:00
renovate[bot]
197f24a684 chore(deps): update dependency @edx/frontend-build to v12.9.3 2023-07-31 07:48:35 +00:00
renovate[bot]
0d6c99acbc chore(deps): update dependency @edx/frontend-build to v12.9.2 2023-07-24 12:20:51 +00:00
renovate[bot]
8213c3a66a chore(deps): update dependency @edx/paragon to v20.45.5 2023-07-24 09:23:45 +00:00
renovate[bot]
a6ae384f7e chore(deps): update dependency @edx/frontend-build to v12.8.66 2023-07-17 09:34:35 +00:00
renovate[bot]
dd612879e2 chore(deps): update dependency @edx/paragon to v20.45.2 2023-07-17 06:06:51 +00:00
renovate[bot]
248bab9370 chore(deps): update dependency @edx/frontend-build to v12.8.65 (#318)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-17 10:05:15 +05:00
renovate[bot]
92c879bf8f chore(deps): update dependency @edx/paragon to v20.45.1 2023-07-14 17:20:12 +00:00
Bilal Qamar
16275a2ecc fix: updated frontend-build to resolve word-wrap ReDoS vulnerability (#316) 2023-07-11 18:02:41 +05:00
renovate[bot]
970ca113e9 chore(deps): update dependency semantic-release to v21.0.7 2023-07-10 10:51:17 +00:00
renovate[bot]
65c459c53e chore(deps): update dependency @edx/frontend-build to v12.8.60 2023-07-10 06:09:06 +00:00
Bilal Qamar
961faafd3a fix: updated frontend-build to bump eslint version (#312)
* chore: updated frontend-build to bump eslint version

* refactor: updated package-lock
2023-07-06 18:12:51 +05:00
Bilal Qamar
16b468bdcc feat: update react & react-dom to v17 (#300)
* feat: update react & react-dom to v17

* build: update lock file

* build: update paragon version

* refactor: updated frontend-platform

---------

Co-authored-by: mashal-m <mashal.malik@arbisoft.com>
2023-07-05 12:09:22 +05:00
renovate[bot]
91d6ea6572 chore(deps): update dependency @edx/reactifex to v2.2.0 2023-07-03 14:20:16 +00:00
renovate[bot]
e13c7a6349 chore(deps): update dependency @edx/paragon to v20.45.0 2023-07-03 09:03:40 +00:00
renovate[bot]
ec288a6430 chore(deps): update dependency semantic-release to v21.0.6 2023-07-03 06:01:09 +00:00
renovate[bot]
10335c8075 chore(deps): update dependency @edx/frontend-build to v12.8.57 2023-06-26 07:55:51 +00:00
renovate[bot]
e09f1af861 chore(deps): update dependency @edx/browserslist-config to v1.2.0 2023-06-19 16:48:07 +00:00
renovate[bot]
c1e5885ecb chore(deps): update dependency @edx/frontend-build to v12.8.54 2023-06-19 10:14:52 +00:00
renovate[bot]
7849899658 chore(deps): update dependency semantic-release to v21.0.5 2023-06-12 12:46:28 +00:00
renovate[bot]
c508632126 chore(deps): update dependency @edx/frontend-build to v12.8.51 2023-06-12 09:04:04 +00:00
renovate[bot]
ef148e8d35 chore(deps): update dependency semantic-release to v21.0.3 2023-06-05 17:33:49 +00:00
renovate[bot]
b8a162f9c9 chore(deps): update dependency @edx/frontend-platform to v4.5.1 2023-06-05 12:33:51 +00:00
renovate[bot]
5643296f04 chore(deps): update dependency @edx/frontend-build to v12.8.40 2023-06-05 07:35:03 +00:00
renovate[bot]
5cf89420b3 chore(deps): update dependency @edx/frontend-platform to v4.5.0 2023-05-29 10:24:44 +00:00
renovate[bot]
176eb22711 chore(deps): update dependency @edx/frontend-build to v12.8.38 2023-05-29 08:07:48 +00:00
renovate[bot]
4380dd2a14 chore(deps): update dependency @edx/frontend-build to v12.8.27 2023-05-08 07:03:09 +00:00
renovate[bot]
a0080cd4ef chore(deps): update dependency semantic-release to v21.0.2 2023-05-01 12:16:03 +00:00
renovate[bot]
1f80f98acc chore(deps): update dependency @edx/frontend-build to v12.8.16 2023-05-01 08:21:01 +00:00
Bilal Qamar
d7ed4bfaf2 feat!: upgraded to node v18, added .nvmrc and updated workflows (#290)
BREAKING CHANGE: Ending support of @edx/frontend-platform v2 and v3 and now only support v4 with
2023-04-20 19:06:00 +05:00
Bilal Qamar
898e23d4bd fix: reverted node v18 upgrade in favor of major release (#289) 2023-04-20 16:53:03 +05:00
Brian Smith
7c07480f31 fix: release frontend-platform version update 2023-04-19 13:07:00 -04:00
renovate[bot]
f956c0ac93 chore(deps): update dependency semantic-release to v21 (#282)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-17 13:21:07 +05:00
renovate[bot]
d625329324 chore(deps): update dependency @edx/frontend-build to v12.8.10 (#287)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-17 12:13:43 +05:00
Omar Al-Ithawi
01ccaa6988 chore(deps): update frontend-platform version (#286)
Adds the intl-imports.js script for FC-0012 OEP-58.
2023-04-13 16:57:17 -04:00
Mashal Malik
c0dd43ce4a fix: update http-cache-semantics to 4.1.1 (#285) 2023-04-11 12:34:58 +05:00
Mashal Malik
56469df0b5 chore: Update peer dependency for react and react-dom (#284)
* refactor: remove react16 from peer dependency

* fix: update lock file and fix lint

* refactor: add 17 support of react in peerDep
2023-04-05 16:24:48 +05:00
renovate[bot]
0de4ad621e fix(deps): update font awesome to v6.4.0 2023-04-03 10:56:21 +00:00
Bilal Qamar
5d50e59672 feat: upgraded to node v18, added .nvmrc and updated workflows (#274)
* feat: upgraded to node v18, added .nvmrc and updated workflows

* refactor: upgraded frontend-build & frontend-platform
2023-03-29 16:44:40 +05:00
renovate[bot]
c715f0c4d4 chore(deps): update dependency @edx/paragon to v20.29.0 2023-03-27 06:46:26 +00:00
renovate[bot]
a62124ddf2 chore(deps): update dependency @edx/frontend-build to v12.7.0 2023-03-27 04:56:09 +00:00
renovate[bot]
8c222ddb0a chore(deps): update dependency @edx/frontend-build to v12.6.2 2023-03-24 09:02:39 +00:00
renovate[bot]
b4031ce345 chore(deps): update dependency @edx/paragon to v20.28.5 2023-03-20 11:42:17 +00:00
renovate[bot]
b787f5ecfe chore(deps): update dependency @edx/frontend-platform to v3.6.0 2023-03-20 08:47:07 +00:00
Yoiber
f87d47f42d chore(i18n): add more languages (#270)
* chore(i18n): add more languages

* chore(i18n): Pylint fixes
2023-03-14 20:25:36 +05:00
Mashal Malik
818ed5d179 chore: update transifex api from v2 to v3 (#272)
* chore: Update transifex api from v2 to v3

* refactor: remove duplicate line
2023-03-06 17:57:21 +05:00
Feanil Patel
07eb5892da Merge pull request #271 from openedx/repo_checks/ensure_workflows
Update standard workflow files.
2023-02-24 11:44:53 -05:00
Feanil Patel
3b8b18051f build: Updating a missing workflow file add-depr-ticket-to-depr-board.yml.
The .github/workflows/add-depr-ticket-to-depr-board.yml workflow is missing or needs an update to stay in
sync with the current standard for this workflow as defined in the
`.github` repo of the `openedx` GitHub org.
2023-02-23 14:02:05 -05:00
Feanil Patel
1c719d63cb build: Creating a missing workflow file add-remove-label-on-comment.yml.
The .github/workflows/add-remove-label-on-comment.yml workflow is missing or needs an update to stay in
sync with the current standard for this workflow as defined in the
`.github` repo of the `openedx` GitHub org.
2023-02-23 14:02:04 -05:00
Feanil Patel
dc7d2fadff build: Creating a missing workflow file self-assign-issue.yml.
The .github/workflows/self-assign-issue.yml workflow is missing or needs an update to stay in
sync with the current standard for this workflow as defined in the
`.github` repo of the `openedx` GitHub org.
2023-02-23 14:02:03 -05:00
renovate[bot]
b710800b2a fix(deps): update font awesome to v6.3.0 2023-02-13 13:41:53 +00:00
renovate[bot]
74ff35ae9a chore(deps): update dependency husky to v8 (#249)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-01 15:07:15 +05:00
renovate[bot]
e6835f9c56 fix(deps): update font awesome to v6 (#258)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Muhammad Abdullah Waheed <42172960+abdullahwaheed@users.noreply.github.com>
Co-authored-by: Bilal Qamar <59555732+BilalQamar95@users.noreply.github.com>
2023-02-01 15:00:03 +05:00
renovate[bot]
a0c19faa92 chore(deps): update dependency redux to v4.2.1 2023-01-30 12:55:34 +00:00
Bilal Qamar
fa37ebb828 chore: update dependency @edx/frontend-build to v12.4.19 (#266) 2023-01-26 11:40:08 +05:00
Muhammad Abdullah Waheed
a24972b64f Revert "chore(deps): update dependency semantic-release to v20 (#263)" (#264)
This reverts commit abb22a82ba.
2023-01-20 12:26:36 +05:00
renovate[bot]
abb22a82ba chore(deps): update dependency semantic-release to v20 (#263)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-20 12:20:04 +05:00
dependabot[bot]
1df0b94a8c build(deps): bump json5 from 1.0.1 to 1.0.2 (#261)
Bumps [json5](https://github.com/json5/json5) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/json5/json5/releases)
- [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md)
- [Commits](https://github.com/json5/json5/compare/v1.0.1...v1.0.2)

---
updated-dependencies:
- dependency-name: json5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-18 18:38:59 +05:00
renovate[bot]
d563e2f444 chore(deps): update dependency @edx/brand to v1.2.0 2023-01-09 10:14:23 +00:00
renovate[bot]
92a210f81d chore(deps): update dependency @edx/frontend-build to v12.4.15 2022-12-22 01:03:46 +00:00
Bilal Qamar
1b92a3c505 feat: updated paragon to v20 (#254)
* feat: updated paragon to v20
2022-12-08 17:18:26 +05:00
edX requirements bot
f88d47275b fix: -t flag added in pull translation command (#256) 2022-11-30 16:47:10 +05:00
renovate[bot]
26f3900602 chore(deps): update dependency @edx/frontend-build to v12.4.0 2022-11-28 08:28:51 +00:00
Muhammad Abdullah Waheed
a9db712240 Merge pull request #253 from openedx/bilalqamar95/dependabot-issues-resolution
refactor: bumped minimatch, recursive-readdir & loader-utils
2022-11-23 14:31:26 +05:00
Bilal Qamar
739cce6c50 refactor: bumped minimatch, recursive-readdir & loader-utils 2022-11-22 15:51:17 +05:00
renovate[bot]
3a19e219bb chore(deps): update actions/setup-node action to v3 (#209)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-11-15 19:06:09 +05:00
julianajlk
12511689e8 fix: Change frontend-platform peer dependency to v2 or v3 range 2022-11-14 20:19:15 +00:00
renovate[bot]
f084393cc9 chore(deps): update dependency semantic-release to v19.0.5 2022-11-14 07:58:10 +00:00
renovate[bot]
4035ff122c chore(deps): update dependency react-router-dom to v5.3.4 2022-11-14 07:52:15 +00:00
Leangseu Kim
159b5a842e feat: upgrade frontend platform to version 3 2022-11-10 11:08:04 +00:00
renovate[bot]
b06c8b5d01 chore(deps): update dependency react-redux to v7.2.9 2022-11-07 11:10:32 +00:00
renovate[bot]
c79da49208 chore(deps): update dependency enzyme-adapter-react-16 to v1.15.7 2022-11-07 08:43:12 +00:00
Leangseu Kim
82b3310a8f fix: downgrade frontend-platform 2022-11-01 16:09:19 -04:00
Abdullah Waheed
fcd641259b refactor: updated renovate config to auto update minor and patch versions of edx dependencies 2022-10-27 09:26:18 -03:00
Abdullah Waheed
509276df12 feat: added new translations in Makefile and updated all the translations 2022-10-27 09:25:07 -03:00
Bilal Qamar
4527baef5a refactor: upgraded frontend-build to v12 & resolved eslint issues 2022-10-26 10:35:10 -03:00
Muhammad Abdullah Waheed
8183143ae5 Merge pull request #225 from openedx/dependabot/npm_and_yarn/terser-4.8.1
build(deps): bump terser from 4.8.0 to 4.8.1
2022-10-25 16:07:08 +05:00
dependabot[bot]
91311f25da build(deps-dev): bump semantic-release from 17.4.7 to 19.0.3 (#217)
Bumps [semantic-release](https://github.com/semantic-release/semantic-release) from 17.4.7 to 19.0.3.
- [Release notes](https://github.com/semantic-release/semantic-release/releases)
- [Commits](https://github.com/semantic-release/semantic-release/compare/v17.4.7...v19.0.3)

---
updated-dependencies:
- dependency-name: semantic-release
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-25 16:06:26 +05:00
renovate[bot]
ccef5de855 chore(deps): update actions/checkout action to v3 (#205)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-10-25 15:39:10 +05:00
Muhammad Abdullah Waheed
01fa97055f Merge pull request #199 from openedx/dependabot/npm_and_yarn/async-2.6.4
build(deps): bump async from 2.6.3 to 2.6.4
2022-10-25 15:38:22 +05:00
Muhammad Abdullah Waheed
3cff0970a3 Merge pull request #191 from openedx/dependabot/npm_and_yarn/node-forge-1.3.0
build(deps): bump node-forge from 1.2.1 to 1.3.0
2022-10-25 15:37:26 +05:00
renovate[bot]
f2c879999d chore(deps): update dependency marked to 4.0.10 [security] (#186)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-10-25 15:36:30 +05:00
Ben Warzeski
3f18cf7c9d Merge pull request #236 from muselesscreator/platform_3.0
fix: frontend platform peer dependency to 3.x
2022-09-27 10:01:59 -04:00
Ben Warzeski
30796204b8 fix: frontend platform peer dependency to 3.x 2022-09-27 09:27:07 -04:00
dependabot[bot]
d206ecf3ad build(deps): bump async from 2.6.3 to 2.6.4
Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4.
- [Release notes](https://github.com/caolan/async/releases)
- [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md)
- [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4)

---
updated-dependencies:
- dependency-name: async
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-26 18:32:49 +00:00
Ben Warzeski
f3094e1725 Merge pull request #234 from muselesscreator/platform_3.0
feat: update frontend-platform to v3.0.1
2022-09-26 14:31:09 -04:00
Ben Warzeski
5bbd266834 feat: update frontend-platform to v3.0.1 2022-09-26 14:20:26 -04:00
Sarina Canelake
37eed0578f Merge pull request #233 from openedx/tcril/fix-gh-org-url
Fix github url strings (org edx -> openedx)
2022-09-14 09:44:26 -04:00
Sarina Canelake
acbe489a7c fix: update path to .github workflows to read from openedx org 2022-09-10 18:03:48 -04:00
Sarina Canelake
2cfbb40265 fix: fix github url strings (org edx -> openedx) 2022-09-07 08:52:02 -04:00
Muhammad Abdullah Waheed
3e1264b710 Merge pull request #229 from openedx/abdullahwaheed/run-build-in-ci
Npm run build script in Github CI
2022-08-16 11:17:52 +05:00
Abdullah Waheed
bf60da6554 feat: added build script in github CI 2022-08-12 19:12:07 +05:00
renovate[bot]
cf879e53be fix(deps): update dependency @fortawesome/react-fontawesome to v0.2.0 2022-07-25 12:09:39 +00:00
dependabot[bot]
e0a634900d build(deps): bump terser from 4.8.0 to 4.8.1
Bumps [terser](https://github.com/terser/terser) from 4.8.0 to 4.8.1.
- [Release notes](https://github.com/terser/terser/releases)
- [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/terser/terser/commits)

---
updated-dependencies:
- dependency-name: terser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-20 21:53:15 +00:00
renovate[bot]
15ae025990 chore(deps): update dependency @edx/frontend-platform to v2.5.0 2022-07-18 10:39:03 +00:00
renovate[bot]
efd85745fd chore(deps): update dependency @edx/paragon to v19.25.3 2022-06-20 13:07:57 +00:00
Maman Khan
fc5df4af36 fix: removed depreciated package codecov (#220) 2022-06-20 08:06:00 +05:00
Adolfo R. Brandes
f657c719ec Merge pull request #219 from muselesscreator/platform_version_bump
feat: bump frontend-platform to 2.3.0
2022-06-15 22:22:32 +01:00
Ben Warzeski
6c346c18f9 feat: bump frontend-platform to 2.3.0 2022-06-14 15:56:58 -04:00
Renovate Bot
2b9c5affbc chore(deps): update dependency @edx/paragon to v19.25.1 2022-06-06 11:56:43 +00:00
Renovate Bot
4a13120d24 chore(deps): update dependency @edx/paragon to v19.25.0 2022-05-30 12:25:15 +00:00
Renovate Bot
8e0587f871 chore(deps): update dependency react-router-dom to v5.3.3 2022-05-23 12:26:35 +00:00
Renovate Bot
7cc2f74562 chore(deps): pin dependency semantic-release to v 2022-05-23 12:19:25 +00:00
Renovate Bot
3b13fc29b4 chore(deps): update dependency @edx/frontend-platform to v1.15.6 2022-05-16 20:54:51 +00:00
edX requirements bot
3f12c52221 chore!: Dropped support for Node 12 (#207)
BREAKING CHANGE: Dropped Node12 support
2022-05-16 20:56:26 +05:00
Renovate Bot
826d071566 chore(deps): update dependency @edx/paragon to v19.22.1 2022-05-16 11:37:34 +00:00
edX requirements bot
b66ae651b6 feat: Add package-lock file version check (#206) 2022-05-12 12:22:31 +05:00
Renovate Bot
d23a4e2443 chore(deps): update dependency redux to v4.2.0 2022-05-09 10:46:31 +00:00
Renovate Bot
898b90eb07 chore(deps): update dependency @edx/paragon to v19.20.0 2022-05-02 11:29:16 +00:00
Renovate Bot
dbb806d0a3 chore(deps): update dependency @edx/frontend-build to v9.2.2 2022-05-02 11:21:30 +00:00
Renovate Bot
702bce8587 chore(deps): update dependency prop-types to v15.8.1 2022-04-25 11:43:11 +00:00
Renovate Bot
0bd6c9d452 chore(deps): update dependency @edx/paragon to v19.19.0 2022-04-25 11:35:17 +00:00
Renovate Bot
3d4d356665 chore(deps): update dependency @edx/paragon to v19.18.0 2022-04-18 14:59:37 +00:00
Renovate Bot
e656865502 chore(deps): update dependency react-router-dom to v5.3.1 2022-04-18 14:51:49 +00:00
Renovate Bot
2b4283ac5f chore(deps): update dependency @edx/paragon to v19.15.0 2022-04-11 12:59:17 +00:00
Renovate Bot
38d9a2076b fix(deps): update dependency @fortawesome/react-fontawesome to v0.1.18 2022-04-11 12:51:38 +00:00
Usama Sadiq
a31d1a5387 Merge pull request #190 from openedx/jenkins/transifex-client-migration-dcc3617
fix: transifex migration to new client
2022-04-06 12:43:06 +05:00
UsamaSadiq
a374cee7dd build: update transifex pull translations command 2022-04-05 15:35:38 +05:00
Renovate Bot
3f50a4d333 chore(deps): update dependency react-redux to v7.2.8 2022-04-04 11:11:31 +00:00
Renovate Bot
45f0f20f0f chore(deps): update dependency @edx/frontend-build to v9.1.4 2022-04-04 11:03:03 +00:00
dependabot[bot]
fb06f7d9f9 build(deps): bump node-forge from 1.2.1 to 1.3.0
Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.2.1 to 1.3.0.
- [Release notes](https://github.com/digitalbazaar/forge/releases)
- [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md)
- [Commits](https://github.com/digitalbazaar/forge/compare/v1.2.1...v1.3.0)

---
updated-dependencies:
- dependency-name: node-forge
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-26 06:39:29 +00:00
Adolfo R. Brandes
29a5db5e1a Merge pull request #178 from ayrtonlr/master
Change the logo to link to the LMS
2022-03-24 06:46:46 -03:00
Ayrton Lima
7982251640 fix: change logo anchor tag to link to the LMS 2022-03-23 20:21:53 -03:00
edX requirements bot
9824aecd16 fix: transifex migration to new client 2022-03-17 08:47:05 -04:00
Renovate Bot
dcc361747e chore(deps): update dependency @edx/frontend-build to v9.1.2 2022-03-14 10:12:05 +00:00
Jawayria
863ecb41bd Merge pull request #187 from openedx/jawayria/upgrade-deps
fix: Upgraded dependencies for Node 16 support
2022-03-04 14:47:23 +05:00
Jawayria
f6d02d177d fix: Upgraded dependencies for Node 16 support 2022-03-04 13:53:46 +05:00
David Joy
7e196f48cf build: We no longer want this CODEOWNERS file.
The community-engineering team no longer exists.
2022-02-28 09:53:13 -05:00
Jawayria
46e4c78af8 Merge pull request #185 from openedx/jawayria/fix-release-ci
fix: Added semantic-release v17 in package.json to fix release CI
2022-02-28 18:44:58 +05:00
Jawayria
affbcbeb19 fix: Added semantic-release v17 in package.json to fix release CI 2022-02-28 17:31:34 +05:00
Jawayria
8c10919eb9 Merge pull request #177 from openedx/jenkins/node-16-2b56d27
feat: Added support for node v16
2022-02-25 17:25:02 +05:00
edX requirements bot
314781ac0b feat: Added support for Node v16 2022-02-25 17:22:36 +05:00
Sarina Canelake
b75ab299bd Merge DEPR automation workflow
Add DEPR workflow automation
2022-02-24 15:21:45 -05:00
Sarina Canelake
1fb4475b9a build: add DEPR workflow automation 2022-02-23 14:36:53 -05:00
Renovate Bot
2b56d270a2 chore(deps): update dependency @edx/frontend-platform to v1.14.1 2021-11-29 09:47:56 +00:00
Renovate Bot
395c9240a0 chore(deps): update dependency @edx/frontend-platform to v1.14.0 2021-11-08 09:03:26 +00:00
Renovate Bot
60ceedced9 chore(deps): update dependency redux to v4.1.2 2021-11-01 09:59:30 +00:00
Renovate Bot
032e4dd73f chore(deps): update dependency react-redux to v7.2.6 2021-11-01 09:48:29 +00:00
Renovate Bot
212bc015ad fix(deps): update dependency @fortawesome/react-fontawesome to v0.1.16 2021-10-25 09:42:17 +00:00
Renovate Bot
d72eaa6fab chore(deps): update dependency husky to v7.0.4 2021-10-25 09:30:59 +00:00
Ned Batchelder
1f5b74de21 build: no need for local commitlint.config.js 2021-10-22 14:23:04 -04:00
Ned Batchelder
07728e1498 build: use the organization commitlint check 2021-10-07 13:48:27 -04:00
Renovate Bot
5d44307136 chore(deps): update commitlint monorepo to v13.2.0 2021-10-04 08:21:39 +00:00
Renovate Bot
1769069cfe chore(deps): update dependency @edx/frontend-platform to v1.12.7 2021-09-20 08:33:36 +00:00
Renovate Bot
2fb0cac399 chore(deps): update dependency @edx/frontend-platform to v1.12.6 2021-09-13 11:48:51 +00:00
Renovate Bot
807dc66714 chore(deps): update dependency react-router-dom to v5.3.0 2021-09-06 08:38:27 +00:00
Renovate Bot
ea837695e9 chore(deps): update dependency react-redux to v7.2.5 2021-09-06 08:26:11 +00:00
stvn
e4801b8b81 merge(#135): renovate/codecov-codecov-action-2.x
commits
=======
- chore(deps): update codecov/codecov-action action to v2
2021-09-01 15:35:58 -07:00
Renovate Bot
89337c4819 chore(deps): update codecov/codecov-action action to v2 2021-08-30 08:41:29 +00:00
Renovate Bot
c75f6c079e chore(deps): update dependency husky to v7.0.2 2021-08-30 08:41:09 +00:00
Renovate Bot
77c251467c chore(deps): update dependency @edx/frontend-platform to v1.12.4 2021-08-23 09:20:49 +00:00
Renovate Bot
caba23d51b chore(deps): update dependency @edx/frontend-platform to v1.12.3 2021-08-16 06:55:48 +00:00
stvn
efbae26c56 merge(#137): renovate/major-commitlint-monorepo
commits
=======
- chore(deps): update commitlint monorepo to v13
2021-08-10 10:34:25 -07:00
Renovate Bot
efeacb8b73 chore(deps): update commitlint monorepo to v13 2021-08-10 06:39:06 +00:00
stvn
a0865c9c56 merge(#131): renovate/husky-7.x
commits
=======
- chore(deps): update dependency husky to v7
2021-08-09 23:34:47 -07:00
Renovate Bot
7cfd6932d5 chore(deps): update dependency husky to v7 2021-08-09 08:59:46 +00:00
Renovate Bot
e2f92992b6 fix(deps): update font awesome 2021-08-09 08:49:15 +00:00
Renovate Bot
f37e6c164e chore(deps): update dependency redux to v4.1.1 2021-08-09 08:35:40 +00:00
Renovate Bot
fef30fb8b5 chore(deps): update dependency @edx/frontend-platform to v1.11.3 2021-08-02 06:43:59 +00:00
Renovate Bot
bcac04d0cc chore(deps): update dependency codecov to v3.8.3 2021-07-26 07:06:11 +00:00
Renovate Bot
15ff0203ab chore(deps): update dependency @edx/frontend-platform to v1.11.1 2021-07-12 08:08:45 +00:00
stvn
940294d2a0 merge(#93): renovate/major-commitlint-monorepo
commits
=======
- chore(deps): update commitlint monorepo to v12
2021-06-14 15:35:19 -07:00
Renovate Bot
acd4a843a4 chore(deps): update commitlint monorepo to v12 2021-06-14 20:17:17 +00:00
Renovate Bot
d8ee5425bf chore(deps): update dependency @edx/paragon to v12.8.0 2021-06-14 20:13:11 +00:00
Renovate Bot
1d9e8d3c47 chore(deps): update dependency @edx/frontend-platform to v1.11.0 2021-06-14 20:04:09 +00:00
stvn
4d370f8a75 merge(#117): renovate/husky-6.x
commits
=======
- chore(deps): update dependency husky to v6
2021-06-11 23:22:51 -07:00
Renovate Bot
2a2be8eddb chore(deps): update dependency husky to v6 2021-06-11 20:56:20 +00:00
Renovate Bot
e7624adbfb chore(deps): update dependency @edx/frontend-build to v5.6.14 2021-06-11 20:45:14 +00:00
Renovate Bot
5d0a418e85 chore(deps): update dependency redux to v4.1.0 2021-06-09 07:17:17 +00:00
stvn
f5b18cdd54 merge(#111): renovate/actions-setup-node-2.x
commits
=======
- chore(deps): update actions/setup-node action to v2
2021-06-08 10:26:22 -07:00
Renovate Bot
d5d290bcbe chore(deps): update actions/setup-node action to v2 2021-06-08 08:45:20 +00:00
Renovate Bot
49c02c157b chore(deps): update react monorepo to v16.14.0 2021-06-08 08:35:06 +00:00
Renovate Bot
94b4aa7402 chore(deps): update dependency react-redux to v7.2.4 2021-06-08 08:16:27 +00:00
stvn
a9fe23287f merge(#19): build/renovate
commits
=======
- build(renovate): fix json syntax
2021-06-07 22:38:00 -07:00
stvn
30874b4972 build(renovate): fix json syntax 2021-06-07 22:37:21 -07:00
stvn
14d53ef514 merge(#125): build/renovate-stricter
commits
=======
- build(renovate): be more selective about automerging devDependencies
2021-06-04 13:41:14 -07:00
stvn
5c9270d88a build(renovate): be more selective about automerging devDependencies 2021-06-04 13:22:06 -07:00
Renovate Bot
f70ca27b34 chore(deps): update dependency react-router-dom to v5.2.0 2021-06-04 01:53:30 +00:00
Renovate Bot
d247e88541 fix(deps): update font awesome 2021-06-04 01:32:35 +00:00
Renovate Bot
ea257afcca chore(deps): update dependency husky to v3.1.0 2021-06-03 22:39:52 +00:00
Renovate Bot
24603cf98f chore(deps): update dependency enzyme-adapter-react-16 to v1.15.6 2021-06-03 22:14:10 +00:00
Renovate Bot
4249bbc6df chore(deps): update dependency enzyme to v3.11.0 2021-06-03 21:47:26 +00:00
Renovate Bot
611beb8294 chore(deps): pin dependencies 2021-06-03 21:20:20 +00:00
Renovate Bot
87803604b1 chore(deps): update dependency codecov to v3.8.2 2021-06-03 20:52:09 +00:00
Renovate Bot
99344d93a4 chore(deps): update commitlint monorepo 2021-06-03 20:21:45 +00:00
stvn
2a718743ea merge(#124): build/renovate
commits
=======
- build(renovate): be more liberal about what automerges
2021-06-03 11:15:55 -07:00
stvn
4fe8909ad5 build(renovate): be more liberal about what automerges
based on https://github.com/edx/frontend-app-account .
2021-06-03 10:48:02 -07:00
stvn
a0dc37dfb5 merge: stvn/own/code 2021-05-26 13:42:27 -07:00
stvn
e4917030fa build: add CODEOWNERS; edx/community-engineering
Background
==========
As part of our Squad-based ownership, we should stay on top of what
happens in these repositories. However, due to the number of
repositories (and subsequently pull requests) across the edX ecosystem,
it is challenging to stay on top of notifications, separating the
'signal' from the 'noise'. Email filters can go a long way to taming
Inbox notifications, but this is manual and requires maintenance as
Squad ownership changes. It also fails to account for Github-specific behavior.

Proposal
========
By leveraging Github support for `CODEOWNERS` files [1],
we can ensure that our team is at least CCed explicitly, here,
in the form a requested review. This request is just that, a request,
not a requirement; we are not enacting any new merge requirements
at this time.

- [1] https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners
2021-05-26 12:15:49 -07:00
David Joy
c756f42c28 docs: Updating README with repository details. (#122)
* docs: Specify component usage requirements in the README.

This includes both the component's dependency on @edx/frontend-platform, as well as its required environment variables.

* docs: fix verbatim formatting

* docs: improving footer README

Including headings and formatting consistent with frontend-component-header.  Hopefully others soon.
2021-05-14 12:57:09 -04:00
Renovate Bot
1b6a5eda0b chore(deps): update dependency @edx/frontend-platform to v1.8.4 2021-02-07 11:57:37 +00:00
David Joy
cbaf4bbb9e fix: remove unnecessary paragon peer dependency (#114)
The actual component code doesn’t use paragon.  Only the example app does, meaning this isn’t really a peer dependency.
2021-02-04 14:25:31 -05:00
Renovate Bot
c990cbbf5e fix(deps): update font awesome 2021-01-31 09:56:38 +00:00
Renovate Bot
b41af87b8e chore(deps): update dependency @edx/frontend-platform to v1.8.1 2021-01-23 11:58:46 +00:00
Carla Duarte
a7d59a874c Merge pull request #108 from edx/ciduarte/AA-465
fix: remove unnecessary aria-label
2021-01-07 09:33:22 -05:00
Carla Duarte
d66d3b7b62 fix: remove unnecessary aria-label 2021-01-06 17:23:50 -05:00
Jawayria
7095e79471 Merge pull request #103 from Jawayria/update-badge
Updated the build status badge to point to travis-ci.com
2020-12-17 13:47:00 +05:00
Renovate Bot
4a9b3f2bfb fix(deps): update font awesome 2020-12-11 09:58:08 +00:00
Jeff Chaves
e4d23d366b feat: upgrading deps, retheme with from @edx/brand, pull logo from config settings (#104)
* feat: upgrading deps, use logo from @edx/brand

* feat: upgrading peer deps

* feat: pr feedback

* update snapshots and example app

* pull config from AppContext

Co-authored-by: Adam Stankiewicz <agstanki@gmail.com>
2020-11-30 14:00:26 -05:00
Adam Stankiewicz
2e75cc95cb ci: migrate to use GH actions (#106)
* ci: migrate to use GH actions

* ci: change gh action names
2020-11-30 13:56:29 -05:00
Jawayria
f64faf9f14 Updated the build status badge to point to travis-ci.com 2020-11-20 15:01:06 +05:00
Renovate Bot
0be3098191 chore(deps): update dependency codecov to v3.7.2 2020-07-22 03:36:15 +00:00
renovate[bot]
799cdb3b3c chore(deps): update dependency codecov to v3.7.1 [security] (#95)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2020-07-21 09:26:50 -04:00
Renovate Bot
370ae52c04 fix(deps): update dependency @fortawesome/fontawesome-svg-core to v1.2.30 2020-07-15 18:20:09 +00:00
Renovate Bot
5037a5610b fix(deps): update font awesome 2020-07-04 09:56:32 +00:00
Renovate Bot
0a91f8242f fix(deps): update dependency @fortawesome/fontawesome-svg-core to v1.2.28 2020-03-23 16:19:06 +00:00
Renovate Bot
457bd843cf fix(deps): update dependency @fortawesome/react-fontawesome to v0.1.9 2020-03-05 18:10:56 +00:00
Renovate Bot
777c697c41 fix(deps): update dependency @fortawesome/fontawesome-svg-core to v1.2.27 2020-02-07 16:09:34 +00:00
Renovate Bot
b3b32613c9 chore(deps): update dependency codecov to v3.6.5 2020-02-07 15:11:57 +00:00
Renovate Bot
a6f70e895a chore(deps): update dependency codecov to v3.6.4 2020-02-01 03:12:36 +00:00
Renovate Bot
1112b426f0 chore(deps): update dependency codecov to v3.6.3 2020-01-31 14:13:51 +00:00
Renovate Bot
17278cc355 chore(deps): update dependency codecov to v3.6.2 2020-01-23 20:22:47 +00:00
Renovate Bot
65c25bfc95 fix(deps): update dependency @fortawesome/fontawesome-svg-core to v1.2.26 2019-12-11 00:12:05 +00:00
Renovate Bot
75e8962563 fix(deps): update dependency @fortawesome/react-fontawesome to v0.1.8 2019-12-06 17:14:43 +00:00
Renovate Bot
65aba84491 fix(deps): update font awesome 2019-12-04 23:19:08 +00:00
Renovate Bot
093dfa6ac2 chore(deps): update react monorepo to v16.10.2 2019-12-04 22:15:57 +00:00
Renovate Bot
4637834750 chore(deps): update dependency husky to v3.0.9 2019-12-04 21:04:01 +00:00
Renovate Bot
a021e72359 chore(deps): update dependency @edx/paragon to v7.1.5 2019-12-04 20:39:24 +00:00
Renovate Bot
925ddb7adf chore(deps): update dependency @edx/frontend-platform to v1.1.6 2019-12-04 20:21:15 +00:00
David Joy
9ebcd15623 Update renovate.json 2019-12-04 14:25:58 -05:00
Adam Butterworth
3a2e553feb fix: upgrade frontend-build for i18n extract fix (#67) 2019-12-03 16:00:43 -05:00
Adam Butterworth
eb6c253e35 fix: upgrade frontend-build to fix translation job (#65) 2019-12-03 14:13:11 -05:00
David Joy
d2315c2c21 build: dev tweaks (#64)
* build: dev tweaks

need an eslintrc file and to gitignore .vscode directories

* Update .eslintrc.js
2019-12-03 10:46:32 -05:00
Adam Butterworth
f33a972933 fix: upgrade frontend-platform (#63) 2019-12-03 10:33:28 -05:00
Adam Butterworth
d540aaa390 feat: upgrade to frontend-platform (#60)
BREAKING CHANGE: This package now relies upon frontend-platform instead of individual runway packages.
2019-11-21 17:18:26 -05:00
Adam Butterworth
c64496dd08 Update README.rst 2019-10-08 12:54:29 -04:00
edX Transifex Bot
e94cf3ac2d fix(i18n): update translations 2019-10-06 16:33:20 -04:00
David Joy
d4259ef1f6 feat: handleAllTrackEvents is no longer used (#48)
* feat: use frontend-analytics directly

BREAKING CHANGE: handleAllTrackEvents is no longer part of the Footer props API.  The footer uses frontend-analytics’s sendTrackEvent directly.

Also updating other dependencies to keep them up to date.  This part should probably be a separate PR, technically.

* fix: remove unused dependency of frontend-logging

* fix: a little PR cleanup

* fix: putting frontend logging back

It’s needed by frontend-i18n and fails if it’s not there for tests.

* fix: pinning npm at 6
2019-10-02 14:59:12 -04:00
renovate[bot]
b4f35d37c8 chore(deps): add renovate.json (#47) 2019-10-02 12:34:44 -04:00
Adam Butterworth
83bad3d47b feat: repurpose as open edx footer (#46)
* feat: simplify prop api and bake in many values

* feat: refactor build and dev server

BREAKING CHANGE: The footer is now  transpiled from es6 preserving modules. To use this package in a project it must now be transpiled by the requiring project via webpack or other configuration

* feat: make this the open edx footer

BREAKING CHANGE: This footer now serves as the Open edX footer. For the edX footer see edx/frontend-component-footer-edx on github
2019-09-30 14:33:06 -04:00
AlasdairSwan
31e255ebe9 Merge pull request #44 from edx/alasdair/remove-paragon
perf(paragon): remove paragon to reduce bundle size
2019-06-21 11:14:29 -04:00
AlasdairSwan
349f83f686 perf(paragon): remove paragon to reduce bundle size 2019-06-21 11:11:01 -04:00
David Joy
e0c205ce14 fix: non deprecated use of hyperlink (#43) 2019-06-21 09:56:05 -04:00
albemarle
81398c8cfd Merge pull request #42 from edx/albemarle/different-diff
fix(i18n): make detect_changed_source_translations work for both push and pull jobs
2019-06-11 13:51:08 -04:00
albemarle
3fcd76b455 fix(i18n): make detect_changed_source_translations work for both push and pull jobs 2019-06-11 13:34:27 -04:00
edX Transifex Bot
a8f57aa553 fix(i18n): update translations 2019-06-09 16:32:55 -04:00
David Joy
f32b0c8dcf Merge pull request #40 from edx/djoy/upgrade_i18n
fix: upgrade frontend-i18n library
2019-06-07 11:12:41 -04:00
David Joy
fb1f5c2d50 fix: delete old i18n concat file 2019-06-07 10:53:50 -04:00
David Joy
1a51d992cd Update .gitignore 2019-06-07 10:07:30 -04:00
David Joy
e9c28163d9 fix: upgrade frontend-i18n library 2019-06-07 08:58:38 -04:00
AlasdairSwan
6db2d70e97 Merge pull request #37 from edx/alasdair/update-link-sections-to-accept-arrays
fix(linkprops): update link props
2019-06-04 09:03:27 -04:00
AlasdairSwan
3ab4adf10b fix(linkprops): update link props
BREAKING CHANGE move to link arrays and remove strings from component (and thus the need for i18n)
2019-06-03 15:57:30 -04:00
edX Transifex Bot
a482325eac fix(i18n): update translations 2019-06-02 17:33:12 -04:00
Douglas Hall
d919d1a577 Merge pull request #38 from edx/douglashall/finish_i18n_refactoring
fix: modify babelrc for i18n
2019-05-31 14:17:28 -04:00
Douglas Hall
4b3a91138d fix: modify babelrc for i18n 2019-05-31 14:11:48 -04:00
David Joy
7680ad3393 Merge pull request #36 from edx/djoy/is-es5
fix: adding es check
2019-05-28 13:33:09 -04:00
David Joy
061b41bee8 fix: adding es check 2019-05-28 09:42:04 -04:00
62 changed files with 29351 additions and 31701 deletions

View File

@@ -1,27 +0,0 @@
{
"presets": [
["env", {
"targets": {
"browsers": ["last 2 versions", "ie 11"]
}
}],
"babel-preset-react"
],
"plugins": [
"transform-object-rest-spread"
],
"env": {
"test": {
"plugins": [
"rewire"
]
},
"i18n": {
"plugins": [
["react-intl", {
"messagesDir": "./temp"
}]
]
}
}
}

24
.env.development Normal file
View File

@@ -0,0 +1,24 @@
ACCESS_TOKEN_COOKIE_NAME=edx-jwt-cookie-header-payload
BASE_URL=localhost:8080
CREDENTIALS_BASE_URL=http://localhost:18150
CSRF_TOKEN_API_PATH=/csrf/api/v1/token
ECOMMERCE_BASE_URL=http://localhost:18130
LANGUAGE_PREFERENCE_COOKIE_NAME=openedx-language-preference
LMS_BASE_URL=http://localhost:18000
LOGIN_URL=http://localhost:18000/login
LOGOUT_URL=http://localhost:18000/login
MARKETING_SITE_BASE_URL=http://localhost:18000
TERMS_OF_SERVICE_URL=null
PRIVACY_POLICY_URL=null
SUPPORT_EMAIL=null
STUDIO_BASE_URL=http://localhost:18010
ENABLE_ACCESSIBILITY_PAGE=false
ORDER_HISTORY_URL=localhost:1996/orders
REFRESH_ACCESS_TOKEN_ENDPOINT=http://localhost:18000/login_refresh
SEGMENT_KEY=null
SITE_NAME=Open edX
USER_INFO_COOKIE_NAME=edx-user-info
LOGO_URL=https://edx-cdn.org/v3/default/logo.svg
LOGO_TRADEMARK_URL=https://edx-cdn.org/v3/default/logo-trademark.svg
LOGO_WHITE_URL=https://edx-cdn.org/v3/default/logo-white.svg
FAVICON_URL=https://edx-cdn.org/v3/default/favicon.ico

View File

@@ -1,3 +1,4 @@
coverage
dist
example
node_modules

4
.eslintrc.js Normal file
View File

@@ -0,0 +1,4 @@
// eslint-disable-next-line import/no-extraneous-dependencies
const { createConfig } = require('@openedx/frontend-build');
module.exports = createConfig('eslint');

View File

@@ -1,19 +0,0 @@
{
"extends": "eslint-config-edx",
"rules": {
"import/no-extraneous-dependencies": [
"error",
{
"devDependencies": [
"webpack.config.js",
"src/tests/setupTest.js",
"**/*.test.jsx",
"**/*.test.js"
]
}
]
},
"env": {
"jest": true
}
}

View File

@@ -0,0 +1,19 @@
# Run the workflow that adds new tickets that are either:
# - labelled "DEPR"
# - title starts with "[DEPR]"
# - body starts with "Proposal Date" (this is the first template field)
# to the org-wide DEPR project board
name: Add newly created DEPR issues to the DEPR project board
on:
issues:
types: [opened]
jobs:
routeissue:
uses: openedx/.github/.github/workflows/add-depr-ticket-to-depr-board.yml@master
secrets:
GITHUB_APP_ID: ${{ secrets.GRAPHQL_AUTH_APP_ID }}
GITHUB_APP_PRIVATE_KEY: ${{ secrets.GRAPHQL_AUTH_APP_PEM }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_ISSUE_BOT_TOKEN }}

View File

@@ -0,0 +1,20 @@
# This workflow runs when a comment is made on the ticket
# If the comment starts with "label: " it tries to apply
# the label indicated in rest of comment.
# If the comment starts with "remove label: ", it tries
# to remove the indicated label.
# Note: Labels are allowed to have spaces and this script does
# not parse spaces (as often a space is legitimate), so the command
# "label: really long lots of words label" will apply the
# label "really long lots of words label"
name: Allows for the adding and removing of labels via comment
on:
issue_comment:
types: [created]
jobs:
add_remove_labels:
uses: openedx/.github/.github/workflows/add-remove-label-on-comment.yml@master

37
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,37 @@
name: Default CI
on:
push:
branches:
- master
pull_request:
branches:
- '**'
jobs:
tests:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Nodejs
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
- name: Install dependencies
run: npm ci
- name: Validate package-lock.json changes
run: make validate-no-uncommitted-package-lock-changes
- name: Lint
run: npm run lint
- name: Test
run: npm run test
- name: Build
run: npm run build
- name: i18n_extract
run: npm run i18n_extract
- name: Coverage
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true

10
.github/workflows/commitlint.yml vendored Normal file
View File

@@ -0,0 +1,10 @@
# Run commitlint on the commit messages in a pull request.
name: Lint Commit Messages
on:
- pull_request
jobs:
commitlint:
uses: openedx/.github/.github/workflows/commitlint.yml@master

View File

@@ -0,0 +1,13 @@
#check package-lock file version
name: Lockfile Version check
on:
push:
branches:
- master
pull_request:
jobs:
version-check:
uses: openedx/.github/.github/workflows/lockfileversion-check-v3.yml@master

43
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,43 @@
name: Release CI
on:
push:
branches:
- master
- alpha
jobs:
release:
name: Release
runs-on: ubuntu-latest
steps:
- name: Checkout
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 }}
- name: Install dependencies
run: npm ci
- name: Validate package-lock.json changes
run: make validate-no-uncommitted-package-lock-changes
- name: Lint
run: npm run lint
- name: Test
run: npm run test
- name: i18n_extract
run: npm run i18n_extract
- name: Coverage
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: false
- name: Build
run: npm run build
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.SEMANTIC_RELEASE_GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.SEMANTIC_RELEASE_NPM_TOKEN }}
run: npx semantic-release

12
.github/workflows/self-assign-issue.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# This workflow runs when a comment is made on the ticket
# If the comment starts with "assign me" it assigns the author to the
# ticket (case insensitive)
name: Assign comment author to ticket if they say "assign me"
on:
issue_comment:
types: [created]
jobs:
self_assign_by_comment:
uses: openedx/.github/.github/workflows/self-assign-issue.yml@master

5
.gitignore vendored
View File

@@ -1,3 +1,4 @@
.DS_Store
coverage
dist
node_modules
@@ -6,3 +7,7 @@ temp
.idea/
src/i18n/transifex_input.json
temp/babel-plugin-react-intl
/.vscode
module.config.js
src/i18n/messages

1
.nvmrc Normal file
View File

@@ -0,0 +1 @@
20

View File

@@ -1,5 +1,8 @@
{
"branch": "master",
"branches": [
"master",
{name: "alpha", prerelease: true}
],
"tagFormat": "v${version}",
"verifyConditions": [
"@semantic-release/npm",

View File

@@ -1,20 +0,0 @@
language: node_js
node_js:
- 8
cache:
directories:
- "~/.npm"
install:
- npm install
script:
- npm run lint
- npm run i18n_extract
- npm run test
- npm run build
after_success:
- npm run travis-deploy-once "npm run semantic-release"
- npm run coveralls
env:
global:
- secure: dxQadqP6tsoJzHcqs/Hs5AjE42z45q8ZeWKP5HcjbXoJURB4gc1uIxLky0FA6ZpulaTgRVTLcWQbx9yOODc9PQuFnFEDWlCg5EP8tONzeu7BVlJvV5eakgGUhl9w2pekBKsTGhK5dDg2y2D8bGfIL55UX81uiWeytp8s/y8QNs/FNXx9ScJnfhnC+2RfW52fB7iW12F1VYdQfVe43o5PsHze+YhB3FU/ztGe3iMaQiq9QplZWpvqQMpI7pTjyUAX8ITiiPS6UvLFObgpXpfjZdgd+yveFoi3z8o8F0NkmzBphFeSYFjFZE0qJ8bnGNIZldanMeuUgHmDeTwVmKQFhH2LqqnfcdGgW6UsKcHkSN1G51zzad2dEwAHrgxj1NkMp3JfEed2C7Kvntl6KRjVDmYZqHJvt+e+AHNbpjzblOW8tYMIrdz0TeJdk4D9pP3B3tRCtP6fvQ3GLzAMnaCrSsN6hZ9YVxWku8sg8WNEDHl14sZsdgk312MlHIdiUw97FHGrqx/NCix4IkUlCBDbKYbKzbZp20FfzZcwNRNH74+k6xpOnMGSfq8gByEhm9y02MBL76HiAI2VGct2La1ExaUfoikYGoNaZpFcZyOZKo6PYTYHpiUJmqrEnDyVQEOOXUaVsxWXwnYq/mU4nOEPKCRbNpPoksZdNxf6jlmMi8s=
- secure: lrlV0WQaXTRJ2lqDkFZ+1RkRb7YM/STOViOHUNboXb5+1ReVwY0wklFDVk/Qigp3jkbqWfzkBmEjSDVGDLD61QjpGY4BsxZ/Jn3+KUdo0n82Ym6cI/je1fH2gqDLi4U8bylmnkI5oEjV/1txDxkj4hF5w/Leo/oGue3xQohpi//ihhm/PxzExj+QiDqyZPZ5RQZeqLfPEU3Wff04vLE5bRmy1nDTZrgm5Wb1n5ItGsyrUyrCGuAM9kIEun65Snb8hxCuU9pSm1w/xF73iOGLiiC8KZhLu6SxSKoC872ai1GpUXNIqA8kpVeH0Erf5opMtqJT3jTTan/VOFQEoOeAKhR0ga+5rfK2jkhhN77B98dGVndNCfBpDlgQxVv42H6riFk3payZT262QiUqDejiBDtSPTokTGxf7xFtQkQQahhxVXzC2HRKEkDTXNSP8cvk2JJ4zCcUgxJpycudLMuC/Xv0upK+Q0caItBrHxfVNnRKkjKqlDxRhA8nXTY8d2n19FNi7wahCECbyweJJ76EaJaa/Ib6remUBrbGLoQ2PkaSMBHAcn3+7+H/6x11b2s1RHj5qyfIyrvZcDDyNuxdXwpOkhtrkwZsjgtOfXL6IuxW5FExgPPr8B9nNwJJKdTxyxgfqtwBR5+m9nrMixzT6AMe95torZ6eX40gKZ/O9EU=

View File

@@ -1,8 +0,0 @@
[main]
host = https://www.transifex.com
[edx-platform.frontend-component-footer]
file_filter = src/i18n/messages/<lang>.json
source_file = src/i18n/transifex_input.json
source_lang = en
type = KEYVALUEJSON

52
Makefile Executable file → Normal file
View File

@@ -1,41 +1,39 @@
transifex_utils = ./node_modules/.bin/transifex-utils.js
i18n = ./src/i18n
transifex_input = $(i18n)/transifex_input.json
# This directory must match .babelrc .
transifex_temp = ./temp/babel-plugin-formatjs
build:
rm -rf ./dist
./node_modules/.bin/fedx-scripts babel src --out-dir dist --source-maps --ignore **/*.test.jsx,**/__mocks__,**/__snapshots__,**/setupTest.js --copy-files
@# --copy-files will bring in everything else that wasn't processed by babel. Remove what we don't want.
@rm -rf dist/**/*.test.jsx
@rm -rf dist/**/__snapshots__
@rm -rf dist/__mocks__
requirements:
npm install
npm ci
i18n.extract:
# Pulling display strings from .jsx files into .json files...
# Pulling display strings from .jsx files into .json files...
rm -rf $(transifex_temp)
npm run-script i18n_extract
i18n.concat:
# Gathering JSON messages into one file...
./src/i18n/i18n-concat.js ./temp/src ./src/i18n/transifex_input.json
# The following make targets are required by our tooling scripts found in:
# - https://github.com/edx/ecommerce-scripts/tree/master/transifex
# Gathering JSON messages into one file...
$(transifex_utils) $(transifex_temp) $(transifex_input)
extract_translations: | requirements i18n.extract i18n.concat
# Despite the name, we actually need this target to detect changes in the incoming translated message files as well.
detect_changed_source_translations:
git diff --exit-code ./src/i18n/transifex_input.json
# Checking for changed translations...
git diff --exit-code $(i18n)
tx_url1 = https://www.transifex.com/api/2/project/edx-platform/resource/frontend-component-footer/translation/en/strings/
tx_url2 = https://www.transifex.com/api/2/project/edx-platform/resource/frontend-component-footer/source/
# push translations to Transifex, doing magic so we can include the translator comments
# Note: extract_translations is a prereq that our translation script calls separately.
push_translations:
tx push -s
# Adding translator comments...
# Fetching strings from Transifex...
./node_modules/reactifex/bash_scripts/get_hashed_strings.sh $(tx_url1)
# Writing out comments to file...
./src/i18n/i18n-concat.js ./temp/src --comments
# Adding comments to Transifex...
./node_modules/reactifex/bash_scripts/put_comments.sh $(tx_url2)
# pull translations from Transifex
pull_translations: ## must be exactly this name for edx tooling support, see ecommerce-scripts/transifex/pull.py
tx pull -f --mode reviewed --language="ar,fr,es_419,zh_CN"
# This target is used by Travis.
validate-no-uncommitted-package-lock-changes:
# Checking for package-lock.json changes...
git diff --exit-code package-lock.json

View File

@@ -1,45 +1,202 @@
#########################
frontend-component-footer
=========================
#########################
|Build Status| |Coveralls| |npm_version| |npm_downloads| |license|
|semantic-release|
|Build Status| |Codecov| |npm_version| |npm_downloads| |license| |semantic-release|
frontend-component-footer is a library containing a site footer
component for use when building edX frontend applications.
********
Purpose
********
At this time, this component is hard-coded to match the legacy LMS site footer, including all of its links. As implemented, this component should probably be called the ``frontend-component-lms-footer``.
A generic footer for Open edX micro-frontend applications. It includes a logo and an optional language selector dropdown.
Usage
-----
***************
Getting Started
***************
To install frontend-component-footer into your project::
Prerequisites
=============
npm i --save @edx/frontend-component-footer
The `devstack`_ is currently recommended as a development environment for your
new MFE. If you start it with ``make dev.up.lms`` that should give you
everything you need as a companion to this frontend.
The component expects properties specifying the various URLs that are
linked in the footer. See the sample app in `src/index.jsx <src/index.jsx>`__ for an example
of how the SiteFooter component can be specified.
Note that it is also possible to use `Tutor`_ to develop an MFE. You can refer
to the `relevant tutor-mfe documentation`_ to get started using it.
.. _Devstack: https://github.com/openedx/devstack
.. _Tutor: https://github.com/overhangio/tutor
.. _relevant tutor-mfe documentation: https://github.com/overhangio/tutor-mfe#mfe-development
Requirements
------------
============
This component uses ``@edx/frontend-platform`` services such as i18n, analytics, configuration, and the ``AppContext`` React component, and expects that it has been loaded into a micro-frontend that has been properly initialized via ``@edx/frontend-platform``'s ``initialize`` function. `Please visit the frontend template application to see an example. <https://github.com/openedx/frontend-template-application/blob/3355bb3a96232390e9056f35b06ffa8f105ed7ca/src/index.jsx>`_
Environment Variables
=====================
This component requires that the following environment variable be set by the consuming micro-frontend.
* ``LMS_BASE_URL`` - The URL of the LMS of your Open edX instance.
* ``LOGO_TRADEMARK_URL`` - This is a URL to a logo for use in the footer. This is a different environment variable than ``LOGO_URL`` (used in frontend-component-header) to accommodate sites that would like to have additional trademark information on a logo in the footer, such as a (tm) or (r) symbol.
Installation
============
To install this footer into your Open edX micro-frontend, run the following command in your MFE:
``npm i --save @edx/frontend-component-footer``
This will make the component available to be imported into your application.
Cloning and Startup
===================
.. code-block::
1. Clone your new repo:
``git clone https://github.com/openedx/frontend-component-footer.git``
2. Use node v18.x.
The current version of the micro-frontend build scripts support node 18.
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>`_.
3. Install npm dependencies:
``cd frontend-component-footer && npm ci``
4. Start the dev server:
``npm start``
Usage
=====
This library has the following exports:
* ``(default)``: The footer as a React component.
* ``messages``: Internationalization messages suitable for use with `@edx/frontend-platform/i18n <https://edx.github.io/frontend-platform/module-Internationalization.html>`_
* ``dist/footer.scss``: A SASS file which contains style information for the component. It should be imported into the micro-frontend's own SCSS file.
<Footer /> component props
==========================
* onLanguageSelected: Provides the footer with an event handler for when the user selects a
language from its dropdown.
* supportedLanguages: An array of objects representing available languages. See example below for object shape.
Plugin
======
The footer can be replaced using using `Frontend Plugin Framework <https://github.com/openedx/frontend-plugin-framework>`_.
Information on how to utilize the ``FooterSlot`` component to do so is available in the `frontend-slot-footer repository <https://github.com/openedx/frontend-slot-footer/>`_.
Examples
========
Component Usage Example::
import Footer, { messages } from '@edx/frontend-component-footer';
...
<Footer
onLanguageSelected={(languageCode) => {/* set language */}}
supportedLanguages={[
{ label: 'English', value: 'en'},
{ label: 'Español', value: 'es' },
]}
/>
* `An example of minimal component and messages usage. <https://github.com/openedx/frontend-template-application/blob/3355bb3a96232390e9056f35b06ffa8f105ed7ca/src/index.jsx#L23>`_
* `An example of SCSS file usage. <https://github.com/openedx/frontend-template-application/blob/3cd5485bf387b8c479baf6b02bf59e3061dc3465/src/index.scss#L9>`_
This component uses ``@edx/frontend-i18n``. Any containing app must provide ``@edx/frontend-i18n`` as a peer dependency, and be wrapped inside an ``IntlProvider`` element, whether or not your consuming application is actually localized. For a basic default locale (English) version, follow the ``IntlProvider`` example in the sample application in `src/index.jsx <src/index.jsx>`__.
Development
-----------
===========
Start the dev server::
Install dependencies::
npm i && npm start
npm i
Build the component::
Start the development server::
npm run build
npm start
.. |Build Status| image:: https://api.travis-ci.org/edx/frontend-component-footer.svg?branch=master
:target: https://travis-ci.org/edx/frontend-component-footer
.. |Coveralls| image:: https://img.shields.io/coveralls/edx/frontend-component-footer.svg?branch=master
:target: https://coveralls.io/github/edx/frontend-component-footer
Build a production distribution::
npm run build
License
=======
The code in this repository is licensed under the AGPLv3 unless otherwise
noted.
Please see `LICENSE <LICENSE>`_ for details.
Contributing
============
Contributions are very welcome. Please read `How To Contribute`_ for details.
.. _How To Contribute: https://openedx.org/r/how-to-contribute
This project is currently accepting all types of contributions, bug fixes,
security fixes, maintenance work, or new features. However, please make sure
to have a discussion about your new feature idea with the maintainers prior to
beginning development to maximize the chances of your change being accepted.
You can start a conversation by creating a new issue on this repo summarizing
your idea.
Getting Help
===========
If you're having trouble, we have discussion forums at
https://discuss.openedx.org where you can connect with others in the community.
Our real-time conversations are on Slack. You can request a `Slack
invitation`_, then join our `community Slack workspace`_. Because this is a
frontend repository, the best place to discuss it would be in the `#wg-frontend
channel`_.
For anything non-trivial, the best path is to open an issue in this repository
with as many details about the issue you are facing as you can provide.
https://github.com/openedx/frontend-component-footer/issues
For more information about these options, see the `Getting Help`_ page.
.. _Slack invitation: https://openedx.org/slack
.. _community Slack workspace: https://openedx.slack.com/
.. _#wg-frontend channel: https://openedx.slack.com/archives/C04BM6YC7A6
.. _Getting Help: https://openedx.org/community/connect
The Open edX Code of Conduct
============================
All community members are expected to follow the `Open edX Code of Conduct`_.
.. _Open edX Code of Conduct: https://openedx.org/code-of-conduct/
Reporting Security Issues
=========================
Please do not report security issues in public. Please email security@openedx.org.
.. |Build Status| image:: https://api.travis-ci.com/edx/frontend-component-footer.svg?branch=master
:target: https://travis-ci.com/edx/frontend-component-footer
.. |Codecov| image:: https://img.shields.io/codecov/c/github/edx/frontend-component-footer
:target: @edx/frontend-component-footer
.. |npm_version| image:: https://img.shields.io/npm/v/@edx/frontend-component-footer.svg
:target: @edx/frontend-component-footer
.. |npm_downloads| image:: https://img.shields.io/npm/dt/@edx/frontend-component-footer.svg

3
babel.config.js Normal file
View File

@@ -0,0 +1,3 @@
const { createConfig } = require('@openedx/frontend-build');
module.exports = createConfig('babel-preserve-modules');

14
catalog-info.yaml Normal file
View File

@@ -0,0 +1,14 @@
# This file records information about this repo. Its use is described in OEP-55:
# https://open-edx-proposals.readthedocs.io/en/latest/processes/oep-0055-proc-project-maintainers.html
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: "frontend-component-footer"
description: "A generic footer for the Open edX micro-frontend applications."
annotations:
openedx.org/arch-interest-groups: ""
spec:
owner: group:committers-frontend
type: "library"
lifecycle: "production"

View File

@@ -1,3 +0,0 @@
module.exports = {
extends: ['@commitlint/config-angular'],
};

View File

@@ -1,15 +0,0 @@
// This is the common Webpack config. The dev and prod Webpack configs both
// inherit config defined here.
const path = require('path');
module.exports = {
entry: {
app: path.resolve(__dirname, '../src/index.jsx'),
},
output: {
path: path.resolve(__dirname, '../dist'),
},
resolve: {
extensions: ['.js', '.jsx'],
},
};

View File

@@ -1,115 +0,0 @@
// This is the dev Webpack config. All settings here should prefer a fast build
// time at the expense of creating larger, unoptimized bundles.
const Merge = require('webpack-merge'); // eslint-disable-line import/no-extraneous-dependencies
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin'); // eslint-disable-line import/no-extraneous-dependencies
const webpack = require('webpack'); // eslint-disable-line import/no-extraneous-dependencies
const commonConfig = require('./webpack.common.config.js');
module.exports = Merge.smart(commonConfig, {
mode: 'development',
entry: [
// enable react's custom hot dev client so we get errors reported in the browser
require.resolve('react-dev-utils/webpackHotDevClient'),
path.resolve(__dirname, '../src/index.jsx'),
],
module: {
// Specify file-by-file rules to Webpack. Some file-types need a particular kind of loader.
rules: [
// The babel-loader transforms newer ES2015+ syntax to older ES5 for older browsers.
// Babel is configured with the .babelrc file at the root of the project.
{
test: /\.(js|jsx)$/,
include: [
path.resolve(__dirname, '../src'),
],
loader: 'babel-loader',
options: {
// Caches result of loader to the filesystem. Future builds will attempt to read from the
// cache to avoid needing to run the expensive recompilation process on each run.
cacheDirectory: true,
},
},
// We are not extracting CSS from the javascript bundles in development because extracting
// prevents hot-reloading from working, it increases build time, and we don't care about
// flash-of-unstyled-content issues in development.
{
test: /(.scss|.css)$/,
use: [
'style-loader', // creates style nodes from JS strings
{
loader: 'css-loader', // translates CSS into CommonJS
options: {
sourceMap: true,
},
},
{
loader: 'sass-loader', // compiles Sass to CSS
options: {
sourceMap: true,
includePaths: [
path.join(__dirname, '../node_modules'),
path.join(__dirname, '../src'),
],
},
},
],
},
// Webpack, by default, uses the url-loader for images and fonts that are required/included by
// files it processes, which just base64 encodes them and inlines them in the javascript
// bundles. This makes the javascript bundles ginormous and defeats caching so we will use the
// file-loader instead to copy the files directly to the output directory.
{
test: /\.(woff2?|ttf|svg|eot)(\?v=\d+\.\d+\.\d+)?$/,
loader: 'file-loader',
},
{
test: /\.(jpe?g|png|gif|ico)(\?v=\d+\.\d+\.\d+)?$/,
use: [
'file-loader',
{
loader: 'image-webpack-loader',
options: {
optimizationlevel: 7,
mozjpeg: {
progressive: true,
},
gifsicle: {
interlaced: false,
},
pngquant: {
quality: '65-90',
speed: 4,
},
},
},
],
},
],
},
// Specify additional processing or side-effects done on the Webpack output bundles as a whole.
plugins: [
// Generates an HTML file in the output directory.
new HtmlWebpackPlugin({
inject: true, // Appends script tags linking to the webpack bundles at the end of the body
template: path.resolve(__dirname, '../public/index.html'),
}),
new webpack.EnvironmentPlugin({
NODE_ENV: 'development',
}),
// when the --hot option is not passed in as part of the command
// the HotModuleReplacementPlugin has to be specified in the Webpack configuration
// https://webpack.js.org/configuration/dev-server/#devserver-hot
new webpack.HotModuleReplacementPlugin(),
],
// This configures webpack-dev-server which serves bundles from memory and provides live
// reloading.
devServer: {
host: '0.0.0.0',
port: 3000,
historyApiFallback: true,
hot: true,
inline: true,
},
});

View File

@@ -1,77 +0,0 @@
// This is the prod Webpack config. All settings here should prefer smaller,
// optimized bundles at the expense of a longer build time.
const Merge = require('webpack-merge'); // eslint-disable-line import/no-extraneous-dependencies
const commonConfig = require('./webpack.common.config.js');
const path = require('path');
const CleanWebpackPlugin = require('clean-webpack-plugin'); // eslint-disable-line import/no-extraneous-dependencies
module.exports = Merge.smart(commonConfig, {
mode: 'production',
devtool: 'source-map',
entry: './src/lib/index.js',
output: {
path: path.resolve(__dirname, '../dist'),
library: 'frontend-component-footer',
libraryTarget: 'umd',
globalObject: 'typeof self !== \'undefined\' ? self : this',
},
resolve: {
extensions: ['.js', '.jsx'],
alias: {
react: path.resolve(__dirname, './node_modules/react'),
'react-dom': path.resolve(__dirname, './node_modules/react-dom'),
},
},
externals: {
react: {
commonjs: 'react',
commonjs2: 'react',
amd: 'React',
root: 'React',
},
'react-dom': {
commonjs: 'react-dom',
commonjs2: 'react-dom',
amd: 'ReactDOM',
root: 'ReactDOM',
},
'@edx/frontend-i18n': {
commonjs: '@edx/frontend-i18n',
commonjs2: '@edx/frontend-i18n',
amd: '@edx/frontend-i18n',
root: '@edx/frontend-i18n',
},
'@edx/frontend-logging': {
commonjs: '@edx/frontend-logging',
commonjs2: '@edx/frontend-logging',
amd: '@edx/frontend-logging',
root: '@edx/frontend-logging',
},
'@edx/paragon': {
commonjs: '@edx/paragon',
commonjs2: '@edx/paragon',
amd: 'Paragon',
root: 'Paragon',
},
},
plugins: [
// Cleans the dist directory before each build
new CleanWebpackPlugin(['dist'], {
root: path.join(__dirname, '../'),
}),
],
module: {
rules: [
{
test: /\.(js|jsx)$/,
include: [
path.resolve(__dirname, '../src/lib'),
],
exclude: /(node_modules)/,
use: [
{ loader: 'babel-loader' },
],
},
],
},
});

33
example/index.jsx Normal file
View File

@@ -0,0 +1,33 @@
import 'babel-polyfill';
import React from 'react';
import ReactDOM from 'react-dom';
import { initialize, getConfig, subscribe, APP_READY } from '@edx/frontend-platform';
import { AppContext, AppProvider } from '@edx/frontend-platform/react';
import Footer from '@edx/frontend-component-footer';
import './index.scss';
subscribe(APP_READY, () => {
ReactDOM.render(
<AppProvider>
<AppContext.Provider value={{
authenticatedUser: null,
config: getConfig(),
}}>
<Footer
onLanguageSelected={() => {}}
supportedLanguages={[
{ label: 'English', value: 'en' },
{ label: 'Español', value: 'es' },
]}
/>
</AppContext.Provider>
</AppProvider>,
document.getElementById('root'),
);
});
initialize({
messages: []
});

4
example/index.scss Normal file
View File

@@ -0,0 +1,4 @@
@use "@openedx/paragon/dist/core.min.css" as paragonCore;
@use "@openedx/paragon/dist/light.min.css" as paragonLight;
@import "@edx/frontend-component-footer/footer";

7
jest.config.js Normal file
View File

@@ -0,0 +1,7 @@
const { createConfig } = require('@openedx/frontend-build');
module.exports = createConfig('jest', {
setupFiles: [
'<rootDir>/src/setupTest.js',
],
});

54807
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,117 +1,77 @@
{
"name": "@edx/frontend-component-footer",
"version": "1.0.0-semantically-released",
"description": "Site footer component for use when building edX frontend applications",
"main": "dist/main.js",
"module": "dist/main.js",
"description": "Footer component for use when building Open edX frontend applications",
"main": "dist/index.js",
"publishConfig": {
"access": "public"
},
"scripts": {
"build": "NODE_ENV=production BABEL_ENV=production webpack --config=config/webpack.prod.config.js",
"build:stats": "NODE_ENV=production BABEL_ENV=production webpack --config=config/webpack.prod.config.js --profile --progress --json > stats.json",
"gc": "commit",
"commitmsg": "commitlint -e $GIT_PARAMS",
"coveralls": "cat ./coverage/lcov.info | coveralls",
"i18n_extract": "BABEL_ENV=i18n babel src --quiet > /dev/null",
"lint": "eslint --ext .js --ext .jsx .",
"precommit": "npm run lint",
"prepublishOnly": "npm run build",
"semantic-release": "semantic-release",
"start": "NODE_ENV=development BABEL_ENV=development node_modules/.bin/webpack-dev-server --config=config/webpack.dev.config.js --progress",
"test": "jest --coverage",
"snapshot": "jest --updateSnapshot",
"travis-deploy-once": "travis-deploy-once",
"watch": "watch 'npm run build' ./src"
"build": "make build",
"i18n_extract": "fedx-scripts formatjs extract",
"lint": "fedx-scripts eslint --ext .js --ext .jsx .",
"snapshot": "fedx-scripts jest --updateSnapshot",
"start": "fedx-scripts webpack-dev-server --progress",
"start:with-theme": "paragon install-theme && npm start && npm install",
"test": "fedx-scripts jest --coverage",
"test:watch": "npm run test -- --watch"
},
"files": [
"/dist"
],
"husky": {
"hooks": {
"pre-commit": "npm run lint"
}
},
"repository": {
"type": "git",
"url": "git+https://github.com/edx/frontend-component-footer.git"
"url": "git+https://github.com/openedx/frontend-component-footer.git"
},
"author": "edX",
"license": "AGPL-3.0",
"bugs": {
"url": "https://github.com/edx/frontend-component-footer/issues"
"url": "https://github.com/openedx/frontend-component-footer/issues"
},
"homepage": "https://github.com/edx/frontend-component-footer#readme",
"homepage": "https://github.com/openedx/frontend-component-footer#readme",
"devDependencies": {
"@commitlint/cli": "^7.1.2",
"@commitlint/config-angular": "^6.0.2",
"@commitlint/prompt": "^6.0.2",
"@commitlint/prompt-cli": "^6.0.2",
"@edx/frontend-i18n": "^1.0.2",
"@edx/frontend-logging": "^2.0.2",
"@edx/paragon": "^4.2.4",
"@fortawesome/fontawesome-svg-core": "^1.2.17",
"@fortawesome/free-brands-svg-icons": "^5.8.1",
"@fortawesome/free-regular-svg-icons": "^5.8.1",
"@fortawesome/free-solid-svg-icons": "^5.8.1",
"@fortawesome/react-fontawesome": "^0.1.4",
"babel-cli": "^6.26.0",
"babel-core": "^6.26.3",
"babel-loader": "^7.1.5",
"babel-plugin-react-intl": "^3.0.1",
"babel-plugin-rewire": "^1.2.0",
"babel-plugin-transform-object-rest-spread": "^6.26.0",
"babel-preset-env": "^1.7.0",
"babel-preset-react": "^6.24.1",
"clean-webpack-plugin": "^0.1.19",
"coveralls": "^3.0.0",
"css-loader": "^0.28.9",
"enzyme": "^3.3.0",
"enzyme-adapter-react-16": "^1.1.1",
"eslint": "^5.2.0",
"eslint-config-edx": "^4.0.4",
"eslint-plugin-jsx-a11y": "^6.1.2",
"file-loader": "^1.1.9",
"glob": "^7.1.3",
"html-webpack-plugin": "^3.2.0",
"husky": "^0.14.3",
"image-webpack-loader": "^4.2.0",
"jest": "23.6.0",
"node-sass": "^4.7.2",
"prop-types": "^15.5.10",
"react": "^16.4.2",
"react-dev-utils": "^5.0.0",
"react-dom": "^16.2.0",
"react-test-renderer": "^16.6.0",
"reactifex": "^1.1.1",
"sass-loader": "^6.0.6",
"semantic-release": "^15.1.7",
"source-map-loader": "^0.2.1",
"style-loader": "^0.20.2",
"travis-deploy-once": "^5.0.0",
"watch": "^1.0.2",
"webpack": "^4.19.1",
"webpack-cli": "^3.1.0",
"webpack-dev-server": "^3.1.9",
"webpack-merge": "^4.2.1"
"@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/frontend-plugin-framework": "^1.5.0",
"@openedx/paragon": "^23.3.0",
"@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^16.2.0",
"@testing-library/dom": "^10.4.0",
"@testing-library/user-event": "^14.6.1",
"husky": "8.0.3",
"prop-types": "15.8.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-redux": "8.1.3",
"react-router-dom": "6.30.0",
"react-test-renderer": "18.3.1",
"redux": "4.2.1",
"semantic-release": "21.1.2"
},
"dependencies": {
"query-string": "^5.1.1"
"@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",
"classnames": "^2.5.1",
"jest-environment-jsdom": "^29.7.0",
"lodash": "^4.17.21",
"ts-jest": "^29.1.2"
},
"peerDependencies": {
"@edx/frontend-i18n": "^1.0.2",
"@edx/frontend-logging": "^2.0.2",
"@edx/paragon": "^4.2.4",
"@edx/frontend-platform": "^7.0.0 || ^8.0.0",
"@openedx/paragon": ">= 21.11.3 < 24.0.0",
"prop-types": "^15.5.10",
"react": "^16.4.2",
"react-dom": "^16.2.0"
},
"jest": {
"setupFiles": [
"./src/tests/setupTest.js"
],
"collectCoverageFrom": [
"src/lib/**/*.{js,jsx}",
"!src/tests/setupTest.js",
"!src/index.js",
"!**/node_modules/**",
"!**/tests/**"
],
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
"\\.(css|scss)$": "identity-obj-proxy"
}
"react": "^16.9.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0"
}
}

View File

@@ -1,9 +1,9 @@
<!doctype html>
<html lang="en-us">
<html lang="en-us" dir="ltr">
<head>
<title>Footer | edX</title>
<title>Footer</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="root"></div>

33
renovate.json Normal file
View File

@@ -0,0 +1,33 @@
{
"extends": [
"config:base",
"schedule:weekly",
":automergeLinters",
":automergeMinor",
":automergeTesters",
":enableVulnerabilityAlerts",
":rebaseStalePrs",
":semanticCommits",
":updateNotScheduled"
],
"packageRules": [
{
"matchDepTypes": [
"devDependencies"
],
"matchUpdateTypes": [
"lockFileMaintenance",
"minor",
"patch",
"pin"
],
"automerge": true
},
{
"matchPackagePatterns": ["@edx", "@openedx"],
"matchUpdateTypes": ["minor", "patch"],
"automerge": true
}
],
"timezone": "America/New_York"
}

5
src/_footer.scss Normal file
View File

@@ -0,0 +1,5 @@
$gray-footer: #fcfcfc !default;
.footer {
background-color: var(--pgn-color-light-100, $gray-footer);
}

95
src/components/Footer.jsx Normal file
View File

@@ -0,0 +1,95 @@
import React from 'react';
import PropTypes from 'prop-types';
import { injectIntl, intlShape } 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';
import messages from './Footer.messages';
import LanguageSelector from './LanguageSelector';
ensureConfig([
'LMS_BASE_URL',
'LOGO_TRADEMARK_URL',
], 'Footer component');
const EVENT_NAMES = {
FOOTER_LINK: 'edx.bi.footer.link',
};
class SiteFooter extends React.Component {
constructor(props) {
super(props);
this.externalLinkClickHandler = this.externalLinkClickHandler.bind(this);
}
externalLinkClickHandler(event) {
const label = event.currentTarget.getAttribute('href');
const eventName = EVENT_NAMES.FOOTER_LINK;
const properties = {
category: 'outbound_link',
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;
SiteFooter.propTypes = {
intl: intlShape.isRequired,
logo: PropTypes.string,
onLanguageSelected: PropTypes.func,
supportedLanguages: PropTypes.arrayOf(PropTypes.shape({
label: PropTypes.string.isRequired,
value: PropTypes.string.isRequired,
})),
};
SiteFooter.defaultProps = {
logo: undefined,
onLanguageSelected: undefined,
supportedLanguages: [],
};
export default injectIntl(SiteFooter);
export { EVENT_NAMES };

View File

@@ -0,0 +1,156 @@
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
'footer.socialLinks.srText.facebook': {
id: 'footer.socialLinks.srText.facebook',
defaultMessage: 'Like edX on Facebook',
description: 'This is screenreader text for the edX Facebook social media link in the footer.',
},
'footer.socialLinks.srText.twitter': {
id: 'footer.socialLinks.srText.twitter',
defaultMessage: 'Follow edX on Twitter',
description: 'This is screenreader text for the edX Twitter social media link in the footer.',
},
'footer.socialLinks.srText.youtube': {
id: 'footer.socialLinks.srText.youtube',
defaultMessage: 'Subscribe to the edX YouTube channel',
description: 'This is screenreader text for the edX YouTube social media link in the footer.',
},
'footer.socialLinks.srText.linkedin': {
id: 'footer.socialLinks.srText.linkedin',
defaultMessage: 'Follow edX on LinkedIn',
description: 'This is screenreader text for the edX LinkedIn social media link in the footer.',
},
'footer.socialLinks.srText.reddit': {
id: 'footer.socialLinks.srText.reddit',
defaultMessage: 'Subscribe to the edX subreddit',
description: 'This is screenreader text for the edX reddit social media link in the footer.',
},
'footer.languageForm.select.label': {
id: 'footer.languageForm.select.label',
defaultMessage: 'Choose Language',
description: 'The label for the laguage select part of the language selection form.',
},
'footer.languageForm.submit.label': {
id: 'footer.languageForm.submit.label',
defaultMessage: 'Apply',
description: 'The label for button to submit the language selection form.',
},
'footer.edxLinks.about': {
id: 'footer.edxLinks.about',
defaultMessage: 'About',
description: 'The label for the link to the about edX page.',
},
'footer.edxLinks.business': {
id: 'footer.edxLinks.business',
defaultMessage: 'edX for Business',
description: 'The label for the link to the edX for business page.',
},
'footer.edxLinks.affiliates': {
id: 'footer.edxLinks.affiliates',
defaultMessage: 'Affiliates',
description: 'The label for the link to the edX affiliates page.',
},
'footer.edxLinks.openEdx': {
id: 'footer.edxLinks.openEdx',
defaultMessage: 'Open edX',
description: 'The label for the link to the open edX site.',
},
'footer.edxLinks.careers': {
id: 'footer.edxLinks.careers',
defaultMessage: 'Careers',
description: 'The label for the link to the edX Careers page.',
},
'footer.edxLinks.news': {
id: 'footer.edxLinks.news',
defaultMessage: 'News',
description: 'The label for the link to the edX news page.',
},
'footer.legalLinks.heading': {
id: 'footer.legalLinks.heading',
defaultMessage: 'Legal',
description: 'Heading for the legal links section of the footer.',
},
'footer.legalLinks.termsOfService': {
id: 'footer.legalLinks.termsOfService',
defaultMessage: 'Terms of Service & Honor Code',
description: 'The label for the link to the edX terms of service page.',
},
'footer.legalLinks.privacyPolicy': {
id: 'footer.legalLinks.privacyPolicy',
defaultMessage: 'Privacy Policy',
description: 'The label for the link to the edX privacy policy page.',
},
'footer.legalLinks.a11yPolicy': {
id: 'footer.legalLinks.a11yPolicy',
defaultMessage: 'Accessibility Policy',
description: 'The label for the link to the edX accessibility policy page.',
},
'footer.legalLinks.trademarkPolicy': {
id: 'footer.legalLinks.trademarkPolicy',
defaultMessage: 'Trademark Policy',
description: 'The label for the link to the edX trademark policy page.',
},
'footer.legalLinks.sitemap': {
id: 'footer.legalLinks.sitemap',
defaultMessage: 'Sitemap',
description: 'The label for the link to the edX sitemap page.',
},
'footer.connectLinks.heading': {
id: 'footer.connectLinks.heading',
defaultMessage: 'Connect',
description: 'Heading for the connect links section of the footer.',
},
'footer.connectLinks.blog': {
id: 'footer.connectLinks.blog',
defaultMessage: 'Blog',
description: 'The label for the link to the edX blog.',
},
'footer.connectLinks.contact': {
id: 'footer.connectLinks.contact',
defaultMessage: 'Contact Us',
description: 'The label for the link to the contact edX page.',
},
'footer.connectLinks.help': {
id: 'footer.connectLinks.help',
defaultMessage: 'Help Center',
description: 'The label for the link to the edX help center.',
},
'footer.connectLinks.mediaKit': {
id: 'footer.connectLinks.mediaKit',
defaultMessage: 'Media Kit',
description: 'The label for the link to the edX media kit page.',
},
'footer.connectLinks.donate': {
id: 'footer.connectLinks.donate',
defaultMessage: 'Donate',
description: 'The label for the link to the edX donation page.',
},
'footer.mobileApp.apple': {
id: 'footer.mobileApp.apple',
defaultMessage: 'Download the edX mobile app from the Apple App Store',
description: 'The label for the link to download the apple version of the edX app.',
},
'footer.mobileApp.google': {
id: 'footer.mobileApp.google',
defaultMessage: 'Download the edX mobile app from Google Play',
description: 'The label for the link to download the google version of the edX app.',
},
'footer.logo.altText': {
id: 'footer.logo.altText',
defaultMessage: 'Powered by Open edX',
description: 'alt text for the footer logo.',
},
'footer.logo.ariaLabel': {
id: 'footer.logo.ariaLabel',
defaultMessage: 'edX Home',
description: 'aria-label for the footer logo.',
},
'footer.ariaLabel': {
id: 'footer.ariaLabel',
defaultMessage: 'Page Footer',
description: 'aria-label for the footer component',
},
});
export default messages;

View File

@@ -0,0 +1,91 @@
/* eslint-disable react/prop-types */
import React, { useMemo } from 'react';
import renderer from 'react-test-renderer';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { IntlProvider } from '@edx/frontend-platform/i18n';
import { AppContext } from '@edx/frontend-platform/react';
import Footer from './Footer';
const FooterWithContext = ({ locale = 'es' }) => {
const contextValue = useMemo(() => ({
authenticatedUser: null,
config: {
LOGO_TRADEMARK_URL: process.env.LOGO_TRADEMARK_URL,
LMS_BASE_URL: process.env.LMS_BASE_URL,
},
}), []);
return (
<IntlProvider locale={locale}>
<AppContext.Provider
value={contextValue}
>
<Footer />
</AppContext.Provider>
</IntlProvider>
);
};
const FooterWithLanguageSelector = ({ languageSelected = () => {} }) => {
const contextValue = useMemo(() => ({
authenticatedUser: null,
config: {
LOGO_TRADEMARK_URL: process.env.LOGO_TRADEMARK_URL,
LMS_BASE_URL: process.env.LMS_BASE_URL,
},
}), []);
return (
<IntlProvider locale="en">
<AppContext.Provider
value={contextValue}
>
<Footer
onLanguageSelected={languageSelected}
supportedLanguages={[
{ label: 'English', value: 'en' },
{ label: 'Español', value: 'es' },
]}
/>
</AppContext.Provider>
</IntlProvider>
);
};
describe('<Footer />', () => {
describe('renders correctly', () => {
it('renders without a language selector', () => {
const tree = renderer
.create(<FooterWithContext locale="en" />)
.toJSON();
expect(tree).toMatchSnapshot();
});
it('renders without a language selector in es', () => {
const tree = renderer
.create(<FooterWithContext locale="es" />)
.toJSON();
expect(tree).toMatchSnapshot();
});
it('renders with a language selector', () => {
const tree = renderer
.create(<FooterWithLanguageSelector />)
.toJSON();
expect(tree).toMatchSnapshot();
});
});
describe('handles language switching', () => {
it('calls onLanguageSelected prop when a language is changed', async () => {
const user = userEvent.setup();
const mockHandleLanguageSelected = jest.fn();
render(<FooterWithLanguageSelector languageSelected={mockHandleLanguageSelected} />);
await user.selectOptions(screen.getByRole('combobox'), 'es');
await user.click(screen.getByTestId('site-footer-submit-btn'));
expect(mockHandleLanguageSelected).toHaveBeenCalledWith('es');
});
});
});

View File

@@ -0,0 +1,58 @@
import React from 'react';
import PropTypes from 'prop-types';
import { injectIntl, intlShape, FormattedMessage } from '@edx/frontend-platform/i18n';
const LanguageSelector = ({
intl, options, onSubmit, ...props
}) => {
const handleSubmit = (e) => {
e.preventDefault();
const languageCode = e.target.elements['site-footer-language-select'].value;
onSubmit(languageCode);
};
return (
<form
className="form-inline"
onSubmit={handleSubmit}
{...props}
>
<div className="form-group">
{/* eslint-disable-next-line jsx-a11y/label-has-associated-control */}
<label htmlFor="site-footer-language-select" className="d-inline-block m-0">
<FormattedMessage
id="footer.languageForm.select.label"
defaultMessage="Choose Language"
description="The label for the laguage select part of the language selection form."
/>
</label>
<select
id="site-footer-language-select"
className="form-control-sm mx-2"
name="site-footer-language-select"
defaultValue={intl.locale}
>
{options.map(({ value, label }) => <option key={value} value={value}>{label}</option>)}
</select>
<button data-testid="site-footer-submit-btn" className="btn btn-outline-primary btn-sm" type="submit">
<FormattedMessage
id="footer.languageForm.submit.label"
defaultMessage="Apply"
description="The label for button to submit the language selection form."
/>
</button>
</div>
</form>
);
};
LanguageSelector.propTypes = {
intl: intlShape.isRequired,
onSubmit: PropTypes.func.isRequired,
options: PropTypes.arrayOf(PropTypes.shape({
value: PropTypes.string,
label: PropTypes.string,
})).isRequired,
};
export default injectIntl(LanguageSelector);

View File

@@ -0,0 +1,130 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`<Footer /> renders correctly renders with a language selector 1`] = `
<footer
className="footer d-flex border-top py-3 px-4"
role="contentinfo"
>
<div
className="container-fluid d-flex"
>
<a
aria-label="edX Home"
className="d-block"
href="http://localhost:18000"
>
<img
alt="Powered by Open edX"
src="https://edx-cdn.org/v3/default/logo-trademark.svg"
style={
{
"maxHeight": 45,
}
}
/>
</a>
<div
className="flex-grow-1"
/>
<form
className="form-inline"
onSubmit={[Function]}
>
<div
className="form-group"
>
<label
className="d-inline-block m-0"
htmlFor="site-footer-language-select"
>
Choose Language
</label>
<select
className="form-control-sm mx-2"
defaultValue="en"
id="site-footer-language-select"
name="site-footer-language-select"
>
<option
value="en"
>
English
</option>
<option
value="es"
>
Español
</option>
</select>
<button
className="btn btn-outline-primary btn-sm"
data-testid="site-footer-submit-btn"
type="submit"
>
Apply
</button>
</div>
</form>
</div>
</footer>
`;
exports[`<Footer /> renders correctly renders without a language selector 1`] = `
<footer
className="footer d-flex border-top py-3 px-4"
role="contentinfo"
>
<div
className="container-fluid d-flex"
>
<a
aria-label="edX Home"
className="d-block"
href="http://localhost:18000"
>
<img
alt="Powered by Open edX"
src="https://edx-cdn.org/v3/default/logo-trademark.svg"
style={
{
"maxHeight": 45,
}
}
/>
</a>
<div
className="flex-grow-1"
/>
</div>
</footer>
`;
exports[`<Footer /> renders correctly renders without a language selector in es 1`] = `
<footer
className="footer d-flex border-top py-3 px-4"
role="contentinfo"
>
<div
className="container-fluid d-flex"
>
<a
aria-label="edX Home"
className="d-block"
href="http://localhost:18000"
>
<img
alt="Powered by Open edX"
src="https://edx-cdn.org/v3/default/logo-trademark.svg"
style={
{
"maxHeight": 45,
}
}
/>
</a>
<div
className="flex-grow-1"
/>
</div>
</footer>
`;

View File

@@ -0,0 +1,158 @@
import React, { useContext, useState } from 'react';
import isEmpty from 'lodash/isEmpty';
import { useIntl, FormattedMessage } from '@edx/frontend-platform/i18n';
import { ensureConfig } from '@edx/frontend-platform';
import { AppContext } from '@edx/frontend-platform/react';
import {
ActionRow,
Button,
Container,
Hyperlink,
Image,
TransitionReplace,
} from '@openedx/paragon';
import { ExpandLess, ExpandMore, Help } from '@openedx/paragon/icons';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import messages from './messages';
ensureConfig([
'LMS_BASE_URL',
'MARKETING_SITE_BASE_URL',
'TERMS_OF_SERVICE_URL',
'PRIVACY_POLICY_URL',
'SUPPORT_EMAIL',
'SITE_NAME',
'STUDIO_BASE_URL',
'ENABLE_ACCESSIBILITY_PAGE',
], 'Studio Footer component');
const StudioFooter = ({
containerProps,
}) => {
const intl = useIntl();
const [isOpen, setIsOpen] = useState(false);
const { config } = useContext(AppContext);
const { containerClassName, ...restContainerProps } = containerProps || {};
return (
<>
<div className="m-0 mt-6 row align-items-center justify-content-center">
<div className="col border-top mr-2" />
<Button
data-testid="helpToggleButton"
variant="outline-primary"
onClick={() => setIsOpen(!isOpen)}
iconBefore={Help}
iconAfter={isOpen ? ExpandLess : ExpandMore}
size="sm"
>
{isOpen ? intl.formatMessage(messages.closeHelpButtonLabel)
: intl.formatMessage(messages.openHelpButtonLabel)}
</Button>
<div className="col border-top ml-2" />
</div>
<Container
size="xl"
className={classNames('px-4', containerClassName)}
{...restContainerProps}
>
<TransitionReplace>
{isOpen ? (
<ActionRow key="help-link-button-row" className="py-4" data-testid="helpButtonRow">
<ActionRow.Spacer />
<Button as="a" href="https://docs.edx.org/" size="sm">
<FormattedMessage {...messages.edxDocumentationButtonLabel} />
</Button>
<Button
as="a"
href="https://open.edx.org/"
size="sm"
data-testid="openEdXPortalButton"
>
<FormattedMessage {...messages.openEdxPortalButtonLabel} />
</Button>
<Button
as="a"
href="https://www.edx.org/course/edx101-overview-of-creating-an-edx-course#.VO4eaLPF-n1"
size="sm"
>
<FormattedMessage {...messages.edx101ButtonLabel} />
</Button>
<Button
as="a"
href="https://www.edx.org/course/studiox-creating-a-course-with-edx-studio"
size="sm"
>
<FormattedMessage {...messages.studioXButtonLabel} />
</Button>
{!isEmpty(config.SUPPORT_EMAIL) && (
<Button
as="a"
href={`mailto:${config.SUPPORT_EMAIL}`}
size="sm"
data-testid="contactUsButton"
>
<FormattedMessage {...messages.contactUsButtonLabel} />
</Button>
)}
<ActionRow.Spacer />
</ActionRow>
) : null}
</TransitionReplace>
<ActionRow className="pt-3 m-0 x-small">
© {new Date().getFullYear()} <Hyperlink destination={config.MARKETING_SITE_BASE_URL} target="_blank" className="ml-2">{config.SITE_NAME}</Hyperlink>
<ActionRow.Spacer />
{!isEmpty(config.TERMS_OF_SERVICE_URL) && (
<Hyperlink destination={config.TERMS_OF_SERVICE_URL} data-testid="termsOfService">
{intl.formatMessage(messages.termsOfServiceLinkLabel)}
</Hyperlink>
)}{!isEmpty(config.PRIVACY_POLICY_URL) && (
<Hyperlink destination={config.PRIVACY_POLICY_URL} data-testid="privacyPolicy">
{intl.formatMessage(messages.privacyPolicyLinkLabel)}
</Hyperlink>
)}
{config.ENABLE_ACCESSIBILITY_PAGE === 'true' && (
<Hyperlink
destination={`${config.STUDIO_BASE_URL}/accessibility`}
data-testid="accessibilityRequest"
>
{intl.formatMessage(messages.accessibilityRequestLinkLabel)}
</Hyperlink>
)}
<Hyperlink destination={config.LMS_BASE_URL}>LMS</Hyperlink>
</ActionRow>
<ActionRow className="mt-3 pb-4 x-small">
{/*
Site operators: Please do not remove this paragraph! this attributes back to edX and
makes your acknowledgement of edX's trademarks clear.
Translators: 'edX' and 'Open edX' are trademarks of 'edX Inc.'. Please do not translate
any of these trademarks and company names.
*/}
<FormattedMessage {...messages.trademarkMessage} />
<Hyperlink className="ml-1" destination="https://www.edx.org">edX Inc</Hyperlink>.
<ActionRow.Spacer />
<Hyperlink destination="https://open.edx.org" className="float-right">
<Image
width="120px"
alt="Powered by Open edX"
src="https://logos.openedx.org/open-edx-logo-tag.png"
/>
</Hyperlink>
</ActionRow>
</Container>
</>
);
};
StudioFooter.propTypes = {
containerProps: PropTypes.shape(Container.propTypes),
};
StudioFooter.defaultProps = {
containerProps: {},
};
export default StudioFooter;

View File

@@ -0,0 +1,127 @@
/* eslint-disable react/prop-types */
import React, { useMemo } from 'react';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import '@testing-library/jest-dom/extend-expect';
import { IntlProvider } from '@edx/frontend-platform/i18n';
import { AppContext } from '@edx/frontend-platform/react';
import StudioFooter from './StudioFooter';
import messages from './messages';
const config = {
LMS_BASE_URL: process.env.LMS_BASE_URL,
MARKETING_SITE_BASE_URL: process.env.MARKETING_SITE_BASE_URL,
TERMS_OF_SERVICE_URL: process.env.TERMS_OF_SERVICE_URL,
PRIVACY_POLICY_URL: process.env.PRIVACY_POLICY_URL,
SUPPORT_EMAIL: process.env.SUPPORT_EMAIL,
SITE_NAME: process.env.SITE_NAME,
STUDIO_BASE_URL: process.env.STUDIO_BASE_URL,
ENABLE_ACCESSIBILITY_PAGE: process.env.ENABLE_ACCESSIBILITY_PAGE,
};
let currentConfig = config;
const Component = ({ updateVariable }) => {
if (updateVariable) {
const [variable, value] = updateVariable;
currentConfig = {
...config,
[variable]: value,
};
}
const contextValue = useMemo(() => ({
authenticatedUser: null,
config: currentConfig,
}), []);
return (
<IntlProvider locale="en">
<AppContext.Provider value={contextValue}>
<StudioFooter />
</AppContext.Provider>
</IntlProvider>
);
};
jest.unmock('@openedx/paragon');
describe('Footer', () => {
describe('help section default view', () => {
it('help button should read Looking for help with Studio?', () => {
render(<Component />);
expect(screen.getByText(messages.openHelpButtonLabel.defaultMessage))
.toBeVisible();
});
it('help button link row should not be visible', () => {
render(<Component />);
expect(screen.queryByTestId('helpButtonRow')).toBeNull();
});
});
describe('help section expanded view', () => {
it('help button should read Hide Studio help', async () => {
const user = userEvent.setup();
render(<Component />);
const helpToggleButton = screen.getByText(messages.openHelpButtonLabel.defaultMessage);
await user.click(helpToggleButton);
expect(screen.getByText(messages.closeHelpButtonLabel.defaultMessage))
.toBeVisible();
});
it('help button link row should be visible', async () => {
const user = userEvent.setup();
render(<Component />);
const helpToggleButton = screen.getByText(messages.openHelpButtonLabel.defaultMessage);
await user.click(helpToggleButton);
expect(screen.getByTestId('helpButtonRow')).toBeVisible();
});
it('Open edX portal button should be visible', async () => {
const user = userEvent.setup();
render(<Component />);
const helpToggleButton = screen.getByText(messages.openHelpButtonLabel.defaultMessage);
await user.click(helpToggleButton);
expect(screen.getByTestId('openEdXPortalButton')).toBeVisible();
});
it('should not show contact us button', async () => {
const user = userEvent.setup();
render(<Component />);
const helpToggleButton = screen.getByText(messages.openHelpButtonLabel.defaultMessage);
await user.click(helpToggleButton);
expect(screen.queryByTestId('contactUsButton')).toBeNull();
});
it('should show contact us button', async () => {
const user = userEvent.setup();
render(<Component updateVariable={['SUPPORT_EMAIL', 'support@email.com']} />);
const helpToggleButton = screen.getByText(messages.openHelpButtonLabel.defaultMessage);
await user.click(helpToggleButton);
expect(screen.getByTestId('contactUsButton')).toBeVisible();
});
});
describe('policy link row', () => {
it('should only show LMS link', () => {
render(<Component />);
expect(screen.getByText('LMS')).toBeVisible();
expect(screen.queryByTestId('termsOfService')).toBeNull();
expect(screen.queryByTestId('privacyPolicy')).toBeNull();
expect(screen.queryByTestId('accessibilityRequest')).toBeNull();
});
it('should show terms of service link', () => {
render(<Component updateVariable={['TERMS_OF_SERVICE_URL', 'termsofserviceurl']} />);
expect(screen.getByText('LMS')).toBeVisible();
expect(screen.queryByTestId('termsOfService')).toBeVisible();
expect(screen.queryByTestId('privacyPolicy')).toBeNull();
expect(screen.queryByTestId('accessibilityRequest')).toBeNull();
});
it('should show privacy policy link', () => {
render(<Component updateVariable={['PRIVACY_POLICY_URL', 'privacypolicyurl']} />);
expect(screen.getByText('LMS')).toBeVisible();
expect(screen.queryByTestId('termsOfService')).toBeNull();
expect(screen.queryByTestId('privacyPolicy')).toBeVisible();
expect(screen.queryByTestId('accessibilityRequest')).toBeNull();
});
it('should show accessibilty request link', () => {
render(<Component updateVariable={['ENABLE_ACCESSIBILITY_PAGE', 'true']} />);
expect(screen.getByText('LMS')).toBeVisible();
expect(screen.queryByTestId('termsOfService')).toBeNull();
expect(screen.queryByTestId('privacyPolicy')).toBeNull();
expect(screen.queryByTestId('accessibilityRequest')).toBeVisible();
});
});
});

View File

@@ -0,0 +1,3 @@
import StudioFooter from './StudioFooter';
export default StudioFooter;

View File

@@ -0,0 +1,61 @@
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
openHelpButtonLabel: {
id: 'authoring.footer.help.openHelp.button.label',
defaultMessage: 'Looking for help with Studio?',
description: 'Label for button that opens the collapsed section with help buttons',
},
closeHelpButtonLabel: {
id: 'authoring.footer.help.closeHelp.button.label',
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',
},
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',
},
contactUsButtonLabel: {
id: 'authoring.footer.help.contactUs.button.label',
defaultMessage: 'Contact us',
description: 'Label for button that links to the email for partner support',
},
termsOfServiceLinkLabel: {
id: 'authoring.footer.termsOfService.link.label',
defaultMessage: 'Terms of Service',
description: 'Label for button that links to the terms of service page',
},
privacyPolicyLinkLabel: {
id: 'authoring.footer.privacyPolicy.link.label',
defaultMessage: 'Privacy Policy',
description: 'Label for button that links to the privacy policy page',
},
accessibilityRequestLinkLabel: {
id: 'authoring.footer.accessibilityRequest.link.label',
defaultMessage: 'Accessibility Accomodation Request',
description: 'Label for button that links to the accessibility accomodation requests page',
},
trademarkMessage: {
id: 'authoring.footer.trademark.message',
defaultMessage: 'edX and Open edX, and the edX and Open edX logos are registered trademarks of',
description: 'Message about the use of logos and names edX and Open edX',
},
});
export default messages;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -1,65 +0,0 @@
#!/usr/bin/env node
/**
* See the Makefile for how the required hash file is downloaded from Transifex.
*/
// NOTE: This script is called from Jenkins using devDependencies, so eslint is being
// disabled so it doesn't force you to make these real dependencies.
const fs = require('fs'); // eslint-disable-line import/no-extraneous-dependencies
const glob = require('glob'); // eslint-disable-line import/no-extraneous-dependencies
const path = require('path'); // eslint-disable-line import/no-extraneous-dependencies
// Expected input: a directory, possibly containing subdirectories, with .json files. Each .json
// file is an array of translation triplets (id, description, defaultMessage).
function gatherJson(dir) {
const ret = [];
const files = glob.sync(`${dir}/**/*.json`);
files.forEach((filename) => {
const messages = JSON.parse(fs.readFileSync(filename));
ret.push(...messages);
});
return ret;
}
// the hash file returns ids whose periods are "escaped" (sort of), like this:
// "key": "profile\\.sociallinks\\.social\\.links"
// so our regular messageIds won't match them out of the box
function escapeDots(messageId) {
return messageId.replace(/\./g, '\\.');
}
const jsonDir = process.argv[2];
const messageObjects = gatherJson(jsonDir);
if (process.argv[3] === '--comments') { // prepare to handle the translator notes
const loggingPrefix = path.basename(`${__filename}`); // the name of this JS file
const bashScriptsPath = './node_modules/reactifex/bash_scripts';
const hashFile = `${bashScriptsPath}/hashmap.json`;
process.stdout.write(`${loggingPrefix}: reading hash file ${hashFile}\n`);
const messageInfo = JSON.parse(fs.readFileSync(hashFile));
const outputFile = `${bashScriptsPath}/hashed_data.txt`;
process.stdout.write(`${loggingPrefix}: writing to output file ${outputFile}\n`);
fs.writeFileSync(outputFile, '');
messageObjects.forEach((message) => {
const transifexFormatId = escapeDots(message.id);
const info = messageInfo.find(mi => mi.key === transifexFormatId);
if (info) {
fs.appendFileSync(outputFile, `${info.string_hash}|${message.description}\n`);
} else {
process.stdout.write(`${loggingPrefix}: string ${message.id} does not yet exist on transifex!\n`);
}
});
} else {
const output = {};
messageObjects.forEach((message) => {
output[message.id] = message.defaultMessage;
});
fs.writeFileSync(process.argv[3], JSON.stringify(output, null, 2));
}

1
src/i18n/index.js Normal file
View File

@@ -0,0 +1 @@
export default {};

View File

@@ -1,39 +0,0 @@
{
"footer.site-footer.link.business": "{siteName} for Business",
"footer.site-footer.link.about": "About",
"footer.site-footer.link.affiliates": "Affiliates",
"footer.site-footer.link.open-source": "Open {siteName}",
"footer.site-footer.link.careers": "Careers",
"footer.site-footer.link.news": "News",
"footer.site-footer.link.header.legal": "Legal",
"footer.site-footer.link.terms-of-service": "Terms of Service & Honor Code",
"footer.site-footer.link.privacy": "Privacy Policy",
"footer.site-footer.link.accessibility": "Accessibility Policy",
"footer.site-footer.link.trademark": "Trademark Policy",
"footer.site-footer.link.sitemap": "Sitemap",
"footer.site-footer.link.header.connect": "Connect",
"footer.site-footer.link.blog": "Blog",
"footer.site-footer.link.contact-us": "Contact Us",
"footer.site-footer.link.help-center": "Help Center",
"footer.site-footer.link.media-kit": "Media Kit",
"footer.site-footer.link.donate": "Donate",
"footer.site-footer.copyright-text": "{copyrightSymbol} {startDate}{endDate} {siteName} Inc.",
"footer.site-footer.trademark-text": "EdX, Open edX, and MicroMasters are registered trademarks of edX Inc. | {icpLicense}",
"footer.site-footer.site-logo.alt-text": "{siteName} logo",
"footer.site-footer.site-logo.aria-label": "{siteName} Home",
"footer.site-footer.facebook.title": "Facebook",
"footer.site-footer.facebook.screen-reader-text": "Like {siteName} on Facebook",
"footer.site-footer.twitter.title": "Twitter",
"footer.site-footer.twitter.screen-reader-text": "Follow {siteName} on Twitter",
"footer.site-footer.youtube.title": "Youtube",
"footer.site-footer.youtube.screen-reader-text": "Subscribe to the {siteName} YouTube channel",
"footer.site-footer.linkedin.title": "LinkedIn",
"footer.site-footer.linkedin.screen-reader-text": "Follow {siteName} on LinkedIn",
"footer.site-footer.google-plus.title": "Google+",
"footer.site-footer.google-plus.screen-reader-text": "Follow {siteName} on Google+",
"footer.site-footer.reddit.title": "Reddit",
"footer.site-footer.reddit.screen-reader-text": "Subscribe to the {siteName} subreddit",
"footer.site-footer.apple-app-store.alt-text": "Download the {siteName} mobile app from the Apple App Store",
"footer.site-footer.google-play.alt-text": "Download the {siteName} mobile app from Google Play",
"footer.site-footer.footer.aria-label": "Page Footer"
}

View File

@@ -1,39 +0,0 @@
{
"footer.site-footer.link.business": "{siteName} for Business",
"footer.site-footer.link.about": "About",
"footer.site-footer.link.affiliates": "Affiliates",
"footer.site-footer.link.open-source": "Open {siteName}",
"footer.site-footer.link.careers": "Careers",
"footer.site-footer.link.news": "News",
"footer.site-footer.link.header.legal": "Legal",
"footer.site-footer.link.terms-of-service": "Terms of Service & Honor Code",
"footer.site-footer.link.privacy": "Privacy Policy",
"footer.site-footer.link.accessibility": "Accessibility Policy",
"footer.site-footer.link.trademark": "Trademark Policy",
"footer.site-footer.link.sitemap": "Sitemap",
"footer.site-footer.link.header.connect": "Connect",
"footer.site-footer.link.blog": "Blog",
"footer.site-footer.link.contact-us": "Contact Us",
"footer.site-footer.link.help-center": "Help Center",
"footer.site-footer.link.media-kit": "Media Kit",
"footer.site-footer.link.donate": "Donate",
"footer.site-footer.copyright-text": "{copyrightSymbol} {startDate}{endDate} {siteName} Inc.",
"footer.site-footer.trademark-text": "EdX, Open edX, and MicroMasters are registered trademarks of edX Inc. | {icpLicense}",
"footer.site-footer.site-logo.alt-text": "{siteName} logo",
"footer.site-footer.site-logo.aria-label": "{siteName} Home",
"footer.site-footer.facebook.title": "Facebook",
"footer.site-footer.facebook.screen-reader-text": "Like {siteName} on Facebook",
"footer.site-footer.twitter.title": "Twitter",
"footer.site-footer.twitter.screen-reader-text": "Follow {siteName} on Twitter",
"footer.site-footer.youtube.title": "Youtube",
"footer.site-footer.youtube.screen-reader-text": "Subscribe to the {siteName} YouTube channel",
"footer.site-footer.linkedin.title": "LinkedIn",
"footer.site-footer.linkedin.screen-reader-text": "Follow {siteName} on LinkedIn",
"footer.site-footer.google-plus.title": "Google+",
"footer.site-footer.google-plus.screen-reader-text": "Follow {siteName} on Google+",
"footer.site-footer.reddit.title": "Reddit",
"footer.site-footer.reddit.screen-reader-text": "Subscribe to the {siteName} subreddit",
"footer.site-footer.apple-app-store.alt-text": "Download the {siteName} mobile app from the Apple App Store",
"footer.site-footer.google-play.alt-text": "Download the {siteName} mobile app from Google Play",
"footer.site-footer.footer.aria-label": "Page Footer"
}

View File

@@ -1,39 +0,0 @@
{
"footer.site-footer.link.business": "{siteName} for Business",
"footer.site-footer.link.about": "About",
"footer.site-footer.link.affiliates": "Affiliates",
"footer.site-footer.link.open-source": "Open {siteName}",
"footer.site-footer.link.careers": "Careers",
"footer.site-footer.link.news": "News",
"footer.site-footer.link.header.legal": "Legal",
"footer.site-footer.link.terms-of-service": "Terms of Service & Honor Code",
"footer.site-footer.link.privacy": "Privacy Policy",
"footer.site-footer.link.accessibility": "Accessibility Policy",
"footer.site-footer.link.trademark": "Trademark Policy",
"footer.site-footer.link.sitemap": "Sitemap",
"footer.site-footer.link.header.connect": "Connect",
"footer.site-footer.link.blog": "Blog",
"footer.site-footer.link.contact-us": "Contact Us",
"footer.site-footer.link.help-center": "Help Center",
"footer.site-footer.link.media-kit": "Media Kit",
"footer.site-footer.link.donate": "Donate",
"footer.site-footer.copyright-text": "{copyrightSymbol} {startDate}{endDate} {siteName} Inc.",
"footer.site-footer.trademark-text": "EdX, Open edX, and MicroMasters are registered trademarks of edX Inc. | {icpLicense}",
"footer.site-footer.site-logo.alt-text": "{siteName} logo",
"footer.site-footer.site-logo.aria-label": "{siteName} Home",
"footer.site-footer.facebook.title": "Facebook",
"footer.site-footer.facebook.screen-reader-text": "Like {siteName} on Facebook",
"footer.site-footer.twitter.title": "Twitter",
"footer.site-footer.twitter.screen-reader-text": "Follow {siteName} on Twitter",
"footer.site-footer.youtube.title": "Youtube",
"footer.site-footer.youtube.screen-reader-text": "Subscribe to the {siteName} YouTube channel",
"footer.site-footer.linkedin.title": "LinkedIn",
"footer.site-footer.linkedin.screen-reader-text": "Follow {siteName} on LinkedIn",
"footer.site-footer.google-plus.title": "Google+",
"footer.site-footer.google-plus.screen-reader-text": "Follow {siteName} on Google+",
"footer.site-footer.reddit.title": "Reddit",
"footer.site-footer.reddit.screen-reader-text": "Subscribe to the {siteName} subreddit",
"footer.site-footer.apple-app-store.alt-text": "Download the {siteName} mobile app from the Apple App Store",
"footer.site-footer.google-play.alt-text": "Download the {siteName} mobile app from Google Play",
"footer.site-footer.footer.aria-label": "Page Footer"
}

View File

@@ -1,39 +0,0 @@
{
"footer.site-footer.link.business": "商用{siteName} ",
"footer.site-footer.link.about": "关于",
"footer.site-footer.link.affiliates": "附属机构",
"footer.site-footer.link.open-source": "打开{siteName}",
"footer.site-footer.link.careers": "招才纳贤",
"footer.site-footer.link.news": "新闻",
"footer.site-footer.link.header.legal": "法律条款",
"footer.site-footer.link.terms-of-service": "服务条款 & 荣誉准则",
"footer.site-footer.link.privacy": "隐私政策",
"footer.site-footer.link.accessibility": "可访问策略",
"footer.site-footer.link.trademark": "商标政策",
"footer.site-footer.link.sitemap": "网站导航",
"footer.site-footer.link.header.connect": "连接",
"footer.site-footer.link.blog": "博客",
"footer.site-footer.link.contact-us": "联系我们",
"footer.site-footer.link.help-center": "帮助中心",
"footer.site-footer.link.media-kit": "多媒体工具箱",
"footer.site-footer.link.donate": "捐献",
"footer.site-footer.copyright-text": "{copyrightSymbol} {startDate}{endDate} {siteName} Inc.",
"footer.site-footer.trademark-text": "EdX, Open edX, and MicroMasters are registered trademarks of edX Inc. | {icpLicense}",
"footer.site-footer.site-logo.alt-text": "{siteName} logo",
"footer.site-footer.site-logo.aria-label": "{siteName} 主页",
"footer.site-footer.facebook.title": "脸书",
"footer.site-footer.facebook.screen-reader-text": "在Facebook上为 {siteName}点赞",
"footer.site-footer.twitter.title": "推特",
"footer.site-footer.twitter.screen-reader-text": "在Twitter上关注 {siteName}",
"footer.site-footer.youtube.title": "Youtube",
"footer.site-footer.youtube.screen-reader-text": "订阅{siteName} YouTube频道",
"footer.site-footer.linkedin.title": "LinkedIn",
"footer.site-footer.linkedin.screen-reader-text": "在LinkedIn上关注{siteName}",
"footer.site-footer.google-plus.title": "Google+",
"footer.site-footer.google-plus.screen-reader-text": "在Google+上关注{siteName} ",
"footer.site-footer.reddit.title": "Reddit",
"footer.site-footer.reddit.screen-reader-text": "订阅{siteName} subreddit",
"footer.site-footer.apple-app-store.alt-text": "从Apple App Store下载 {siteName} 的移动客户端",
"footer.site-footer.google-play.alt-text": "从Google Play下载 {siteName} 的移动客户端",
"footer.site-footer.footer.aria-label": "页脚"
}

8
src/index.js Normal file
View File

@@ -0,0 +1,8 @@
import Footer, { EVENT_NAMES } from './components/Footer';
import messages from './i18n/index';
import StudioFooter from './components/studio-footer';
export default Footer;
export {
messages, EVENT_NAMES, StudioFooter,
};

View File

@@ -1,102 +0,0 @@
import React from 'react';
import { render } from 'react-dom';
import { IntlProvider } from '@edx/frontend-i18n';
/* eslint-disable import/no-extraneous-dependencies */
import {
faFacebookSquare,
faTwitterSquare,
faYoutubeSquare,
faLinkedin,
faGooglePlusSquare,
faRedditSquare,
} from '@fortawesome/free-brands-svg-icons';
import { faLanguage } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
/* eslint-enable import/no-extraneous-dependencies */
import SiteFooter from './lib';
import './index.scss';
import FooterLogo from './edx-footer.png';
const socialLinks = [
{
title: 'Facebook',
url: 'https://www.facebook.com',
icon: <FontAwesomeIcon icon={faFacebookSquare} className="social-icon" size="2x" />,
screenReaderText: 'Like edX on Facebook',
},
{
title: 'Twitter',
url: 'https://www.twitter.com',
icon: <FontAwesomeIcon icon={faTwitterSquare} className="social-icon" size="2x" />,
screenReaderText: 'Follow edX on Twitter',
},
{
title: 'Youtube',
url: 'https://www.youtube.com',
icon: <FontAwesomeIcon icon={faYoutubeSquare} className="social-icon" size="2x" />,
screenReaderText: 'Subscribe to the edX YouTube channel',
},
{
title: 'LinkedIn',
url: 'https://www.linkedin.com',
icon: <FontAwesomeIcon icon={faLinkedin} className="social-icon" size="2x" />,
screenReaderText: 'Follow edX on LinkedIn',
},
{
title: 'Google+',
url: 'https://plus.google.com',
icon: <FontAwesomeIcon icon={faGooglePlusSquare} className="social-icon" size="2x" />,
screenReaderText: 'Follow edX on Google+',
},
{
title: 'Reddit',
url: 'https://reddit.com',
icon: <FontAwesomeIcon icon={faRedditSquare} className="social-icon" size="2x" />,
screenReaderText: 'Subscribe to the edX subreddit',
},
];
const App = () => (
<IntlProvider locale="en">
<SiteFooter
siteName="edX"
siteLogo={FooterLogo}
marketingSiteBaseUrl="https://www.example.com"
enterpriseMarketingLink={{
url: 'https://business.edx.org',
queryParams: { utm_test: 'utm_test_value' },
}}
supportUrl="https://www.example.com/support"
contactUrl="https://www.example.com/contact"
openSourceUrl="https://www.example.com/open"
termsOfServiceUrl="https://www.example.com/terms-of-service"
privacyPolicyUrl="https://www.example.com/privacy-policy"
appleAppStoreUrl="https://store.apple.com"
googlePlayUrl="https://play.google.com"
handleAllTrackEvents={() => {}}
socialLinks={socialLinks}
supportedLanguages={[
{
label: 'English',
value: 'en',
}, {
label: 'español',
value: 'es-419',
},
]}
languageForm={{
activeLanguage: 'en',
screenReaderLabel: 'Choose Language',
submitLabel: 'Apply',
icon: <FontAwesomeIcon icon={faLanguage} size="2x" className="text-primary" />,
onLanguageSelected: () => {},
}}
/>
</IntlProvider>
);
render(<App />, document.getElementById('root'));

View File

@@ -1,4 +0,0 @@
@import "~@edx/edx-bootstrap/sass/edx/theme";
@import "~bootstrap/scss/bootstrap";
@import './lib/scss/_site-footer.scss';

View File

@@ -1,91 +0,0 @@
import { defineMessages } from '@edx/frontend-i18n';
const messages = defineMessages({
'footer.site-footer.site-logo.alt-text': {
id: 'footer.site-footer.site-logo.alt-text',
defaultMessage: '{siteName} logo',
description: 'The alt description of the site logo',
},
'footer.site-footer.site-logo.aria-label': {
id: 'footer.site-footer.site-logo.aria-label',
defaultMessage: '{siteName} Home',
description: 'Aria label for the site logo which goes to the marketing site',
},
'footer.site-footer.facebook.title': {
id: 'footer.site-footer.facebook.title',
defaultMessage: 'Facebook',
description: 'Facebook button title',
},
'footer.site-footer.facebook.screen-reader-text': {
id: 'footer.site-footer.facebook.screen-reader-text',
defaultMessage: 'Like {siteName} on Facebook',
description: 'Facebook button screen reader text',
},
'footer.site-footer.twitter.title': {
id: 'footer.site-footer.twitter.title',
defaultMessage: 'Twitter',
description: 'Twitter button title',
},
'footer.site-footer.twitter.screen-reader-text': {
id: 'footer.site-footer.twitter.screen-reader-text',
defaultMessage: 'Follow {siteName} on Twitter',
description: 'Twitter button screen reader text',
},
'footer.site-footer.youtube.title': {
id: 'footer.site-footer.youtube.title',
defaultMessage: 'Youtube',
description: 'Youtube button title',
},
'footer.site-footer.youtube.screen-reader-text': {
id: 'footer.site-footer.youtube.screen-reader-text',
defaultMessage: 'Subscribe to the {siteName} YouTube channel',
description: 'Youtube button screen reader text',
},
'footer.site-footer.linkedin.title': {
id: 'footer.site-footer.linkedin.title',
defaultMessage: 'LinkedIn',
description: 'LinkedIn button title',
},
'footer.site-footer.linkedin.screen-reader-text': {
id: 'footer.site-footer.linkedin.screen-reader-text',
defaultMessage: 'Follow {siteName} on LinkedIn',
description: 'LinkedIn button screen reader text',
},
'footer.site-footer.google-plus.title': {
id: 'footer.site-footer.google-plus.title',
defaultMessage: 'Google+',
description: 'Google+ button title',
},
'footer.site-footer.google-plus.screen-reader-text': {
id: 'footer.site-footer.google-plus.screen-reader-text',
defaultMessage: 'Follow {siteName} on Google+',
description: 'Google+ button screen reader text',
},
'footer.site-footer.reddit.title': {
id: 'footer.site-footer.reddit.title',
defaultMessage: 'Reddit',
description: 'Reddit button title',
},
'footer.site-footer.reddit.screen-reader-text': {
id: 'footer.site-footer.reddit.screen-reader-text',
defaultMessage: 'Subscribe to the {siteName} subreddit',
description: 'Reddit button screen reader text',
},
'footer.site-footer.apple-app-store.alt-text': {
id: 'footer.site-footer.apple-app-store.alt-text',
defaultMessage: 'Download the {siteName} mobile app from the Apple App Store',
description: 'Apple App Store button alt description',
},
'footer.site-footer.google-play.alt-text': {
id: 'footer.site-footer.google-play.alt-text',
defaultMessage: 'Download the {siteName} mobile app from Google Play',
description: 'Google Play button alt description',
},
'footer.site-footer.footer.aria-label': {
id: 'footer.site-footer.footer.aria-label',
defaultMessage: 'Page Footer',
description: 'Aria label for the footer',
},
});
export default messages;

View File

@@ -1,233 +0,0 @@
import React from 'react';
import renderer from 'react-test-renderer';
import { mount } from 'enzyme';
import { IntlProvider } from '@edx/frontend-i18n';
import {
faFacebookSquare,
faTwitterSquare,
faYoutubeSquare,
faLinkedin,
faGooglePlusSquare,
faRedditSquare,
} from '@fortawesome/free-brands-svg-icons';
import { faLanguage } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import FooterLogo from '../../../edx-footer.png';
import SiteFooter, { EVENT_NAMES } from './index';
const socialLinks = [
{
title: 'Facebook',
url: 'https://www.facebook.com',
icon: <FontAwesomeIcon icon={faFacebookSquare} className="social-icon" size="2x" />,
screenReaderText: 'Like edX on Facebook',
},
{
title: 'Twitter',
url: 'https://www.twitter.com',
icon: <FontAwesomeIcon icon={faTwitterSquare} className="social-icon" size="2x" />,
screenReaderText: 'Follow edX on Twitter',
},
{
title: 'Youtube',
url: 'https://www.youtube.com',
icon: <FontAwesomeIcon icon={faYoutubeSquare} className="social-icon" size="2x" />,
screenReaderText: 'Subscribe to the edX YouTube channel',
},
{
title: 'LinkedIn',
url: 'https://www.linkedin.com',
icon: <FontAwesomeIcon icon={faLinkedin} className="social-icon" size="2x" />,
screenReaderText: 'Follow edX on LinkedIn',
},
{
title: 'Google+',
url: 'https://plus.google.com',
icon: <FontAwesomeIcon icon={faGooglePlusSquare} className="social-icon" size="2x" />,
screenReaderText: 'Follow edX on Google+',
},
{
title: 'Reddit',
url: 'https://reddit.com',
icon: <FontAwesomeIcon icon={faRedditSquare} className="social-icon" size="2x" />,
screenReaderText: 'Subscribe to the edX subreddit',
},
];
const supportedLanguages = [
{
label: 'English',
value: 'en',
}, {
label: 'español',
value: 'es-419',
},
];
const languageForm = {
activeLanguage: 'en',
screenReaderLabel: 'Choose Language',
submitLabel: 'Apply',
icon: <FontAwesomeIcon icon={faLanguage} size="2x" className="text-primary" />,
onLanguageSelected: () => {},
};
const completeSiteFooterComponent = mockHandleAllTrackEvents =>
(
<IntlProvider locale="en">
<SiteFooter
siteName="example"
siteLogo={FooterLogo}
marketingSiteBaseUrl="https://www.example.com"
supportUrl="https://www.example.com/support"
contactUrl="https://www.example.com/contact"
openSourceUrl="https://www.example.com/open"
termsOfServiceUrl="https://www.example.com/terms-of-service"
privacyPolicyUrl="https://www.example.com/privacy-policy"
socialLinks={socialLinks}
appleAppStoreUrl="https://store.apple.com"
googlePlayUrl="https://play.google.com"
handleAllTrackEvents={mockHandleAllTrackEvents}
supportedLanguages={supportedLanguages}
languageForm={languageForm}
enterpriseMarketingLink={{
url: 'https://business.edx.org',
queryParams: { utm_test: 'utm_test_value' },
}}
/>
</IntlProvider>
);
describe('<SiteFooter />', () => {
describe('renders correctly', () => {
it('renders with social and mobile links', () => {
const mockHandleAllTrackEvents = jest.fn();
const tree = renderer
.create(completeSiteFooterComponent(mockHandleAllTrackEvents))
.toJSON();
expect(tree).toMatchSnapshot();
});
it('does not render social links', () => {
const tree = renderer
.create((
<IntlProvider locale="en">
<SiteFooter
siteName="example"
siteLogo={FooterLogo}
marketingSiteBaseUrl="https://www.example.com"
supportUrl="https://www.example.com/support"
contactUrl="https://www.example.com/contact"
openSourceUrl="https://www.example.com/open"
termsOfServiceUrl="https://www.example.com/terms-of-service"
privacyPolicyUrl="https://www.example.com/privacy-policy"
appleAppStoreUrl="https://store.apple.com"
googlePlayUrl="https://play.google.com"
supportedLanguages={supportedLanguages}
languageForm={languageForm}
handleAllTrackEvents={jest.fn()}
enterpriseMarketingLink={{
url: 'https://business.edx.org',
queryParams: { utm_test: 'utm_test_value' },
}}
/>
</IntlProvider>
)).toJSON();
expect(tree).toMatchSnapshot();
});
it('does not render mobile links', () => {
const tree = renderer
.create((
<IntlProvider locale="en">
<SiteFooter
siteName="example"
siteLogo={FooterLogo}
marketingSiteBaseUrl="https://www.example.com"
supportUrl="https://www.example.com/support"
contactUrl="https://www.example.com/contact"
openSourceUrl="https://www.example.com/open"
termsOfServiceUrl="https://www.example.com/terms-of-service"
privacyPolicyUrl="https://www.example.com/privacy-policy"
socialLinks={socialLinks}
appleAppStoreUrl="https://store.apple.com"
googlePlayUrl="https://play.google.com"
supportedLanguages={supportedLanguages}
languageForm={languageForm}
handleAllTrackEvents={jest.fn()}
showMobileLinks={false}
/>
</IntlProvider>
)).toJSON();
expect(tree).toMatchSnapshot();
});
it('does not render language selector', () => {
const tree = renderer
.create((
<IntlProvider locale="en">
<SiteFooter
siteName="example"
siteLogo={FooterLogo}
marketingSiteBaseUrl="https://www.example.com"
supportUrl="https://www.example.com/support"
contactUrl="https://www.example.com/contact"
openSourceUrl="https://www.example.com/open"
termsOfServiceUrl="https://www.example.com/terms-of-service"
privacyPolicyUrl="https://www.example.com/privacy-policy"
appleAppStoreUrl="https://store.apple.com"
googlePlayUrl="https://play.google.com"
handleAllTrackEvents={jest.fn()}
/>
</IntlProvider>
)).toJSON();
expect(tree).toMatchSnapshot();
});
it('does not render business links', () => {
const tree = renderer
.create((
<IntlProvider locale="en">
<SiteFooter
siteName="example"
siteLogo={FooterLogo}
marketingSiteBaseUrl="https://www.example.com"
supportUrl="https://www.example.com/support"
contactUrl="https://www.example.com/contact"
openSourceUrl="https://www.example.com/open"
termsOfServiceUrl="https://www.example.com/terms-of-service"
privacyPolicyUrl="https://www.example.com/privacy-policy"
appleAppStoreUrl="https://store.apple.com"
googlePlayUrl="https://play.google.com"
handleAllTrackEvents={jest.fn()}
/>
</IntlProvider>
)).toJSON();
expect(tree).toMatchSnapshot();
});
});
describe('handles analytics', () => {
it('calls handleAllTrackEvents prop when external links clicked', () => {
const mockHandleAllTrackEvents = jest.fn();
const footer = mount((completeSiteFooterComponent(mockHandleAllTrackEvents)));
const externalLinks = footer.find("a[target='_blank']");
expect(externalLinks).toHaveLength(8);
externalLinks.forEach((externalLink) => {
const callIndex = mockHandleAllTrackEvents.mock.calls.length;
externalLink.simulate('click');
expect(mockHandleAllTrackEvents.mock.calls[callIndex]).toEqual([
EVENT_NAMES.FOOTER_LINK,
{
category: 'outbound_link',
label: externalLink.prop('href'),
},
]);
});
});
});
});

View File

@@ -1,1803 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`<SiteFooter /> renders correctly does not render business links 1`] = `
<footer
aria-label="Page Footer"
className="footer d-flex justify-content-center border-top py-3 px-4"
role="contentinfo"
>
<div
className="max-width-1180 d-grid"
>
<div
className="area-1"
>
<a
aria-label="example Home"
href="https://www.example.com/"
onClick={[Function]}
target="_self"
>
<img
alt="example logo"
src="test-file-stub"
/>
</a>
</div>
<div
className="area-2"
>
<h2>
example
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/about-us"
>
<span>
About
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/affiliate-program"
>
<span>
Affiliates
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/open"
>
<span>
Open example
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/careers"
>
<span>
Careers
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/news-announcements"
>
<span>
News
</span>
</a>
</li>
</ul>
</div>
<div
className="area-3"
>
<h2>
<span>
Legal
</span>
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/terms-of-service"
>
<span>
Terms of Service & Honor Code
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/privacy-policy"
>
<span>
Privacy Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/accessibility"
>
<span>
Accessibility Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/trademarks"
>
<span>
Trademark Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/sitemap"
>
<span>
Sitemap
</span>
</a>
</li>
</ul>
</div>
<div
className="area-4"
>
<h2>
<span>
Connect
</span>
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/blog"
>
<span>
Blog
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/contact"
>
<span>
Contact Us
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/support"
>
<span>
Help Center
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/media-kit"
>
<span>
Media Kit
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/donate"
>
<span>
Donate
</span>
</a>
</li>
</ul>
</div>
<div
className="area-5"
>
<ul
className="d-flex flex-row justify-content-between list-unstyled max-width-264 p-0 mb-5"
>
<li>
<a
href="https://store.apple.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
>
<img
alt="Download the example mobile app from the Apple App Store"
className="max-height-39"
src="https://prod-edxapp.edx-cdn.org/static/images/app/app_store_badge_135x40.d0558d910630.svg"
/>
</a>
</li>
<li>
<a
href="https://play.google.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
>
<img
alt="Download the example mobile app from Google Play"
className="max-height-39"
src="https://prod-edxapp.edx-cdn.org/static/images/app/google_play_badge_45.6ea466e328da.png"
/>
</a>
</li>
</ul>
<p>
<span>
© 20122019 example Inc.
</span>
<br />
<span>
EdX, Open edX, and MicroMasters are registered trademarks of edX Inc. | 深圳市恒宇博科技有限公司
<a
href="http://www.beian.miit.gov.cn"
>
粤ICP备17044299号-2
</a>
</span>
</p>
</div>
</div>
</footer>
`;
exports[`<SiteFooter /> renders correctly does not render language selector 1`] = `
<footer
aria-label="Page Footer"
className="footer d-flex justify-content-center border-top py-3 px-4"
role="contentinfo"
>
<div
className="max-width-1180 d-grid"
>
<div
className="area-1"
>
<a
aria-label="example Home"
href="https://www.example.com/"
onClick={[Function]}
target="_self"
>
<img
alt="example logo"
src="test-file-stub"
/>
</a>
</div>
<div
className="area-2"
>
<h2>
example
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/about-us"
>
<span>
About
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/affiliate-program"
>
<span>
Affiliates
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/open"
>
<span>
Open example
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/careers"
>
<span>
Careers
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/news-announcements"
>
<span>
News
</span>
</a>
</li>
</ul>
</div>
<div
className="area-3"
>
<h2>
<span>
Legal
</span>
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/terms-of-service"
>
<span>
Terms of Service & Honor Code
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/privacy-policy"
>
<span>
Privacy Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/accessibility"
>
<span>
Accessibility Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/trademarks"
>
<span>
Trademark Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/sitemap"
>
<span>
Sitemap
</span>
</a>
</li>
</ul>
</div>
<div
className="area-4"
>
<h2>
<span>
Connect
</span>
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/blog"
>
<span>
Blog
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/contact"
>
<span>
Contact Us
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/support"
>
<span>
Help Center
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/media-kit"
>
<span>
Media Kit
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/donate"
>
<span>
Donate
</span>
</a>
</li>
</ul>
</div>
<div
className="area-5"
>
<ul
className="d-flex flex-row justify-content-between list-unstyled max-width-264 p-0 mb-5"
>
<li>
<a
href="https://store.apple.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
>
<img
alt="Download the example mobile app from the Apple App Store"
className="max-height-39"
src="https://prod-edxapp.edx-cdn.org/static/images/app/app_store_badge_135x40.d0558d910630.svg"
/>
</a>
</li>
<li>
<a
href="https://play.google.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
>
<img
alt="Download the example mobile app from Google Play"
className="max-height-39"
src="https://prod-edxapp.edx-cdn.org/static/images/app/google_play_badge_45.6ea466e328da.png"
/>
</a>
</li>
</ul>
<p>
<span>
© 20122019 example Inc.
</span>
<br />
<span>
EdX, Open edX, and MicroMasters are registered trademarks of edX Inc. | 深圳市恒宇博科技有限公司
<a
href="http://www.beian.miit.gov.cn"
>
粤ICP备17044299号-2
</a>
</span>
</p>
</div>
</div>
</footer>
`;
exports[`<SiteFooter /> renders correctly does not render mobile links 1`] = `
<footer
aria-label="Page Footer"
className="footer d-flex justify-content-center border-top py-3 px-4"
role="contentinfo"
>
<div
className="max-width-1180 d-grid"
>
<div
className="area-1"
>
<a
aria-label="example Home"
href="https://www.example.com/"
onClick={[Function]}
target="_self"
>
<img
alt="example logo"
src="test-file-stub"
/>
</a>
<div
className="i18n d-flex mt-2"
>
<form
className="d-flex align-items-start"
onSubmit={[Function]}
>
<label
htmlFor="site-footer-language-select"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-language fa-w-20 fa-2x text-primary"
data-icon="language"
data-prefix="fas"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 640 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M152.1 236.2c-3.5-12.1-7.8-33.2-7.8-33.2h-.5s-4.3 21.1-7.8 33.2l-11.1 37.5H163zM616 96H336v320h280c13.3 0 24-10.7 24-24V120c0-13.3-10.7-24-24-24zm-24 120c0 6.6-5.4 12-12 12h-11.4c-6.9 23.6-21.7 47.4-42.7 69.9 8.4 6.4 17.1 12.5 26.1 18 5.5 3.4 7.3 10.5 4.1 16.2l-7.9 13.9c-3.4 5.9-10.9 7.8-16.7 4.3-12.6-7.8-24.5-16.1-35.4-24.9-10.9 8.7-22.7 17.1-35.4 24.9-5.8 3.5-13.3 1.6-16.7-4.3l-7.9-13.9c-3.2-5.6-1.4-12.8 4.2-16.2 9.3-5.7 18-11.7 26.1-18-7.9-8.4-14.9-17-21-25.7-4-5.7-2.2-13.6 3.7-17.1l6.5-3.9 7.3-4.3c5.4-3.2 12.4-1.7 16 3.4 5 7 10.8 14 17.4 20.9 13.5-14.2 23.8-28.9 30-43.2H412c-6.6 0-12-5.4-12-12v-16c0-6.6 5.4-12 12-12h64v-16c0-6.6 5.4-12 12-12h16c6.6 0 12 5.4 12 12v16h64c6.6 0 12 5.4 12 12zM0 120v272c0 13.3 10.7 24 24 24h280V96H24c-13.3 0-24 10.7-24 24zm58.9 216.1L116.4 167c1.7-4.9 6.2-8.1 11.4-8.1h32.5c5.1 0 9.7 3.3 11.4 8.1l57.5 169.1c2.6 7.8-3.1 15.9-11.4 15.9h-22.9a12 12 0 0 1-11.5-8.6l-9.4-31.9h-60.2l-9.1 31.8c-1.5 5.1-6.2 8.7-11.5 8.7H70.3c-8.2 0-14-8.1-11.4-15.9z"
fill="currentColor"
style={Object {}}
/>
</svg>
<div
className="sr-only"
>
Choose Language
</div>
</label>
<select
className="mx-2 mt-1"
defaultValue="en"
id="site-footer-language-select"
name="site-footer-language-select"
>
<option
value="en"
>
English
</option>
<option
value="es-419"
>
español
</option>
</select>
<button
className="mt-1"
type="submit"
>
Apply
</button>
</form>
</div>
</div>
<div
className="area-2"
>
<h2>
example
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/about-us"
>
<span>
About
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/affiliate-program"
>
<span>
Affiliates
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/open"
>
<span>
Open example
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/careers"
>
<span>
Careers
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/news-announcements"
>
<span>
News
</span>
</a>
</li>
</ul>
</div>
<div
className="area-3"
>
<h2>
<span>
Legal
</span>
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/terms-of-service"
>
<span>
Terms of Service & Honor Code
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/privacy-policy"
>
<span>
Privacy Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/accessibility"
>
<span>
Accessibility Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/trademarks"
>
<span>
Trademark Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/sitemap"
>
<span>
Sitemap
</span>
</a>
</li>
</ul>
</div>
<div
className="area-4"
>
<h2>
<span>
Connect
</span>
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/blog"
>
<span>
Blog
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/contact"
>
<span>
Contact Us
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/support"
>
<span>
Help Center
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/media-kit"
>
<span>
Media Kit
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/donate"
>
<span>
Donate
</span>
</a>
</li>
</ul>
</div>
<div
className="area-5"
>
<ul
className="d-flex flex-row justify-content-between list-unstyled max-width-222 p-0 mb-4"
>
<li>
<a
href="https://www.facebook.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
title="Facebook"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-facebook-square fa-w-14 fa-2x social-icon"
data-icon="facebook-square"
data-prefix="fab"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M400 32H48A48 48 0 0 0 0 80v352a48 48 0 0 0 48 48h137.25V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.27c-30.81 0-40.42 19.12-40.42 38.73V256h68.78l-11 71.69h-57.78V480H400a48 48 0 0 0 48-48V80a48 48 0 0 0-48-48z"
fill="currentColor"
style={Object {}}
/>
</svg>
<span
className="sr-only"
>
Like edX on Facebook
</span>
</a>
</li>
<li>
<a
href="https://www.twitter.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
title="Twitter"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-twitter-square fa-w-14 fa-2x social-icon"
data-icon="twitter-square"
data-prefix="fab"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-48.9 158.8c.2 2.8.2 5.7.2 8.5 0 86.7-66 186.6-186.6 186.6-37.2 0-71.7-10.8-100.7-29.4 5.3.6 10.4.8 15.8.8 30.7 0 58.9-10.4 81.4-28-28.8-.6-53-19.5-61.3-45.5 10.1 1.5 19.2 1.5 29.6-1.2-30-6.1-52.5-32.5-52.5-64.4v-.8c8.7 4.9 18.9 7.9 29.6 8.3a65.447 65.447 0 0 1-29.2-54.6c0-12.2 3.2-23.4 8.9-33.1 32.3 39.8 80.8 65.8 135.2 68.6-9.3-44.5 24-80.6 64-80.6 18.9 0 35.9 7.9 47.9 20.7 14.8-2.8 29-8.3 41.6-15.8-4.9 15.2-15.2 28-28.8 36.1 13.2-1.4 26-5.1 37.8-10.2-8.9 13.1-20.1 24.7-32.9 34z"
fill="currentColor"
style={Object {}}
/>
</svg>
<span
className="sr-only"
>
Follow edX on Twitter
</span>
</a>
</li>
<li>
<a
href="https://www.youtube.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
title="Youtube"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-youtube-square fa-w-14 fa-2x social-icon"
data-icon="youtube-square"
data-prefix="fab"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M186.8 202.1l95.2 54.1-95.2 54.1V202.1zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-42 176.3s0-59.6-7.6-88.2c-4.2-15.8-16.5-28.2-32.2-32.4C337.9 128 224 128 224 128s-113.9 0-142.2 7.7c-15.7 4.2-28 16.6-32.2 32.4-7.6 28.5-7.6 88.2-7.6 88.2s0 59.6 7.6 88.2c4.2 15.8 16.5 27.7 32.2 31.9C110.1 384 224 384 224 384s113.9 0 142.2-7.7c15.7-4.2 28-16.1 32.2-31.9 7.6-28.5 7.6-88.1 7.6-88.1z"
fill="currentColor"
style={Object {}}
/>
</svg>
<span
className="sr-only"
>
Subscribe to the edX YouTube channel
</span>
</a>
</li>
<li>
<a
href="https://www.linkedin.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
title="LinkedIn"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-linkedin fa-w-14 fa-2x social-icon"
data-icon="linkedin"
data-prefix="fab"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"
fill="currentColor"
style={Object {}}
/>
</svg>
<span
className="sr-only"
>
Follow edX on LinkedIn
</span>
</a>
</li>
<li>
<a
href="https://plus.google.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
title="Google+"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-google-plus-square fa-w-14 fa-2x social-icon"
data-icon="google-plus-square"
data-prefix="fab"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM164 356c-55.3 0-100-44.7-100-100s44.7-100 100-100c27 0 49.5 9.8 67 26.2l-27.1 26.1c-7.4-7.1-20.3-15.4-39.8-15.4-34.1 0-61.9 28.2-61.9 63.2 0 34.9 27.8 63.2 61.9 63.2 39.6 0 54.4-28.5 56.8-43.1H164v-34.4h94.4c1 5 1.6 10.1 1.6 16.6 0 57.1-38.3 97.6-96 97.6zm220-81.8h-29v29h-29.2v-29h-29V245h29v-29H355v29h29v29.2z"
fill="currentColor"
style={Object {}}
/>
</svg>
<span
className="sr-only"
>
Follow edX on Google+
</span>
</a>
</li>
<li>
<a
href="https://reddit.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
title="Reddit"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-reddit-square fa-w-14 fa-2x social-icon"
data-icon="reddit-square"
data-prefix="fab"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M283.2 345.5c2.7 2.7 2.7 6.8 0 9.2-24.5 24.5-93.8 24.6-118.4 0-2.7-2.4-2.7-6.5 0-9.2 2.4-2.4 6.5-2.4 8.9 0 18.7 19.2 81 19.6 100.5 0 2.4-2.3 6.6-2.3 9 0zm-91.3-53.8c0-14.9-11.9-26.8-26.5-26.8-14.9 0-26.8 11.9-26.8 26.8 0 14.6 11.9 26.5 26.8 26.5 14.6 0 26.5-11.9 26.5-26.5zm90.7-26.8c-14.6 0-26.5 11.9-26.5 26.8 0 14.6 11.9 26.5 26.5 26.5 14.9 0 26.8-11.9 26.8-26.5 0-14.9-11.9-26.8-26.8-26.8zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-99.7 140.6c-10.1 0-19 4.2-25.6 10.7-24.1-16.7-56.5-27.4-92.5-28.6l18.7-84.2 59.5 13.4c0 14.6 11.9 26.5 26.5 26.5 14.9 0 26.8-12.2 26.8-26.8 0-14.6-11.9-26.8-26.8-26.8-10.4 0-19.3 6.2-23.8 14.9l-65.7-14.6c-3.3-.9-6.5 1.5-7.4 4.8l-20.5 92.8c-35.7 1.5-67.8 12.2-91.9 28.9-6.5-6.8-15.8-11-25.9-11-37.5 0-49.8 50.4-15.5 67.5-1.2 5.4-1.8 11-1.8 16.7 0 56.5 63.7 102.3 141.9 102.3 78.5 0 142.2-45.8 142.2-102.3 0-5.7-.6-11.6-2.1-17 33.6-17.2 21.2-67.2-16.1-67.2z"
fill="currentColor"
style={Object {}}
/>
</svg>
<span
className="sr-only"
>
Subscribe to the edX subreddit
</span>
</a>
</li>
</ul>
<p>
<span>
© 20122019 example Inc.
</span>
<br />
<span>
EdX, Open edX, and MicroMasters are registered trademarks of edX Inc. | 深圳市恒宇博科技有限公司
<a
href="http://www.beian.miit.gov.cn"
>
粤ICP备17044299号-2
</a>
</span>
</p>
</div>
</div>
</footer>
`;
exports[`<SiteFooter /> renders correctly does not render social links 1`] = `
<footer
aria-label="Page Footer"
className="footer d-flex justify-content-center border-top py-3 px-4"
role="contentinfo"
>
<div
className="max-width-1180 d-grid"
>
<div
className="area-1"
>
<a
aria-label="example Home"
href="https://www.example.com/"
onClick={[Function]}
target="_self"
>
<img
alt="example logo"
src="test-file-stub"
/>
</a>
<div
className="i18n d-flex mt-2"
>
<form
className="d-flex align-items-start"
onSubmit={[Function]}
>
<label
htmlFor="site-footer-language-select"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-language fa-w-20 fa-2x text-primary"
data-icon="language"
data-prefix="fas"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 640 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M152.1 236.2c-3.5-12.1-7.8-33.2-7.8-33.2h-.5s-4.3 21.1-7.8 33.2l-11.1 37.5H163zM616 96H336v320h280c13.3 0 24-10.7 24-24V120c0-13.3-10.7-24-24-24zm-24 120c0 6.6-5.4 12-12 12h-11.4c-6.9 23.6-21.7 47.4-42.7 69.9 8.4 6.4 17.1 12.5 26.1 18 5.5 3.4 7.3 10.5 4.1 16.2l-7.9 13.9c-3.4 5.9-10.9 7.8-16.7 4.3-12.6-7.8-24.5-16.1-35.4-24.9-10.9 8.7-22.7 17.1-35.4 24.9-5.8 3.5-13.3 1.6-16.7-4.3l-7.9-13.9c-3.2-5.6-1.4-12.8 4.2-16.2 9.3-5.7 18-11.7 26.1-18-7.9-8.4-14.9-17-21-25.7-4-5.7-2.2-13.6 3.7-17.1l6.5-3.9 7.3-4.3c5.4-3.2 12.4-1.7 16 3.4 5 7 10.8 14 17.4 20.9 13.5-14.2 23.8-28.9 30-43.2H412c-6.6 0-12-5.4-12-12v-16c0-6.6 5.4-12 12-12h64v-16c0-6.6 5.4-12 12-12h16c6.6 0 12 5.4 12 12v16h64c6.6 0 12 5.4 12 12zM0 120v272c0 13.3 10.7 24 24 24h280V96H24c-13.3 0-24 10.7-24 24zm58.9 216.1L116.4 167c1.7-4.9 6.2-8.1 11.4-8.1h32.5c5.1 0 9.7 3.3 11.4 8.1l57.5 169.1c2.6 7.8-3.1 15.9-11.4 15.9h-22.9a12 12 0 0 1-11.5-8.6l-9.4-31.9h-60.2l-9.1 31.8c-1.5 5.1-6.2 8.7-11.5 8.7H70.3c-8.2 0-14-8.1-11.4-15.9z"
fill="currentColor"
style={Object {}}
/>
</svg>
<div
className="sr-only"
>
Choose Language
</div>
</label>
<select
className="mx-2 mt-1"
defaultValue="en"
id="site-footer-language-select"
name="site-footer-language-select"
>
<option
value="en"
>
English
</option>
<option
value="es-419"
>
español
</option>
</select>
<button
className="mt-1"
type="submit"
>
Apply
</button>
</form>
</div>
</div>
<div
className="area-2"
>
<h2>
example
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/about-us"
>
<span>
About
</span>
</a>
</li>
<li>
<a
href="https://business.edx.org/?utm_test=utm_test_value"
>
<span>
example for Business
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/affiliate-program"
>
<span>
Affiliates
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/open"
>
<span>
Open example
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/careers"
>
<span>
Careers
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/news-announcements"
>
<span>
News
</span>
</a>
</li>
</ul>
</div>
<div
className="area-3"
>
<h2>
<span>
Legal
</span>
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/terms-of-service"
>
<span>
Terms of Service & Honor Code
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/privacy-policy"
>
<span>
Privacy Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/accessibility"
>
<span>
Accessibility Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/trademarks"
>
<span>
Trademark Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/sitemap"
>
<span>
Sitemap
</span>
</a>
</li>
</ul>
</div>
<div
className="area-4"
>
<h2>
<span>
Connect
</span>
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/blog"
>
<span>
Blog
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/contact"
>
<span>
Contact Us
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/support"
>
<span>
Help Center
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/media-kit"
>
<span>
Media Kit
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/donate"
>
<span>
Donate
</span>
</a>
</li>
</ul>
</div>
<div
className="area-5"
>
<ul
className="d-flex flex-row justify-content-between list-unstyled max-width-264 p-0 mb-5"
>
<li>
<a
href="https://store.apple.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
>
<img
alt="Download the example mobile app from the Apple App Store"
className="max-height-39"
src="https://prod-edxapp.edx-cdn.org/static/images/app/app_store_badge_135x40.d0558d910630.svg"
/>
</a>
</li>
<li>
<a
href="https://play.google.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
>
<img
alt="Download the example mobile app from Google Play"
className="max-height-39"
src="https://prod-edxapp.edx-cdn.org/static/images/app/google_play_badge_45.6ea466e328da.png"
/>
</a>
</li>
</ul>
<p>
<span>
© 20122019 example Inc.
</span>
<br />
<span>
EdX, Open edX, and MicroMasters are registered trademarks of edX Inc. | 深圳市恒宇博科技有限公司
<a
href="http://www.beian.miit.gov.cn"
>
粤ICP备17044299号-2
</a>
</span>
</p>
</div>
</div>
</footer>
`;
exports[`<SiteFooter /> renders correctly renders with social and mobile links 1`] = `
<footer
aria-label="Page Footer"
className="footer d-flex justify-content-center border-top py-3 px-4"
role="contentinfo"
>
<div
className="max-width-1180 d-grid"
>
<div
className="area-1"
>
<a
aria-label="example Home"
href="https://www.example.com/"
onClick={[Function]}
target="_self"
>
<img
alt="example logo"
src="test-file-stub"
/>
</a>
<div
className="i18n d-flex mt-2"
>
<form
className="d-flex align-items-start"
onSubmit={[Function]}
>
<label
htmlFor="site-footer-language-select"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-language fa-w-20 fa-2x text-primary"
data-icon="language"
data-prefix="fas"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 640 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M152.1 236.2c-3.5-12.1-7.8-33.2-7.8-33.2h-.5s-4.3 21.1-7.8 33.2l-11.1 37.5H163zM616 96H336v320h280c13.3 0 24-10.7 24-24V120c0-13.3-10.7-24-24-24zm-24 120c0 6.6-5.4 12-12 12h-11.4c-6.9 23.6-21.7 47.4-42.7 69.9 8.4 6.4 17.1 12.5 26.1 18 5.5 3.4 7.3 10.5 4.1 16.2l-7.9 13.9c-3.4 5.9-10.9 7.8-16.7 4.3-12.6-7.8-24.5-16.1-35.4-24.9-10.9 8.7-22.7 17.1-35.4 24.9-5.8 3.5-13.3 1.6-16.7-4.3l-7.9-13.9c-3.2-5.6-1.4-12.8 4.2-16.2 9.3-5.7 18-11.7 26.1-18-7.9-8.4-14.9-17-21-25.7-4-5.7-2.2-13.6 3.7-17.1l6.5-3.9 7.3-4.3c5.4-3.2 12.4-1.7 16 3.4 5 7 10.8 14 17.4 20.9 13.5-14.2 23.8-28.9 30-43.2H412c-6.6 0-12-5.4-12-12v-16c0-6.6 5.4-12 12-12h64v-16c0-6.6 5.4-12 12-12h16c6.6 0 12 5.4 12 12v16h64c6.6 0 12 5.4 12 12zM0 120v272c0 13.3 10.7 24 24 24h280V96H24c-13.3 0-24 10.7-24 24zm58.9 216.1L116.4 167c1.7-4.9 6.2-8.1 11.4-8.1h32.5c5.1 0 9.7 3.3 11.4 8.1l57.5 169.1c2.6 7.8-3.1 15.9-11.4 15.9h-22.9a12 12 0 0 1-11.5-8.6l-9.4-31.9h-60.2l-9.1 31.8c-1.5 5.1-6.2 8.7-11.5 8.7H70.3c-8.2 0-14-8.1-11.4-15.9z"
fill="currentColor"
style={Object {}}
/>
</svg>
<div
className="sr-only"
>
Choose Language
</div>
</label>
<select
className="mx-2 mt-1"
defaultValue="en"
id="site-footer-language-select"
name="site-footer-language-select"
>
<option
value="en"
>
English
</option>
<option
value="es-419"
>
español
</option>
</select>
<button
className="mt-1"
type="submit"
>
Apply
</button>
</form>
</div>
</div>
<div
className="area-2"
>
<h2>
example
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/about-us"
>
<span>
About
</span>
</a>
</li>
<li>
<a
href="https://business.edx.org/?utm_test=utm_test_value"
>
<span>
example for Business
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/affiliate-program"
>
<span>
Affiliates
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/open"
>
<span>
Open example
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/careers"
>
<span>
Careers
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/news-announcements"
>
<span>
News
</span>
</a>
</li>
</ul>
</div>
<div
className="area-3"
>
<h2>
<span>
Legal
</span>
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/terms-of-service"
>
<span>
Terms of Service & Honor Code
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/privacy-policy"
>
<span>
Privacy Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/accessibility"
>
<span>
Accessibility Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/trademarks"
>
<span>
Trademark Policy
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/sitemap"
>
<span>
Sitemap
</span>
</a>
</li>
</ul>
</div>
<div
className="area-4"
>
<h2>
<span>
Connect
</span>
</h2>
<ul
className="list-unstyled p-0 m-0"
>
<li>
<a
href="https://www.example.com/blog"
>
<span>
Blog
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/contact"
>
<span>
Contact Us
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/support"
>
<span>
Help Center
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/media-kit"
>
<span>
Media Kit
</span>
</a>
</li>
<li>
<a
href="https://www.example.com/donate"
>
<span>
Donate
</span>
</a>
</li>
</ul>
</div>
<div
className="area-5"
>
<ul
className="d-flex flex-row justify-content-between list-unstyled max-width-222 p-0 mb-4"
>
<li>
<a
href="https://www.facebook.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
title="Facebook"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-facebook-square fa-w-14 fa-2x social-icon"
data-icon="facebook-square"
data-prefix="fab"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M400 32H48A48 48 0 0 0 0 80v352a48 48 0 0 0 48 48h137.25V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.27c-30.81 0-40.42 19.12-40.42 38.73V256h68.78l-11 71.69h-57.78V480H400a48 48 0 0 0 48-48V80a48 48 0 0 0-48-48z"
fill="currentColor"
style={Object {}}
/>
</svg>
<span
className="sr-only"
>
Like edX on Facebook
</span>
</a>
</li>
<li>
<a
href="https://www.twitter.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
title="Twitter"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-twitter-square fa-w-14 fa-2x social-icon"
data-icon="twitter-square"
data-prefix="fab"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-48.9 158.8c.2 2.8.2 5.7.2 8.5 0 86.7-66 186.6-186.6 186.6-37.2 0-71.7-10.8-100.7-29.4 5.3.6 10.4.8 15.8.8 30.7 0 58.9-10.4 81.4-28-28.8-.6-53-19.5-61.3-45.5 10.1 1.5 19.2 1.5 29.6-1.2-30-6.1-52.5-32.5-52.5-64.4v-.8c8.7 4.9 18.9 7.9 29.6 8.3a65.447 65.447 0 0 1-29.2-54.6c0-12.2 3.2-23.4 8.9-33.1 32.3 39.8 80.8 65.8 135.2 68.6-9.3-44.5 24-80.6 64-80.6 18.9 0 35.9 7.9 47.9 20.7 14.8-2.8 29-8.3 41.6-15.8-4.9 15.2-15.2 28-28.8 36.1 13.2-1.4 26-5.1 37.8-10.2-8.9 13.1-20.1 24.7-32.9 34z"
fill="currentColor"
style={Object {}}
/>
</svg>
<span
className="sr-only"
>
Follow edX on Twitter
</span>
</a>
</li>
<li>
<a
href="https://www.youtube.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
title="Youtube"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-youtube-square fa-w-14 fa-2x social-icon"
data-icon="youtube-square"
data-prefix="fab"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M186.8 202.1l95.2 54.1-95.2 54.1V202.1zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-42 176.3s0-59.6-7.6-88.2c-4.2-15.8-16.5-28.2-32.2-32.4C337.9 128 224 128 224 128s-113.9 0-142.2 7.7c-15.7 4.2-28 16.6-32.2 32.4-7.6 28.5-7.6 88.2-7.6 88.2s0 59.6 7.6 88.2c4.2 15.8 16.5 27.7 32.2 31.9C110.1 384 224 384 224 384s113.9 0 142.2-7.7c15.7-4.2 28-16.1 32.2-31.9 7.6-28.5 7.6-88.1 7.6-88.1z"
fill="currentColor"
style={Object {}}
/>
</svg>
<span
className="sr-only"
>
Subscribe to the edX YouTube channel
</span>
</a>
</li>
<li>
<a
href="https://www.linkedin.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
title="LinkedIn"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-linkedin fa-w-14 fa-2x social-icon"
data-icon="linkedin"
data-prefix="fab"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"
fill="currentColor"
style={Object {}}
/>
</svg>
<span
className="sr-only"
>
Follow edX on LinkedIn
</span>
</a>
</li>
<li>
<a
href="https://plus.google.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
title="Google+"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-google-plus-square fa-w-14 fa-2x social-icon"
data-icon="google-plus-square"
data-prefix="fab"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM164 356c-55.3 0-100-44.7-100-100s44.7-100 100-100c27 0 49.5 9.8 67 26.2l-27.1 26.1c-7.4-7.1-20.3-15.4-39.8-15.4-34.1 0-61.9 28.2-61.9 63.2 0 34.9 27.8 63.2 61.9 63.2 39.6 0 54.4-28.5 56.8-43.1H164v-34.4h94.4c1 5 1.6 10.1 1.6 16.6 0 57.1-38.3 97.6-96 97.6zm220-81.8h-29v29h-29.2v-29h-29V245h29v-29H355v29h29v29.2z"
fill="currentColor"
style={Object {}}
/>
</svg>
<span
className="sr-only"
>
Follow edX on Google+
</span>
</a>
</li>
<li>
<a
href="https://reddit.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
title="Reddit"
>
<svg
aria-hidden="true"
className="svg-inline--fa fa-reddit-square fa-w-14 fa-2x social-icon"
data-icon="reddit-square"
data-prefix="fab"
focusable="false"
role="img"
style={Object {}}
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M283.2 345.5c2.7 2.7 2.7 6.8 0 9.2-24.5 24.5-93.8 24.6-118.4 0-2.7-2.4-2.7-6.5 0-9.2 2.4-2.4 6.5-2.4 8.9 0 18.7 19.2 81 19.6 100.5 0 2.4-2.3 6.6-2.3 9 0zm-91.3-53.8c0-14.9-11.9-26.8-26.5-26.8-14.9 0-26.8 11.9-26.8 26.8 0 14.6 11.9 26.5 26.8 26.5 14.6 0 26.5-11.9 26.5-26.5zm90.7-26.8c-14.6 0-26.5 11.9-26.5 26.8 0 14.6 11.9 26.5 26.5 26.5 14.9 0 26.8-11.9 26.8-26.5 0-14.9-11.9-26.8-26.8-26.8zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-99.7 140.6c-10.1 0-19 4.2-25.6 10.7-24.1-16.7-56.5-27.4-92.5-28.6l18.7-84.2 59.5 13.4c0 14.6 11.9 26.5 26.5 26.5 14.9 0 26.8-12.2 26.8-26.8 0-14.6-11.9-26.8-26.8-26.8-10.4 0-19.3 6.2-23.8 14.9l-65.7-14.6c-3.3-.9-6.5 1.5-7.4 4.8l-20.5 92.8c-35.7 1.5-67.8 12.2-91.9 28.9-6.5-6.8-15.8-11-25.9-11-37.5 0-49.8 50.4-15.5 67.5-1.2 5.4-1.8 11-1.8 16.7 0 56.5 63.7 102.3 141.9 102.3 78.5 0 142.2-45.8 142.2-102.3 0-5.7-.6-11.6-2.1-17 33.6-17.2 21.2-67.2-16.1-67.2z"
fill="currentColor"
style={Object {}}
/>
</svg>
<span
className="sr-only"
>
Subscribe to the edX subreddit
</span>
</a>
</li>
</ul>
<ul
className="d-flex flex-row justify-content-between list-unstyled max-width-264 p-0 mb-5"
>
<li>
<a
href="https://store.apple.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
>
<img
alt="Download the example mobile app from the Apple App Store"
className="max-height-39"
src="https://prod-edxapp.edx-cdn.org/static/images/app/app_store_badge_135x40.d0558d910630.svg"
/>
</a>
</li>
<li>
<a
href="https://play.google.com"
onClick={[Function]}
rel="noopener noreferrer"
target="_blank"
>
<img
alt="Download the example mobile app from Google Play"
className="max-height-39"
src="https://prod-edxapp.edx-cdn.org/static/images/app/google_play_badge_45.6ea466e328da.png"
/>
</a>
</li>
</ul>
<p>
<span>
© 20122019 example Inc.
</span>
<br />
<span>
EdX, Open edX, and MicroMasters are registered trademarks of edX Inc. | 深圳市恒宇博科技有限公司
<a
href="http://www.beian.miit.gov.cn"
>
粤ICP备17044299号-2
</a>
</span>
</p>
</div>
</div>
</footer>
`;

View File

@@ -1,429 +0,0 @@
import React from 'react';
import PropTypes from 'prop-types';
import { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-i18n';
import { Hyperlink } from '@edx/paragon';
import qs from 'query-string';
import messages from './SiteFooter.messages';
const EVENT_NAMES = {
FOOTER_LINK: 'edx.bi.footer.link',
};
class SiteFooter extends React.Component {
constructor(props) {
super(props);
this.externalLinkClickHandler = this.externalLinkClickHandler.bind(this);
this.applyLanguageSelection = this.applyLanguageSelection.bind(this);
}
applyLanguageSelection(event) {
event.preventDefault();
const languageCode = event.target.elements['site-footer-language-select'].value;
const { languageForm: { onLanguageSelected } } = this.props;
onLanguageSelected(languageCode);
}
externalLinkClickHandler(event) {
const label = event.currentTarget.getAttribute('href');
const eventName = EVENT_NAMES.FOOTER_LINK;
const properties = {
category: 'outbound_link',
label,
};
this.props.handleAllTrackEvents(eventName, properties);
}
renderSiteLogo() {
return (
<img
src={this.props.siteLogo}
alt={this.props.intl.formatMessage(
messages['footer.site-footer.site-logo.alt-text'],
{ siteName: this.props.siteName },
)}
/>
);
}
renderMarketingSiteUrl(path) {
return `${this.props.marketingSiteBaseUrl}${path}`;
}
renderEnterpriseMarketingSiteUrl(enterpriseLinkData) {
const {
queryParams,
url,
} = enterpriseLinkData;
return queryParams ? `${url}/?${qs.stringify(queryParams)}` : url;
}
renderMobileLinks() {
const {
intl,
siteName,
showMobileLinks,
appleAppStoreUrl,
googlePlayUrl,
} = this.props;
let mobileLinks = null;
if (showMobileLinks) {
mobileLinks = (
<ul className="d-flex flex-row justify-content-between list-unstyled max-width-264 p-0 mb-5">
<li>
<a href={appleAppStoreUrl} rel="noopener noreferrer" target="_blank" onClick={this.externalLinkClickHandler}>
<img
className="max-height-39"
alt={intl.formatMessage(
messages['footer.site-footer.apple-app-store.alt-text'],
{ siteName },
)}
src="https://prod-edxapp.edx-cdn.org/static/images/app/app_store_badge_135x40.d0558d910630.svg"
/>
</a>
</li>
<li>
<a href={googlePlayUrl} rel="noopener noreferrer" target="_blank" onClick={this.externalLinkClickHandler}>
<img
className="max-height-39"
alt={intl.formatMessage(
messages['footer.site-footer.google-play.alt-text'],
{ siteName },
)}
src="https://prod-edxapp.edx-cdn.org/static/images/app/google_play_badge_45.6ea466e328da.png"
/>
</a>
</li>
</ul>
);
}
return mobileLinks;
}
renderBusinessMarketingListItem() {
const { siteName, enterpriseMarketingLink } = this.props;
return enterpriseMarketingLink && (
<li>
<a href={this.renderEnterpriseMarketingSiteUrl(enterpriseMarketingLink)}>
<FormattedMessage
id="footer.site-footer.link.business"
defaultMessage="{siteName} for Business"
description="A link that points to a business marketing page for a specified website"
values={{ siteName }}
/>
</a>
</li>
);
}
render() {
const {
intl,
siteName,
openSourceUrl,
termsOfServiceUrl,
privacyPolicyUrl,
contactUrl,
supportUrl,
socialLinks,
supportedLanguages,
languageForm,
} = this.props;
const showLanguageSelector = supportedLanguages.length > 0 &&
languageForm;
return (
<footer
role="contentinfo"
aria-label={intl.formatMessage(messages['footer.site-footer.footer.aria-label'])}
className="footer d-flex justify-content-center border-top py-3 px-4"
>
<div className="max-width-1180 d-grid">
<div className="area-1">
<Hyperlink
destination={this.renderMarketingSiteUrl('/')}
content={this.renderSiteLogo()}
aria-label={intl.formatMessage(
messages['footer.site-footer.site-logo.aria-label'],
{ siteName },
)}
/>
{showLanguageSelector &&
<div className="i18n d-flex mt-2">
<form
className="d-flex align-items-start"
onSubmit={this.applyLanguageSelection}
>
{/* eslint-disable-next-line jsx-a11y/label-has-for */}
<label htmlFor="site-footer-language-select">
{languageForm.icon}
<div className="sr-only">{languageForm.screenReaderLabel}</div>
</label>
<select
id="site-footer-language-select"
className="mx-2 mt-1"
name="site-footer-language-select"
defaultValue={languageForm.activeLanguage}
>
{supportedLanguages.map(({ value, label }) =>
<option key={value} value={value}>{label}</option>)}
</select>
<button className="mt-1" type="submit">{languageForm.submitLabel}</button>
</form>
</div>
}
</div>
<div className="area-2">
<h2>{siteName}</h2>
<ul className="list-unstyled p-0 m-0">
<li>
<a href={this.renderMarketingSiteUrl('/about-us')}>
<FormattedMessage
id="footer.site-footer.link.about"
defaultMessage="About"
/>
</a>
</li>
{this.renderBusinessMarketingListItem()}
<li>
<a href={this.renderMarketingSiteUrl('/affiliate-program')}>
<FormattedMessage
id="footer.site-footer.link.affiliates"
defaultMessage="Affiliates"
/>
</a>
</li>
<li>
<a href={openSourceUrl}>
<FormattedMessage
id="footer.site-footer.link.open-source"
defaultMessage="Open {siteName}"
values={{ siteName }}
description="Open Source link text"
/>
</a>
</li>
<li>
<a href={this.renderMarketingSiteUrl('/careers')}>
<FormattedMessage
id="footer.site-footer.link.careers"
defaultMessage="Careers"
/>
</a>
</li>
<li>
<a href={this.renderMarketingSiteUrl('/news-announcements')}>
<FormattedMessage
id="footer.site-footer.link.news"
defaultMessage="News"
/>
</a>
</li>
</ul>
</div>
<div className="area-3">
<h2>
<FormattedMessage
id="footer.site-footer.link.header.legal"
defaultMessage="Legal"
description="Header for legal links"
/>
</h2>
<ul className="list-unstyled p-0 m-0">
<li>
<a href={termsOfServiceUrl}>
<FormattedMessage
id="footer.site-footer.link.terms-of-service"
defaultMessage="Terms of Service & Honor Code"
/>
</a>
</li>
<li>
<a href={privacyPolicyUrl}>
<FormattedMessage
id="footer.site-footer.link.privacy"
defaultMessage="Privacy Policy"
/>
</a>
</li>
<li>
<a href={this.renderMarketingSiteUrl('/accessibility')}>
<FormattedMessage
id="footer.site-footer.link.accessibility"
defaultMessage="Accessibility Policy"
/>
</a>
</li>
<li>
<a href={this.renderMarketingSiteUrl('/trademarks')}>
<FormattedMessage
id="footer.site-footer.link.trademark"
defaultMessage="Trademark Policy"
/>
</a>
</li>
<li>
<a href={this.renderMarketingSiteUrl('/sitemap')}>
<FormattedMessage
id="footer.site-footer.link.sitemap"
defaultMessage="Sitemap"
/>
</a>
</li>
</ul>
</div>
<div className="area-4">
<h2>
<FormattedMessage
id="footer.site-footer.link.header.connect"
defaultMessage="Connect"
description="Header for connect links"
/>
</h2>
<ul className="list-unstyled p-0 m-0">
<li>
<a href={this.renderMarketingSiteUrl('/blog')}>
<FormattedMessage
id="footer.site-footer.link.blog"
defaultMessage="Blog"
/>
</a>
</li>
<li>
<a href={contactUrl}>
<FormattedMessage
id="footer.site-footer.link.contact-us"
defaultMessage="Contact Us"
/>
</a>
</li>
<li>
<a href={supportUrl}>
<FormattedMessage
id="footer.site-footer.link.help-center"
defaultMessage="Help Center"
/>
</a>
</li>
<li>
<a href={this.renderMarketingSiteUrl('/media-kit')}>
<FormattedMessage
id="footer.site-footer.link.media-kit"
defaultMessage="Media Kit"
/>
</a>
</li>
<li>
<a href={this.renderMarketingSiteUrl('/donate')}>
<FormattedMessage
id="footer.site-footer.link.donate"
defaultMessage="Donate"
/>
</a>
</li>
</ul>
</div>
<div className="area-5">
{socialLinks.length > 0 &&
<ul className="d-flex flex-row justify-content-between list-unstyled max-width-222 p-0 mb-4">
{socialLinks.map(link => (
<li key={link.url}>
<a
href={link.url}
title={link.title}
rel="noopener noreferrer"
target="_blank"
onClick={this.externalLinkClickHandler}
>
{link.icon}
<span className="sr-only">{link.screenReaderText}</span>
</a>
</li>
))}
</ul>
}
{this.renderMobileLinks()}
<p>
<FormattedMessage
id="footer.site-footer.copyright-text"
defaultMessage="{copyrightSymbol} {startDate}{endDate} {siteName} Inc."
values={{
copyrightSymbol: '©',
startDate: '2012',
endDate: `${new Date().getFullYear()}`,
siteName,
}}
description="Footer copyright text with copyright symbol and dates"
/>
<br />
<FormattedMessage
id="footer.site-footer.trademark-text"
defaultMessage="EdX, Open edX, and MicroMasters are registered trademarks of edX Inc. | 深圳市恒宇博科技有限公司 {icpLicense}"
values={{ icpLicense: <a href="http://www.beian.miit.gov.cn">粤ICP备17044299号-2</a> }}
description="Footer trademark text"
/>
</p>
</div>
</div>
</footer>
);
}
}
SiteFooter.propTypes = {
siteName: PropTypes.string,
siteLogo: PropTypes.node,
marketingSiteBaseUrl: PropTypes.string,
enterpriseMarketingLink: PropTypes.shape({
url: PropTypes.string,
queryParams: PropTypes.shape({}),
}),
supportUrl: PropTypes.string,
contactUrl: PropTypes.string,
openSourceUrl: PropTypes.string,
termsOfServiceUrl: PropTypes.string,
privacyPolicyUrl: PropTypes.string,
socialLinks: PropTypes.arrayOf(PropTypes.shape({
title: PropTypes.string.isRequired,
url: PropTypes.string.isRequired,
icon: PropTypes.element.isRequired,
screenReaderText: PropTypes.string.isRequired,
})),
showMobileLinks: PropTypes.bool,
appleAppStoreUrl: PropTypes.string,
googlePlayUrl: PropTypes.string,
supportedLanguages: PropTypes.arrayOf(PropTypes.shape({
label: PropTypes.string.isRequired,
value: PropTypes.string.isRequired,
})),
languageForm: PropTypes.shape({
screenReaderLabel: PropTypes.string.isRequired,
submitLabel: PropTypes.string.isRequired,
onLanguageSelected: PropTypes.func.isRequired,
icon: PropTypes.node.isRequired,
activeLanguage: PropTypes.string,
}),
handleAllTrackEvents: PropTypes.func.isRequired,
intl: intlShape.isRequired,
};
SiteFooter.defaultProps = {
siteName: null,
siteLogo: null,
marketingSiteBaseUrl: null,
enterpriseMarketingLink: null,
supportUrl: null,
contactUrl: null,
openSourceUrl: null,
termsOfServiceUrl: null,
privacyPolicyUrl: null,
socialLinks: [],
showMobileLinks: true,
appleAppStoreUrl: null,
googlePlayUrl: null,
supportedLanguages: [],
languageForm: null,
};
export default injectIntl(SiteFooter);
export { EVENT_NAMES };

View File

@@ -1,3 +0,0 @@
import SiteFooter from './components/SiteFooter';
export default SiteFooter;

View File

@@ -1,165 +0,0 @@
.max-width-222 {
max-width: 222px;
}
.max-width-264 {
max-width: 264px;
}
.max-width-1180 {
max-width: 1180px;
}
.max-height-39 {
max-height: 39px;
}
.d-grid {
display: grid;
}
$gray-footer: #fcfcfc;
$border-1: 1px solid $gray-200;
.footer {
background-color: $gray-footer;
.area-1 {
grid-column: 1;
grid-row: 1;
border-bottom: $border-1;
padding-bottom: 1rem;
}
.area-2 {
grid-column: 1;
grid-row: 2;
border-bottom: $border-1;
padding: 1rem 0;
}
.area-3 {
grid-column: 1;
grid-row: 3;
border-bottom: $border-1;
padding: 1rem 0;
}
.area-4 {
grid-column: 1;
grid-row: 4;
border-bottom: $border-1;
padding: 1rem 0;
}
.area-5 {
grid-column: 1;
grid-row: 5;
padding: 1rem 0;
}
@media only screen and (min-width: 717px) {
.area-1 {
grid-column: 1 / span 2;
grid-row: 1;
border-bottom: none;
padding: 1rem 0;
}
.area-2 {
grid-column: 1;
grid-row: 2;
}
.area-3 {
grid-column: 1;
grid-row: 3;
}
.area-4 {
grid-column: 1;
grid-row: 4;
border-bottom: none;
}
.area-5 {
grid-column: 2;
grid-row: 2 / span 3;
border-left: $border-1;
padding-left: 1rem;
margin-left: 1rem;
}
}
@media only screen and (min-width: 870px) {
.area-1 {
grid-column: 1;
grid-row: 1 / span 3;
border-right: $border-1;
padding-right: 1rem;
margin-right: 1rem;
}
.area-2 {
grid-column: 2;
grid-row: 1;
border-bottom: none;
border-right: $border-1;
padding-right: 1rem;
margin-right: 1rem;
}
.area-3 {
grid-column: 3;
grid-row: 1;
border-bottom: none;
border-right: $border-1;
padding-right: 1rem;
margin-right: 1rem;
}
.area-4 {
grid-column: 4;
grid-row: 1;
}
.area-5 {
grid-column: 2 / span 3;
grid-row: 2;
border: none;
margin-left: 0;
padding-left: 0;
}
}
@media only screen and (min-width: 1188px) {
.area-1 {
grid-column: 1 / span 1;
grid-row: 1;
}
.area-2 {
grid-column: 2;
grid-row: 1;
}
.area-3 {
grid-column: 3;
grid-row: 1;
}
.area-4 {
grid-column: 4;
grid-row: 1;
border-right: $border-1;
padding-right: 1rem;
margin-right: 1rem;
}
.area-5 {
grid-column: 5 / span 1;
grid-row: 1;
max-width: 372px;
}
}
}

22
src/setupTest.js Normal file
View File

@@ -0,0 +1,22 @@
// These configuration values are usually set in webpack's EnvironmentPlugin however
// Jest does not use webpack so we need to set these so for testing
process.env.ACCESS_TOKEN_COOKIE_NAME = 'edx-jwt-cookie-header-payload';
process.env.BASE_URL = 'localhost:1995';
process.env.CREDENTIALS_BASE_URL = 'http://localhost:18150';
process.env.CSRF_TOKEN_API_PATH = '/csrf/api/v1/token';
process.env.ECOMMERCE_BASE_URL = 'http://localhost:18130';
process.env.LANGUAGE_PREFERENCE_COOKIE_NAME = 'openedx-language-preference';
process.env.LMS_BASE_URL = 'http://localhost:18000';
process.env.LOGIN_URL = 'http://localhost:18000/login';
process.env.LOGOUT_URL = 'http://localhost:18000/login';
process.env.MARKETING_SITE_BASE_URL = 'http://localhost:18000';
process.env.ORDER_HISTORY_URL = 'localhost:1996/orders';
process.env.REFRESH_ACCESS_TOKEN_ENDPOINT = 'http://localhost:18000/login_refresh';
process.env.SEGMENT_KEY = 'segment_whoa';
process.env.SITE_NAME = 'edX';
process.env.USER_INFO_COOKIE_NAME = 'edx-user-info';
process.env.LOGO_URL = 'https://edx-cdn.org/v3/default/logo.svg';
process.env.LOGO_TRADEMARK_URL = 'https://edx-cdn.org/v3/default/logo-trademark.svg';
process.env.LOGO_WHITE_URL = 'https://edx-cdn.org/v3/default/logo-white.svg';
process.env.FAVICON_URL = 'https://edx-cdn.org/v3/default/favicon.ico';
process.env.ENABLE_ACCESSIBILITY_PAGE = 'false';

View File

@@ -1,4 +0,0 @@
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({ adapter: new Adapter() });

1275
stats.json

File diff suppressed because one or more lines are too long

17
webpack.dev.config.js Normal file
View File

@@ -0,0 +1,17 @@
const path = require('path');
const { createConfig } = require('@openedx/frontend-build');
module.exports = createConfig('webpack-dev', {
entry: {
app: path.resolve(__dirname, 'example'),
},
output: {
path: path.resolve(__dirname, 'example/dist'),
publicPath: '/',
},
resolve: {
alias: {
'@edx/frontend-component-footer': path.resolve(__dirname, 'src'),
},
},
});