Compare commits

..

628 Commits

Author SHA1 Message Date
Brian Smith
35d9ae8fec feat(deps): update header to 5.6.0 (#1112) 2024-10-22 19:20:12 -04:00
renovate[bot]
ff32632411 fix(deps): update dependency @openedx/paragon to v22.9.0 2024-10-21 00:19:54 -04:00
renovate[bot]
2c97964f0b chore(deps): update dependency @testing-library/jest-dom to v6.6.2 2024-10-21 00:19:14 -04:00
Awais Ansari
fa748719ae Revert "chore(deps): update dependency @testing-library/react to v16" (#1107)
This reverts commit 1fb7b96c40.
2024-10-15 17:04:54 +05:00
renovate[bot]
1fb7b96c40 chore(deps): update dependency @testing-library/react to v16 2024-10-14 04:36:50 +00:00
renovate[bot]
e13d04a5ea fix(deps): update react-router monorepo to v6.27.0 2024-10-14 04:36:37 +00:00
renovate[bot]
e3f5129746 fix(deps): update dependency @edx/frontend-component-header to v5.5.0 2024-10-07 06:04:17 -04:00
renovate[bot]
24b054f55f fix(deps): update dependency @edx/frontend-platform to v8.1.2 2024-10-07 07:03:35 +00:00
renovate[bot]
8498d9f04f fix(deps): update dependency @openedx/paragon to v22.8.1 2024-09-30 02:06:48 -04:00
renovate[bot]
0fa58d8112 fix(deps): update dependency @edx/frontend-component-header to v5.4.0 2024-09-30 02:06:35 -04:00
renovate[bot]
312b114ef7 chore(deps): update dependency @testing-library/jest-dom to v6.5.0 2024-09-30 02:06:22 -04:00
renovate[bot]
a05b29e406 chore(deps): update dependency @openedx/frontend-build to v14.1.5 2024-09-30 00:04:06 -04:00
renovate[bot]
6e3e67467a chore(deps): update commitlint monorepo to v19.5.0 2024-09-23 03:26:23 -04:00
renovate[bot]
09b5c8b72d chore(deps): update dependency @openedx/frontend-build to v14.1.4 2024-09-23 03:26:10 -04:00
edX requirements bot
5e71737240 chore: update browserslist DB (#1085)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-09-17 09:14:49 -04:00
edX requirements bot
eb726e80ab chore: enable github action auto update in dependabot.yml (#1083) 2024-09-17 09:10:50 -04:00
renovate[bot]
4f1272b01c fix(deps): update dependency core-js to v3.38.1 2024-09-16 06:36:06 +00:00
renovate[bot]
30e3fcdcba fix(deps): update dependency @openedx/frontend-slot-footer to v1.0.5 2024-09-16 06:35:49 +00:00
edX requirements bot
b13fc58bad chore: update browserslist DB (#1078)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-09-10 15:03:36 -04:00
sundasnoreen12
31b31ba345 Merge pull request #1077 from openedx/sundas/INF-1551
docs: updated catalog-info file for profile MFE
2024-09-10 16:34:00 +05:00
sundasnoreen12
f7449bfdcc docs: added pull request template and updated team name 2024-09-10 13:19:17 +03:00
sundasnoreen12
cb0f05955f docs: updated catalog-info file for profile MFE 2024-09-10 13:18:09 +03:00
renovate[bot]
f1586d260a chore(deps): update dependency @openedx/frontend-build to v14.1.2 2024-09-09 04:34:22 +00:00
renovate[bot]
b268c43978 chore(deps): update commitlint monorepo to v19.4.1 2024-09-09 00:34:04 -04:00
edX requirements bot
ed58a41042 chore: update browserslist DB (#1076)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-09-03 09:15:26 -07:00
Deborah Kaplan
7e4ba48de8 Merge pull request #1074 from openedx/dependabot/npm_and_yarn/micromatch-4.0.8
build(deps): bump micromatch from 4.0.7 to 4.0.8
2024-08-27 09:48:00 -04:00
edX requirements bot
e9e16cc595 chore: update browserslist DB (#1071)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-08-27 09:45:47 -04:00
dependabot[bot]
88d786b49f build(deps): bump micromatch from 4.0.7 to 4.0.8
Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.7 to 4.0.8.
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/4.0.8/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.7...4.0.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-26 07:21:56 +00:00
renovate[bot]
a24fea54ec fix(deps): update dependency @openedx/frontend-slot-footer to v1.0.4 2024-08-26 07:20:58 +00:00
renovate[bot]
8980b22fff fix(deps): update dependency @edx/openedx-atlas to v0.6.2 2024-08-26 03:20:42 -04:00
Bilal Qamar
389d923a08 build: Upgrade to Node 20 (#1056)
* feat: updated node to v20
2024-08-23 10:27:32 -04:00
Bilal Qamar
714851c329 test: Add Node 20 to CI matrix (#1069) 2024-08-22 08:39:33 -04:00
Bilal Qamar
b27300e63d fix: updated failing snapshots (#1070) 2024-08-21 07:21:48 -07:00
renovate[bot]
0869a82a31 fix(deps): update font awesome to v6.6.0 2024-08-19 06:26:50 +00:00
renovate[bot]
507525262c fix(deps): update dependency core-js to v3.38.0 2024-08-19 06:26:33 +00:00
renovate[bot]
a69170a4d2 fix(deps): update dependency @openedx/paragon to v22.7.0 2024-08-19 04:19:32 +00:00
renovate[bot]
26203bb744 chore(deps): update dependency @openedx/frontend-build to v14.1.0 2024-08-19 00:19:15 -04:00
edX requirements bot
21fb4702b4 chore: update browserslist DB (#1062)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-08-14 13:58:49 -04:00
renovate[bot]
aa8d1f9473 chore(deps): update dependency @commitlint/cli to v19.4.0 2024-08-12 04:19:50 +00:00
renovate[bot]
b6e9df9778 chore(deps): update dependency @openedx/frontend-build to v14.0.15 2024-08-12 00:19:35 -04:00
edX requirements bot
a7ed0cd62a chore: update browserslist DB (#1059)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-08-05 15:21:00 -07:00
renovate[bot]
e61fada0b2 fix(deps): update dependency @edx/frontend-platform to v8.1.1 2024-08-05 07:45:45 -04:00
renovate[bot]
3b0b1be197 fix(deps): update dependency @edx/frontend-component-header to v5.3.4 2024-08-05 03:33:34 -04:00
renovate[bot]
616847c6b5 chore(deps): update dependency @testing-library/jest-dom to v6.4.8 2024-07-29 05:54:29 -04:00
renovate[bot]
95b41131fc chore(deps): update dependency @openedx/frontend-build to v14.0.14 2024-07-29 02:02:34 -04:00
edX requirements bot
59a3150706 chore: update browserslist DB (#1055)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-07-22 12:33:25 -04:00
edX requirements bot
774b67b208 chore: update browserslist DB (#1050)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-07-17 08:54:42 -04:00
renovate[bot]
9a855cd30e fix(deps): update react-router monorepo to v6.24.1 2024-07-15 07:39:30 +00:00
renovate[bot]
9c6647aeae fix(deps): update dependency @edx/frontend-platform to v8.1.0 2024-07-15 03:39:10 -04:00
renovate[bot]
ecdec9083a fix(deps): update dependency @openedx/frontend-slot-footer to v1.0.3 2024-07-15 01:07:15 -04:00
renovate[bot]
1c0746c907 chore(deps): update dependency glob to v10.4.5 2024-07-15 01:07:00 -04:00
edX requirements bot
e7f8a5d1ff chore: update browserslist DB (#1049)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-07-08 11:09:34 -07:00
edX requirements bot
d927b43c01 chore: update browserslist DB (#1042)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-07-01 17:18:34 -04:00
Deborah Kaplan
1a36d69bd8 Merge pull request #1048 from openedx/dkaplan1/APER-3263_take-2-create-codeowners-for-openedx/frontend-app-profile
feat: fixing codeowners
2024-07-01 17:17:36 -04:00
Deborah Kaplan
db90ce5975 Merge branch 'master' into dkaplan1/APER-3263_take-2-create-codeowners-for-openedx/frontend-app-profile 2024-07-01 16:11:42 -04:00
Deborah Kaplan
b22d411481 feat: fixing codeowners
I used internal team name, fixing to external
2024-07-01 20:10:25 +00:00
Deborah Kaplan
d7fff65162 Merge pull request #1047 from openedx/dkaplan1/APER-3263_create-codeowners-for-openedx/frontend-app-profile
feat:  adding codeowners
2024-07-01 16:08:26 -04:00
Deborah Kaplan
cf5d69c5ba feat: adding codeowners
this is a dependency for other parts of the flow

FIXES: APER-3263
2024-07-01 20:00:43 +00:00
renovate[bot]
53d26746c1 fix(deps): update dependency core-js to v3.37.1 2024-07-01 03:10:14 -04:00
renovate[bot]
048433a135 fix(deps): update dependency @openedx/paragon to v22.6.1 2024-07-01 03:09:56 -04:00
renovate[bot]
31136b0523 chore(deps): update dependency glob to v10.4.2 2024-07-01 00:28:36 -04:00
renovate[bot]
caaf8547dc chore(deps): update dependency @openedx/frontend-build to v14.0.10 2024-07-01 00:28:21 -04:00
dependabot[bot]
e92332859a build(deps): bump braces from 3.0.2 to 3.0.3 (#1034)
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-25 16:03:48 -04:00
dependabot[bot]
55529b0b74 build(deps): bump ws from 7.5.9 to 7.5.10 (#1039)
Bumps [ws](https://github.com/websockets/ws) from 7.5.9 to 7.5.10.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.5.9...7.5.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-25 16:03:35 -04:00
Adolfo R. Brandes
7682971b63 build: Update codecov and use token (#1033)
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-25 16:03:11 -04:00
Emad Rad
6aaf615c63 fix: make raw string a formatted message (#1041) 2024-06-24 09:49:14 -07:00
edX requirements bot
3512fc56c9 chore: update browserslist DB (#1029)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-06-17 12:19:32 -04:00
renovate[bot]
fda2ef1977 chore(deps): update dependency glob to v10.4.1 2024-06-17 03:35:58 -04:00
renovate[bot]
3784c2a6df fix(deps): update dependency @fortawesome/react-fontawesome to v0.2.2 2024-06-17 07:35:45 +00:00
renovate[bot]
04d74389ed chore(deps): update dependency @testing-library/jest-dom to v6.4.6 2024-06-17 03:35:29 -04:00
renovate[bot]
1d338d0127 chore(deps): update dependency @openedx/frontend-build to v14.0.9 2024-06-17 00:29:48 -04:00
renovate[bot]
0fd6e34a8e fix(deps): update dependency @edx/frontend-platform to v8.0.4 2024-06-10 13:09:22 +00:00
renovate[bot]
9d89c79fb2 fix(deps): update dependency @edx/openedx-atlas to v0.6.1 2024-06-10 07:54:31 +00:00
edX requirements bot
bfc31696ee chore: update browserslist DB (#1026)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-05-31 09:37:43 -04:00
renovate[bot]
8ebdc1030f fix(deps): update dependency @edx/frontend-platform to v8.0.3 2024-05-27 05:02:43 -04:00
renovate[bot]
8c3d706071 fix(deps): update dependency @edx/frontend-component-header to v5.3.3 2024-05-27 02:19:12 -04:00
Bilal Qamar
ee8912530d feat: updated frontend-build & frontend-platform major versions (#932)
* chore: updated frontend-build
* fix: updated snapshots for failing tests
* refactor: switched frontend-build to openedx, updated screenshots
* refactor: added overrides to resolve dependency issues
* refactor: updated frontend-build to alpha
* refactor: updated frontend-build
* feat: updated build and platform major versions, along with edx packages
* refactor: updated package-lock
* refactor: resolved lint issues
---------

Co-authored-by: Muhammad Abdullah Waheed <abdullah.waheed@arbisoft.com>
2024-05-22 13:21:34 -04:00
edX requirements bot
db91e0f1a4 chore: update browserslist DB (#1014)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-05-20 10:16:19 -04:00
renovate[bot]
5f2d0c089e fix(deps): update dependency @fortawesome/react-fontawesome to v0.2.1 2024-05-20 03:31:00 -04:00
renovate[bot]
75be372ec9 fix(deps): update dependency @edx/frontend-component-header to v5.3.2 2024-05-20 07:30:45 +00:00
Brian Smith
9ef81f7485 feat: use frontend-plugin-framework to provide a FooterSlot (#1017) 2024-05-17 13:12:51 -03:00
Brian Smith
6a32790f28 fix: update footer to resolve (not so) optional peer dependency issue (#1022) 2024-05-14 10:43:50 -04:00
renovate[bot]
9f5f7f9a64 fix(deps): update dependency @openedx/paragon to v22.4.0 2024-05-13 02:29:21 -04:00
renovate[bot]
06f6e3537a fix(deps): update dependency @edx/frontend-component-footer to v13.2.0 2024-05-13 02:28:58 -04:00
renovate[bot]
44f0295d0d fix(deps): update dependency @edx/frontend-component-header to v5.3.1 2024-05-13 00:05:58 -04:00
renovate[bot]
19be2e93e2 chore(deps): update dependency glob to v10.3.15 2024-05-13 00:05:29 -04:00
renovate[bot]
5090a62594 fix(deps): update dependency @edx/frontend-component-header to v5.3.0 2024-05-06 02:08:43 -04:00
renovate[bot]
dc2bbee481 chore(deps): update dependency @testing-library/jest-dom to v6.4.5 2024-05-06 02:08:19 -04:00
edX requirements bot
8dc37f9bba chore: update browserslist DB (#1011)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-05-02 08:41:19 -04:00
renovate[bot]
14d93d2f6c fix(deps): update dependency @edx/frontend-component-footer to v13.1.0 2024-04-29 07:51:45 +00:00
renovate[bot]
768351fc15 chore(deps): update commitlint monorepo to v19.3.0 2024-04-29 03:51:20 -04:00
edX requirements bot
c3dc8b7330 chore: update browserslist DB (#1005)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-04-22 16:08:58 -04:00
renovate[bot]
9fd2d3f75a fix(deps): update dependency @edx/frontend-component-header to v5.2.0 2024-04-22 02:32:02 -04:00
renovate[bot]
760fa0c6a2 chore(deps): update dependency @openedx/frontend-build to v13.1.4 2024-04-22 02:31:34 -04:00
renovate[bot]
cf6a62266c fix(deps): update dependency @edx/frontend-platform to v7.1.4 2024-04-22 00:55:37 -04:00
renovate[bot]
f16fd36a24 fix(deps): update dependency @edx/frontend-component-footer to v13.0.5 2024-04-22 00:55:18 -04:00
Maxwell Frank
c30e1b3f17 chore(deps): upgrade to paragon v22 (#1004) 2024-04-19 13:33:52 -04:00
edX requirements bot
9985afde2d chore: update browserslist DB (#994)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-04-18 12:55:51 -07:00
renovate[bot]
ccd6e95f70 fix(deps): update font awesome to v6.5.2 2024-04-15 00:10:56 -04:00
renovate[bot]
fb904a5cc2 chore(deps): update commitlint monorepo to v19.2.2 2024-04-15 04:10:34 +00:00
renovate[bot]
a255bbe2b8 chore(deps): update commitlint monorepo 2024-04-01 02:50:14 -04:00
renovate[bot]
a314878cc4 fix(deps): update react-router monorepo to v6.22.3 2024-04-01 06:49:51 +00:00
renovate[bot]
61b8b0a509 fix(deps): update dependency @edx/frontend-platform to v7.1.3 2024-04-01 04:37:36 +00:00
renovate[bot]
f144cd857e chore(deps): update dependency glob to v10.3.12 2024-04-01 00:37:08 -04:00
Justin Hynes
c922a1cd29 revert: "chore(deps): update dependency @testing-library/react to v14" (#993)
This reverts commit a3611b026c. This version of `testing-library/react` doesn't play well with our current version of React.

We shouldn't upgrade this library until we're running a newer version of React in this MFE.
2024-03-29 10:59:43 -04:00
dependabot[bot]
6cefe7b3c0 build(deps): bump express and @openedx/frontend-build (#992)
Bumps [express](https://github.com/expressjs/express) to 4.19.2 and updates ancestor dependency [@openedx/frontend-build](https://github.com/openedx/frontend-build). These dependencies need to be updated together.


Updates `express` from 4.18.2 to 4.19.2
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2)

Updates `@openedx/frontend-build` from 13.0.29 to 13.0.30
- [Release notes](https://github.com/openedx/frontend-build/releases)
- [Commits](https://github.com/openedx/frontend-build/compare/v13.0.29...v13.0.30)

---
updated-dependencies:
- dependency-name: express
  dependency-type: indirect
- dependency-name: "@openedx/frontend-build"
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-29 08:20:28 -04:00
renovate[bot]
a3611b026c chore(deps): update dependency @testing-library/react to v14 2024-03-29 08:20:14 -04:00
edX requirements bot
d33d3d9a4b chore: update browserslist DB (#988)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-03-29 08:19:37 -04:00
dependabot[bot]
ec68baa74e build(deps): bump webpack-dev-middleware from 5.3.3 to 5.3.4 (#987)
Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.3 to 5.3.4.
- [Release notes](https://github.com/webpack/webpack-dev-middleware/releases)
- [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.3...v5.3.4)

---
updated-dependencies:
- dependency-name: webpack-dev-middleware
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-29 08:19:14 -04:00
renovate[bot]
7216b0f5cb fix(deps): update dependency core-js to v3.36.1 2024-03-25 11:50:35 +00:00
renovate[bot]
83b21bff7d chore(deps): update dependency @openedx/frontend-build to v13.0.29 2024-03-25 08:24:53 +00:00
dependabot[bot]
cb52875651 build(deps): bump follow-redirects from 1.15.4 to 1.15.6 (#984)
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-20 14:31:07 -07:00
Samir Sabri
89bcceaadc feat!: remove Transifex calls for OEP-58 (#889) 2024-03-20 09:31:47 -04:00
edX requirements bot
51dc454948 chore: update browserslist DB (#981)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-03-18 11:57:00 -07:00
renovate[bot]
c7d57e24c3 fix(deps): update dependency @edx/frontend-platform to v7.1.2 2024-03-18 14:18:38 +00:00
renovate[bot]
54c702fb7f fix(deps): update dependency @edx/frontend-component-footer to v13.0.4 2024-03-18 11:31:15 +00:00
renovate[bot]
da6c9ebd1e fix(deps): update dependency @edx/frontend-platform to v7.1.1 2024-03-11 11:04:34 +00:00
renovate[bot]
f987e45c97 fix(deps): update dependency @edx/frontend-component-footer to v13.0.3 2024-03-11 10:41:35 +00:00
edX requirements bot
1f2ac2e1e7 chore: update browserslist DB (#977)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-03-07 10:29:27 -05:00
mashal-m
b13c26b06a refactor: remova paranthesis 2024-03-04 14:52:12 -03:00
mashal-m
b5ace63438 feat: add profile config in env files 2024-03-04 14:52:12 -03:00
mashal-m
15a81ee09f feat: replace legacy LMS url with account mfe url 2024-03-04 14:52:12 -03:00
renovate[bot]
fecfdc101c fix(deps): update react-router monorepo to v6.22.2 2024-03-04 12:39:13 +00:00
renovate[bot]
4fdf3ef190 chore(deps): update commitlint monorepo to v19.0.3 2024-03-04 10:09:31 +00:00
dependabot[bot]
88f4ac2349 build(deps): bump es5-ext from 0.10.62 to 0.10.63 (#974)
Bumps [es5-ext](https://github.com/medikoo/es5-ext) from 0.10.62 to 0.10.63.
- [Release notes](https://github.com/medikoo/es5-ext/releases)
- [Changelog](https://github.com/medikoo/es5-ext/blob/main/CHANGELOG.md)
- [Commits](https://github.com/medikoo/es5-ext/compare/v0.10.62...v0.10.63)

---
updated-dependencies:
- dependency-name: es5-ext
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-27 15:58:11 -05:00
renovate[bot]
deaebd3333 chore(deps): update commitlint monorepo to v19 (#971)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-27 15:39:37 -05:00
Omar Al-Ithawi
6b0655aed3 fix: get @edx/openedx-atlas back to fix Tutor MFE
this is a partial revert for bd4b79baa0
which broke Tutor MFE.
2024-02-27 14:46:16 -03:00
edX requirements bot
2901345ea6 chore: update browserslist DB (#973)
Co-authored-by: justinhynes <3229735+justinhynes@users.noreply.github.com>
2024-02-26 15:53:47 -05:00
renovate[bot]
e51677b0f0 chore(deps): update dependency @testing-library/jest-dom to v6 2024-02-26 11:12:07 +00:00
Mashal Malik
676166a160 refactor: replace @edx/paragon and @edx/frontend-build (#945)
* refactor: replace @edx/paragon and @edx/frontend-build

* refactor: updated edx packages

---------

Co-authored-by: mashal-m <mashal.malik@arbisoft.com>
Co-authored-by: Bilal Qamar <59555732+BilalQamar95@users.noreply.github.com>
2024-02-22 09:21:04 -08:00
Deborah Kaplan
761995b623 Merge pull request #967 from openedx/update-browserslist-db
Update browserslist DB
2024-02-21 15:08:55 -05:00
renovate[bot]
abc1b682d4 fix(deps): update dependency core-js to v3.36.0 2024-02-19 12:06:58 +00:00
renovate[bot]
3b37cbb76c fix(deps): update react-router monorepo to v6.22.1 2024-02-19 10:11:11 +00:00
jsnwesson
6c6229916e chore: update browserslist DB 2024-02-19 00:09:15 +00:00
edX requirements bot
2aeb7b0710 chore: update browserslist DB (#963)
Co-authored-by: jsnwesson <62807795+jsnwesson@users.noreply.github.com>
2024-02-15 10:42:46 -08:00
dependabot[bot]
a36c0629e9 build(deps): bump follow-redirects from 1.15.2 to 1.15.4 (#951)
Bumps follow-redirects from 1.15.2 to 1.15.4.
---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-15 10:33:35 -08:00
renovate[bot]
5a9d3887a7 fix(deps): update dependency @redux-devtools/extension to v3.3.0 2024-02-12 10:48:35 +00:00
Maxwell Frank
3fdd68b203 Merge pull request #958 from openedx/update-browserslist-db
Update browserslist DB
2024-02-05 14:43:57 -05:00
renovate[bot]
a1264deda0 fix(deps): replace dependency redux-devtools-extension with @redux-devtools/extension 3.0.0 (#960)
* fix(deps): replace dependency redux-devtools-extension with @redux-devtools/extension 3.0.0

* fix: dependency import

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Maxwell Frank <mfrank@2u.com>
2024-02-05 14:33:19 -05:00
renovate[bot]
f9fa5360d9 fix(deps): update react-router monorepo to v6.22.0 2024-02-05 10:59:24 +00:00
jsnwesson
b4a1ec6e60 chore: update browserslist DB 2024-02-05 00:09:10 +00:00
Omar Al-Ithawi
c30eb00c8d feat: tutor-mfe compatiblilty for atlas pull (#959)
- install atlas
 - remove `--filter` to pull all languages by default
 - use ATLAS_OPTIONS to allow custom `--filter`
 - include frontend-platform in `atlas pull`

Refs: FC-0012 OEP-58
2024-01-30 12:19:40 -05:00
Deborah Kaplan
fc75405597 Merge pull request #823 from openedx/renovate/major-font-awesome
fix(deps): update font awesome to v6 (major)
2024-01-24 16:54:49 -05:00
Deborah Kaplan
5726470881 feat: updating the snapshots
update jest snapshots
2024-01-24 21:33:26 +00:00
renovate[bot]
6bbae1f7f0 fix(deps): update font awesome to v6 2024-01-23 19:47:43 +00:00
Deborah Kaplan
ef5fe2fa91 Merge pull request #954 from openedx/update-browserslist-db
Update browserslist DB
2024-01-23 14:46:32 -05:00
Deborah Kaplan
585856ad89 Merge pull request #941 from openedx/bilalqamar95/enzyme-to-rtl-migration
feat: migrated tests from enzyme to RTL
2024-01-22 12:23:51 -05:00
Syed Ali Abbas Zaidi
8d1dbfe55d Merge branch 'master' of github.com:openedx/frontend-app-profile into bilalqamar95/enzyme-to-rtl-migration 2024-01-22 17:42:03 +05:00
renovate[bot]
8a9c78662f fix(deps): update react-router monorepo to v6.21.3 2024-01-22 12:39:23 +00:00
Syed Ali Abbas Zaidi
8eb0029970 chore: remove react-test-renderer 2024-01-22 17:38:53 +05:00
renovate[bot]
2dc20dd3fd fix(deps): update dependency core-js to v3.35.1 2024-01-22 10:41:46 +00:00
jsnwesson
2fefab5311 chore: update browserslist DB 2024-01-22 00:09:28 +00:00
renovate[bot]
e7ab90a778 fix(deps): update dependency redux-saga to v1.3.0 2024-01-15 15:16:11 +00:00
renovate[bot]
28226e4d03 fix(deps): update dependency core-js to v3.35.0 2024-01-15 09:15:58 +00:00
vladislavkeblysh
e59ab99d45 feat: Fixed displaying banner and certificates on mobile view (#860)
* feat: fixed displaing banner and certificates on mobile view

* feat: update snapshot
2024-01-08 13:58:27 -05:00
edX requirements bot
3f1fa50608 chore: update browserslist DB (#950)
Co-authored-by: justinhynes <justinhynes@users.noreply.github.com>
2024-01-08 13:54:57 -05:00
renovate[bot]
71a37ace78 fix(deps): update dependency classnames to v2.5.1 2024-01-01 12:57:10 +00:00
renovate[bot]
d4e16347b8 fix(deps): update dependency @edx/frontend-component-header to v4.11.0 2024-01-01 10:13:43 +00:00
renovate[bot]
76c94ef0e1 fix(deps): update dependency @edx/frontend-component-footer to v12.7.0 2023-12-25 13:55:39 +00:00
renovate[bot]
db6351560a fix(deps): update dependency core-js to v3.34.0 2023-12-25 09:22:23 +00:00
Feanil Patel
bd06a7ada7 Merge pull request #940 from openedx/nedbat/catalog-info-name
build: the name in catalog-info.yaml should be the repo name
2023-12-19 09:28:33 -05:00
Bilal Qamar
42810a5e36 feat: migrated tests from enzyme to RTL 2023-12-19 15:02:27 +05:00
Ned Batchelder
01e1dd027a build: the name in catalog-info.yaml should be the repo name 2023-12-18 17:48:08 -05:00
edX requirements bot
275b7f9ba5 chore: update browserslist DB (#937)
Co-authored-by: jsnwesson <jsnwesson@users.noreply.github.com>
2023-12-18 13:54:43 -05:00
renovate[bot]
e18b6497ba fix(deps): update dependency regenerator-runtime to v0.14.1 2023-12-18 13:28:26 +00:00
renovate[bot]
14a4efe86b chore(deps): update dependency @edx/frontend-build to v13.0.14 2023-12-18 10:38:36 +00:00
Deborah Kaplan
5e602c9c0b Merge pull request #877 from openedx/renovate/actions-checkout-4.x
chore(deps): update actions/checkout action to v4
2023-12-11 15:42:36 -05:00
renovate[bot]
e2eb4a6eae chore(deps): update actions/checkout action to v4 2023-12-11 20:28:59 +00:00
Deborah Kaplan
8b195f1531 Merge pull request #931 from openedx/renovate/actions-setup-node-4.x
chore(deps): update actions/setup-node action to v4
2023-12-11 15:28:44 -05:00
renovate[bot]
650b47a631 chore(deps): update actions/setup-node action to v4 2023-12-11 16:41:39 +00:00
Deborah Kaplan
bd5c909bbc Merge pull request #934 from openedx/update-browserslist-db
Update browserslist DB
2023-12-11 11:41:20 -05:00
renovate[bot]
eb347f4d68 fix(deps): update dependency @edx/frontend-component-footer to v12.6.1 2023-12-11 14:14:14 +00:00
renovate[bot]
b3b88779b4 chore(deps): update dependency @edx/frontend-build to v13.0.12 2023-12-11 10:59:21 +00:00
jsnwesson
ade2bad564 chore: update browserslist DB 2023-12-11 00:09:18 +00:00
edX requirements bot
4ca59f0984 chore: update browserslist DB (#929)
Co-authored-by: jsnwesson <jsnwesson@users.noreply.github.com>
2023-12-04 11:23:52 -08:00
renovate[bot]
ab9b129b43 fix(deps): update react-router monorepo to v6.20.1 2023-12-04 10:32:15 +00:00
edX requirements bot
5d9ee134c1 chore: update browserslist DB (#923)
Co-authored-by: jsnwesson <jsnwesson@users.noreply.github.com>
2023-11-28 14:52:19 -05:00
Jenkins
b6e4c34b77 chore(i18n): update translations 2023-11-28 11:18:49 -05:00
renovate[bot]
c36595170d fix(deps): update dependency @edx/frontend-component-header to v4.10.1 2023-11-27 13:18:57 +00:00
renovate[bot]
cf6b4dae98 fix(deps): update dependency @edx/frontend-component-footer to v12.6.0 2023-11-27 09:07:31 +00:00
Deborah Kaplan
994852741e Merge pull request #917 from openedx/update-browserslist-db
Update browserslist DB
2023-11-21 12:51:45 -05:00
renovate[bot]
9403fd84f6 fix(deps): update dependency core-js to v3.33.3 2023-11-20 12:17:03 +00:00
renovate[bot]
4d5562e2dd chore(deps): update dependency @edx/frontend-build to v13.0.8 2023-11-20 09:24:14 +00:00
jsnwesson
cad60cff61 chore: update browserslist DB 2023-11-20 00:09:20 +00:00
Justin Hynes
a9ce16add6 chore: remove unused codecov package from package.json (#915)
[APER-2889]

The codecov package is no longer supported and we have moved to using a GitHub action for uploading coverage data. The NPM package can be removed from our requirements.
2023-11-17 10:42:26 -05:00
renovate[bot]
8a2755751b fix(deps): update dependency core-js to v3.33.2 2023-11-13 15:20:25 +00:00
renovate[bot]
1401c8b156 chore(deps): update dependency @edx/frontend-build to v13.0.5 2023-11-13 09:03:23 +00:00
Ihor Romaniuk
5cf7db140c fix: trim long text in form controls and username block (#888)
* fix: trim long text in form controls and username block
* fix: update snapshots
2023-11-08 13:56:49 -05:00
vladislavkeblysh
860d2e6f5e feat: fixed displaying field and visibility forms (#864) 2023-11-08 13:41:54 -05:00
edX requirements bot
a434c0a7b9 chore: update browserslist DB (#905)
Co-authored-by: jsnwesson <jsnwesson@users.noreply.github.com>
2023-11-08 10:34:10 -05:00
renovate[bot]
c6c5521ecf fix(deps): update dependency @edx/frontend-component-footer to v12.5.1 2023-11-06 13:50:59 +00:00
renovate[bot]
7175183d6a chore(deps): update dependency @edx/frontend-build to v13.0.4 2023-11-06 10:44:12 +00:00
Deborah Kaplan
8566cf9095 Merge pull request #903 from openedx/renovate/edx-brand-1.x-lockfile
fix(deps): update dependency @edx/brand to v1.2.3
2023-10-31 14:53:33 -04:00
Deborah Kaplan
efeedb3247 feat: fixing a conflict
ran npm i
2023-10-31 18:06:07 +00:00
renovate[bot]
a3849495d5 fix(deps): update dependency @edx/brand to v1.2.3 2023-10-31 15:00:50 +00:00
Deborah Kaplan
47a7d77e55 Merge pull request #898 from openedx/mashal-m/update-README
refactor: updated README file to reflect template changes
2023-10-31 11:00:20 -04:00
Deborah Kaplan
943ff02a38 Merge pull request #901 from openedx/update-browserslist-db
Update browserslist DB
2023-10-30 16:40:41 -04:00
renovate[bot]
8b48dc8bad chore(deps): update dependency @edx/frontend-build to v13.0.3 2023-10-30 09:50:11 +00:00
jsnwesson
e195dbf1b4 chore: update browserslist DB 2023-10-30 00:09:08 +00:00
mashal-m
7ae5956f06 refactor: updated README file to reflect template changes 2023-10-25 11:27:02 +05:00
edX requirements bot
f48a06b8c5 chore: update browserslist DB (#890)
Co-authored-by: jsnwesson <jsnwesson@users.noreply.github.com>
2023-10-23 12:56:24 -07:00
Muhammad Abdullah Waheed
48d2766c13 feat: babel-plugin-react-intl to babel-plugin-formatjs migration (#855)
* feat: babel-plugin-react-intl to babel-plugin-formatjs migration

* fix: upgraded frontend-build to fix security issue
2023-10-23 12:49:15 -07:00
renovate[bot]
d677d11558 fix(deps): update dependency @edx/frontend-component-header to v4.8.0 2023-10-23 17:22:25 +00:00
renovate[bot]
c396800657 fix(deps): update dependency @edx/frontend-component-footer to v12.5.0 2023-10-23 13:37:46 +00:00
renovate[bot]
1baf21aad9 fix(deps): update dependency core-js to v3.33.1 2023-10-23 09:42:17 +00:00
renovate[bot]
dc068cbf33 chore(deps): update commitlint monorepo to v17.8.1 2023-10-23 06:09:58 +00:00
Feanil Patel
2f8b9963ce chore: Update to the new version of brand-openedx in the new scope. (#886)
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 14:31:21 -04:00
renovate[bot]
6957ad0401 fix(deps): update dependency core-js to v3.33.0 (#876)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-16 12:40:15 -04:00
dependabot[bot]
ce616fa409 build(deps): bump @babel/traverse from 7.22.5 to 7.23.2 (#879)
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-16 12:32:19 -04:00
renovate[bot]
e216036d8d fix(deps): update dependency @edx/frontend-platform to v5.6.1 (#875)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-16 12:29:39 -04:00
edX requirements bot
69cacc1e3b chore: update browserslist DB (#871)
Co-authored-by: jsnwesson <jsnwesson@users.noreply.github.com>
2023-10-16 12:18:30 -04:00
Stanislav
8f6b96983f fix: Add ID attribute to the main content (#845)
Co-authored-by: Stanislav Lunyachek <lunyachek@MacBook-Pro-M1.local>
2023-10-16 12:17:28 -04:00
Syed Ali Abbas Zaidi
779c5078ca chore: bump frontend-platform (#869) 2023-10-16 17:12:03 +05:00
renovate[bot]
e6c3d10b37 fix(deps): update dependency @edx/frontend-component-footer to v12.4.0 2023-10-16 10:14:10 +00:00
renovate[bot]
4cc9e53a4d chore(deps): update commitlint monorepo to v17.8.0 2023-10-16 07:22:04 +00:00
renovate[bot]
88b583865a fix(deps): update dependency @edx/paragon to v20.46.3 2023-10-16 06:53:57 +00:00
Deborah Kaplan
43f485d841 Merge pull request #850 from openedx/update-browserslist-db
Update browserslist DB
2023-10-10 11:06:24 -04:00
renovate[bot]
b892ba763e fix(deps): update dependency @edx/frontend-component-header to v4.7.1 2023-10-09 16:53:45 +00:00
renovate[bot]
896905b457 fix(deps): update dependency @edx/frontend-component-footer to v12.3.0 2023-10-09 10:34:37 +00:00
jsnwesson
095b91c8cb chore: update browserslist DB 2023-10-09 00:09:13 +00:00
renovate[bot]
a6e63a8686 chore(deps): update dependency glob to v10.3.10 2023-10-02 17:03:40 +00:00
renovate[bot]
67c8d79aa2 fix(deps): update dependency @edx/frontend-component-header to v4.6.1 2023-10-02 13:24:41 +00:00
renovate[bot]
f76185d57d chore(deps): update dependency @edx/frontend-build to v12.9.17 2023-10-02 09:40:44 +00:00
renovate[bot]
f0678ca94c chore(deps): update dependency @commitlint/cli to v17.7.2 2023-10-02 06:30:56 +00:00
Mashal Malik
e73b646263 refactor: add openedx in renovate automate configuration (#849) 2023-09-28 12:21:18 -04:00
renovate[bot]
ddb8494471 fix(deps): update dependency @edx/frontend-platform to v5.4.0 2023-09-25 15:09:40 +00:00
edX requirements bot
a576bdf98b chore: update browserslist DB (#846)
Co-authored-by: jsnwesson <jsnwesson@users.noreply.github.com>
2023-09-25 09:01:20 -04:00
renovate[bot]
21dcadba5b chore(deps): update dependency glob to v10.3.7 2023-09-25 09:21:59 +00:00
Deborah Kaplan
e770101e4e Merge pull request #842 from openedx/update-browserslist-db
Update browserslist DB
2023-09-18 12:49:47 -04:00
renovate[bot]
8ca5ea5809 fix(deps): update react-router monorepo to v6.16.0 2023-09-18 10:09:02 +00:00
renovate[bot]
d687ea30cb fix(deps): update dependency regenerator-runtime to v0.14.0 2023-09-18 07:58:45 +00:00
jsnwesson
ecda751786 chore: update browserslist DB 2023-09-18 00:08:53 +00:00
edX requirements bot
e58b174c9e chore: update browserslist DB (#839)
Co-authored-by: jsnwesson <jsnwesson@users.noreply.github.com>
2023-09-15 14:37:58 -07:00
edx-transifex-bot
6c82805c7a chore(i18n): update translations (#838)
Co-authored-by: Jenkins <sre+jenkins@edx.org>
2023-09-15 14:37:47 -07:00
renovate[bot]
d1d98794ab fix(deps): update dependency @edx/frontend-platform to v5.3.2 2023-09-11 16:58:08 +00:00
renovate[bot]
3c7baaa91b fix(deps): update dependency core-js to v3.32.2 2023-09-11 09:39:16 +00:00
Syed Ali Abbas Zaidi
fe800f2ee9 feat: upgrade react router to v6 (#716)
* feat: upgrade react router to v6
* refactor: add hoc to use params
* fix: lint issue
2023-09-05 14:55:23 -04:00
Mashal Malik
e1d4e9b474 refactor: update lock file version (#834) 2023-09-05 14:49:02 -04:00
edX requirements bot
cf7568bcfb chore: update browserslist DB (#829)
Co-authored-by: jsnwesson <jsnwesson@users.noreply.github.com>
2023-09-05 14:46:18 -04:00
renovate[bot]
a0fd863bc4 fix(deps): update dependency @edx/frontend-component-footer to v12.2.1 2023-09-04 09:53:06 +00:00
renovate[bot]
b63341fe99 chore(deps): update dependency glob to v10.3.4 2023-09-04 08:36:20 +00:00
renovate[bot]
1887167d0e fix(deps): update dependency core-js to v3.32.1 2023-08-21 13:43:20 +00:00
renovate[bot]
57de2b4156 chore(deps): update dependency @edx/frontend-build to v12.9.10 2023-08-21 10:09:12 +00:00
renovate[bot]
aaf6935577 fix(deps): update dependency @edx/frontend-component-header to v4.5.2 2023-08-14 16:30:15 +00:00
renovate[bot]
03b7859b20 chore(deps): update commitlint monorepo 2023-08-14 09:24:21 +00:00
edX requirements bot
2800e89f02 chore: update browserslist DB (#825)
Co-authored-by: jsnwesson <jsnwesson@users.noreply.github.com>
2023-08-10 07:40:49 -04:00
Emad Rad
0cc03e5fec chore: translations updated (#828) 2023-08-07 14:02:54 -07:00
renovate[bot]
44f1a5f0cd fix(deps): update dependency @edx/frontend-platform to v4.6.1 2023-08-07 09:09:08 +00:00
renovate[bot]
2694f6f754 chore(deps): update dependency @edx/frontend-build to v12.9.4 2023-08-07 08:28:02 +00:00
renovate[bot]
18afe62590 fix(deps): update dependency core-js to v3.32.0 2023-07-31 10:26:36 +00:00
renovate[bot]
0b6d3dc9ac chore(deps): update dependency @edx/frontend-build to v12.9.3 2023-07-31 06:56:55 +00:00
edX requirements bot
bd5984f27b chore: update browserslist DB (#813)
Co-authored-by: jsnwesson <jsnwesson@users.noreply.github.com>
2023-07-25 14:48:37 -04:00
Omar Al-Ithawi
f899727f8d feat: include paragon in atlas pull (#811)
This pull request is part of the [FC-0012 project](https://openedx.atlassian.net/l/cp/XGS0iCcQ) which is sparked by the [Translation Infrastructure update OEP-58](https://open-edx-proposals.readthedocs.io/en/latest/architectural-decisions/oep-0058-arch-translations-management.html#specification).
2023-07-25 11:22:15 -04:00
renovate[bot]
803a2d5572 fix(deps): update dependency core-js to v3.31.1 2023-07-24 13:49:10 +00:00
renovate[bot]
93b0b1b9da fix(deps): update dependency @edx/frontend-component-header to v4.4.4 2023-07-24 10:27:39 +00:00
renovate[bot]
22b01f347d chore(deps): update commitlint monorepo to v17.6.7 2023-07-24 07:53:18 +00:00
Mashal Malik
b537f1f82d chore: add paragon messages (#798) 2023-07-21 11:08:29 +05:00
Deborah Kaplan
c42e339051 Merge pull request #800 from openedx/update-browserslist-db
Update browserslist DB
2023-07-20 11:15:12 -04:00
Deborah Kaplan
528bbcbad8 Merge pull request #805 from openedx/dependabot/npm_and_yarn/semver-5.7.2
build(deps): bump semver from 5.7.1 to 5.7.2
2023-07-20 11:02:08 -04:00
renovate[bot]
fcc5ce77e7 fix(deps): update dependency @edx/paragon to v20.45.2 2023-07-17 17:19:14 +00:00
renovate[bot]
ff4cd80ff2 fix(deps): update dependency @edx/frontend-component-header to v4.4.3 2023-07-17 12:24:56 +00:00
dependabot[bot]
25a6093a78 build(deps): bump semver from 5.7.1 to 5.7.2
Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-17 09:41:10 +00:00
renovate[bot]
d3a4b4b62d chore(deps): update dependency @edx/frontend-build to v12.8.66 2023-07-17 09:39:54 +00:00
renovate[bot]
fd52682b5c fix(deps): update dependency @edx/frontend-component-footer to v12.1.2 2023-07-17 06:41:39 +00:00
jsnwesson
a6eb5f75d1 chore: update browserslist DB 2023-07-17 00:10:44 +00:00
Emad Rad
6803fb5199 Feature: Persian language (#620)
* feat: Persian translations added

* feat: persian language added to messages

* feat: fa_IR added to transifex_langs
2023-07-12 10:07:50 -07:00
Swayam Rana
f05db64d49 Merge pull request #790 from openedx/swayamrana-pact
feat: Pact Consumer Contract Testing on LMS Account API
2023-07-11 11:22:08 -04:00
Swayam Rana
038c2a845f feat: Pact Contract Consumer testing with the Account API, and implement stub script 2023-07-11 15:15:33 +00:00
renovate[bot]
105486a44a fix(deps): update dependency @edx/frontend-component-header to v4.4.0 2023-07-10 15:51:59 +00:00
renovate[bot]
7b44687db9 fix(deps): update dependency @edx/frontend-component-footer to v12.1.1 2023-07-10 14:36:42 +00:00
renovate[bot]
7aeac7be3b chore(deps): update dependency glob to v10.3.3 2023-07-10 11:08:03 +00:00
renovate[bot]
d4665797a1 chore(deps): update dependency @edx/frontend-build to v12.8.60 2023-07-10 07:14:11 +00:00
Bilal Qamar
4a02f0ef6d feat: update react & react-dom to v17 (#769)
* feat: update react & react-dom to v17
* build: update lock file and paragon
* Merge branch 'master' of github.com:openedx/frontend-app-profile into bilalqamar95/react-upgrade-to-v17
* refactor: updated edx packages
---------

Co-authored-by: mashal-m <mashal.malik@arbisoft.com>
2023-07-07 10:17:53 -04:00
Jason Wesson
b0b8e96025 build: add catalog-info yaml and update README (#797)
* These updates and additions aim to meet the Maintainership Pilot Phase 1 requirements

Co-authored-by: Jason Wesson <jwesson@2u.com>
2023-07-05 12:08:06 -07:00
renovate[bot]
6d5c150d2f chore(deps): update dependency glob to v10 (#793)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-03 10:55:50 -07:00
Eugene Dyudyunov
549d51509b fix: error when trying to save 'other education' (#667)
When user selects "Other Education" and clicks save - error occurs.

It's caused by the wrong API call payload value `'o'`
Fix: use the `'other'` payload value instead (the valid one).
2023-07-03 10:22:13 -07:00
Yoiber
ba74aef631 chore(i18n): add more languages (#689)
* chore(i18n): add more languages
2023-07-03 10:20:05 -07:00
edX requirements bot
941652aba2 chore: update browserslist DB (#781)
Co-authored-by: jsnwesson <jsnwesson@users.noreply.github.com>
2023-07-03 10:15:59 -07:00
renovate[bot]
3b68201748 fix(deps): update dependency @edx/frontend-component-header to v4.2.3 (#743)
* fix(deps): update dependency @edx/frontend-component-header to v4.2.3

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jason Wesson <jwesson@2u.com>
2023-07-03 10:13:11 -07:00
renovate[bot]
2b8f5a8b3d fix(deps): update dependency history to v5 (#794)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-03 10:04:22 -07:00
Maxwell Frank
235644e570 Merge pull request #791 from openedx/mfrank/remove-skills-builder-master
refactor: remove Skills Builder
2023-07-03 09:11:34 -04:00
Maxwell Frank
5e0eef68e3 refactor: remove Skills Builder 2023-07-03 13:00:47 +00:00
renovate[bot]
4692477738 fix(deps): update dependency react-instantsearch-hooks-web to v6.45.0 2023-07-03 06:15:35 +00:00
renovate[bot]
465d3b481a fix(deps): update dependency algoliasearch to v4.18.0 2023-06-26 15:57:05 +00:00
renovate[bot]
79e29c46c5 fix(deps): update dependency @edx/paragon to v20.45.0 2023-06-26 13:32:44 +00:00
renovate[bot]
97e70fa4ab chore(deps): update dependency @edx/frontend-build to v12.8.57 2023-06-26 10:16:08 +00:00
renovate[bot]
60fec4152f chore(deps): update commitlint monorepo to v17.6.6 2023-06-26 07:16:12 +00:00
Maxwell Frank
26a82ec109 Merge pull request #776 from openedx/update-browserslist-db
Update browserslist DB
2023-06-21 13:09:03 -04:00
renovate[bot]
bf03f8b5ef fix(deps): update dependency react-instantsearch-hooks-web to v6.44.3 2023-06-19 17:51:20 +00:00
renovate[bot]
2a4addbb38 fix(deps): update dependency core-js to v3.31.0 2023-06-19 14:19:55 +00:00
renovate[bot]
e2b9ef7a2f fix(deps): update dependency @edx/paragon to v20.44.0 2023-06-19 11:34:11 +00:00
renovate[bot]
a6bcc9c054 chore(deps): update dependency @edx/frontend-build to v12.8.54 2023-06-19 06:49:52 +00:00
jsnwesson
31d2c07c5b chore: update browserslist DB 2023-06-19 00:08:41 +00:00
Jason Wesson
03e352208f fix: switch out class overwrite in SCSS for an aria-label selector (#771)
* fix: switch out class overwrite in SCSS for an aria-label selector

---------

Co-authored-by: Jason Wesson <jwesson@2u.com>
2023-06-15 11:22:46 -07:00
Maxwell Frank
ac7285dac5 Merge pull request #775 from openedx/mfrank/switch-for-lob
Query string to act as switch for lines of business
2023-06-15 10:01:36 -04:00
Maxwell Frank
60fe9cff9a feat: adding lines of business 2023-06-15 13:27:10 +00:00
edX requirements bot
93f757f3d7 chore: update browserslist DB (#699)
Co-authored-by: jsnwesson <jsnwesson@users.noreply.github.com>
2023-06-14 13:36:48 -07:00
renovate[bot]
6740ad3672 fix(deps): update dependency algoliasearch to v4.17.2 2023-06-12 16:25:54 +00:00
renovate[bot]
ca14d3d279 chore(deps): update dependency @edx/frontend-build to v12.8.51 2023-06-12 12:00:55 +00:00
Jenkins
9dbe58b10f chore(i18n): update translations 2023-06-11 16:40:53 -04:00
Jason Wesson
50d80ef614 fix: adjust header height and content when window is medium in width or less (#756)
* fix: adjust header height and content when window is medium in width or less

* feat: convert stepper header's contents to compact view for medium windows (or less)

---------

Co-authored-by: Jason Wesson <jwesson@2u.com>
2023-06-06 11:10:00 -07:00
renovate[bot]
fe6b76da7e fix(deps): update dependency @edx/frontend-platform to v4.5.1 2023-06-05 12:46:05 +00:00
renovate[bot]
7fff13137d chore(deps): update dependency @edx/frontend-build to v12.8.40 2023-06-05 10:26:23 +00:00
renovate[bot]
91282cff74 chore(deps): update commitlint monorepo to v17.6.5 2023-06-05 07:50:24 +00:00
renovate[bot]
45be830f18 fix(deps): update dependency core-js to v3.30.2 2023-05-29 12:15:11 +00:00
renovate[bot]
122affbb6d fix(deps): update dependency @edx/frontend-platform to v4.5.0 2023-05-29 11:07:30 +00:00
renovate[bot]
48a97b769f fix(deps): update dependency algoliasearch to v4.17.1 2023-05-29 08:24:04 +00:00
renovate[bot]
bdcc09f6ba chore(deps): update dependency @edx/frontend-build to v12.8.38 2023-05-29 06:05:47 +00:00
Maxwell Frank
ac4fb6a340 Merge pull request #757 from openedx/mfrank/fallback-img-typo
fix: fallback src typo for course cards
2023-05-25 13:01:59 -04:00
Maxwell Frank
409d365125 fix: fallback src typo for course cards 2023-05-25 16:15:20 +00:00
Jason Wesson
53985e94d8 fix: disable 'select a goal' from goal dropdown when a goal has been selected (#755)
* hide the second and third portion of skills form if currentGoal is false
2023-05-23 07:57:25 -07:00
renovate[bot]
0d9a39afd7 fix(deps): update dependency @edx/frontend-platform to v4.4.0 2023-05-23 04:18:26 +00:00
renovate[bot]
cbb860bb16 chore(deps): update dependency @edx/reactifex to v2.2.0 2023-05-23 01:34:22 +00:00
Justin Hynes
695df9aa0b fix: filter out non-English courses from recommendations (#752)
[APER-2444]

This PR updates the `getProductRecommendations` utiltiy function, adding a filter to only include English courses in our recommendations.
2023-05-22 13:13:43 -04:00
Maxwell Frank
603304b799 Merge pull request #751 from openedx/mfrank/fix-close-exit-buttons
fix: close and exit buttons
2023-05-18 13:58:42 -04:00
Maxwell Frank
d3e5931d05 fix: close and exit buttons 2023-05-18 17:52:40 +00:00
renovate[bot]
6804f7e127 fix(deps): update dependency algoliasearch to v4.17.0 2023-05-17 22:25:05 +00:00
Maxwell Frank
4b16673780 Merge pull request #750 from openedx/mfrank/reduce-event-payload
fix: reduce event payload
2023-05-17 11:12:10 -04:00
Maxwell Frank
6674025bd4 fix: reduce event payload 2023-05-17 14:38:15 +00:00
renovate[bot]
0dab2d03eb chore(deps): update commitlint monorepo to v17.6.3 2023-05-15 09:41:55 +00:00
Jenkins
df1a84feb7 chore(i18n): update translations 2023-05-14 16:40:48 -04:00
Bilal Qamar
334a9b090e feat: upgraded to node v18, added .nvmrc and updated workflows (#712)
* feat: upgraded to node v18, added .nvmrc and updated workflows

* build: updated frontend-build, frontend-platform, component-footer & component-header packages

* refactor: updated snapshots

* refactor: updated snapshots
2023-05-12 14:09:48 -04:00
Maxwell Frank
5d06276838 Merge pull request #745 from openedx/mfrank/adding-configure-component
fix: remove filtering from current job select
2023-05-11 09:20:43 -04:00
Maxwell Frank
e391e427f1 fix: remove filtering from current job select 2023-05-11 13:05:04 +00:00
Maxwell Frank
b71328fd3f Merge pull request #744 from openedx/mfrank/adding-configure-component
fix: adding configure component to filter jobs
2023-05-10 16:40:11 -04:00
Maxwell Frank
3b9b3f8840 fix: adding configure component to filter jobs 2023-05-10 20:34:29 +00:00
Maxwell Frank
30e837306f Merge pull request #739 from openedx/mfrank/segement-events
APER-2333: Dispatch segment events from JS components
2023-05-10 15:45:35 -04:00
Maxwell Frank
c7a0c1d799 feat: adding analytics 2023-05-09 13:29:38 +00:00
renovate[bot]
337c97e3a0 chore(deps): update dependency @edx/frontend-build to v12.8.27 2023-05-08 09:32:26 +00:00
renovate[bot]
0de4496953 fix(deps): update dependency @edx/paragon to v20.32.3 2023-05-01 10:06:44 +00:00
renovate[bot]
359ae7f1fb chore(deps): update dependency @edx/frontend-build to v12.8.16 2023-05-01 07:10:23 +00:00
Omar Al-Ithawi
8d467f01dc feat: use atlas in make pull_translations (#732)
- Bump frontend-platform to bring intl-imports.js script
 - Move all i18n imports into `src/i18n/index.js` so intl-imports.js can override it with latest translations
 - Add `atlas` into `make pull_translations` when `OPENEDX_ATLAS_PULL` environment variable is set.

This pull request is part of the [FC-0012 project](https://openedx.atlassian.net/l/cp/XGS0iCcQ) which is sparked by the [Translation Infrastructure update OEP-58](https://open-edx-proposals.readthedocs.io/en/latest/architectural-decisions/oep-0058-arch-translations-management.html#specification).
2023-04-25 09:33:22 -04:00
renovate[bot]
20debcd79e fix(deps): update dependency reselect to v4.1.8 2023-04-24 13:13:42 +00:00
renovate[bot]
6a7cbf88df fix(deps): update dependency @edx/frontend-component-footer to v11.7.4 2023-04-24 09:34:43 +00:00
Jenkins
1b3880ee1b chore(i18n): update translations 2023-04-23 16:40:44 -04:00
renovate[bot]
79cebaf6df fix(deps): update dependency @edx/frontend-component-footer to v11.7.2 2023-04-17 15:00:56 +00:00
renovate[bot]
8686af563e chore(deps): update dependency @edx/frontend-build to v12.8.10 2023-04-17 10:24:54 +00:00
renovate[bot]
85d85007d2 fix(deps): update dependency @edx/frontend-component-footer to v11.7.1 2023-04-10 13:30:36 +00:00
renovate[bot]
9276fe25ad chore(deps): update dependency @edx/frontend-build to v12.8.6 2023-04-10 09:32:52 +00:00
Jenkins
9c2dd68752 chore(i18n): update translations 2023-04-02 16:40:41 -04:00
Maxwell Frank
e4a9045e89 feat: course recommendations for Skills Builder with fix 2023-03-30 15:34:43 -04:00
Maxwell Frank
c1bbbe488a feat: skills builder course recommendations 2023-03-30 19:26:29 +00:00
Maxwell Frank
45ab2f8175 Merge pull request #725 from openedx/revert-721-mfrank/course-recommendations
Revert "feat: course recommendations for Skills Builder"
2023-03-28 14:34:51 -04:00
Maxwell Frank
d9c7096fd7 Revert "feat: course recommendations for Skills Builder" 2023-03-28 14:05:18 -04:00
Maxwell Frank
c6825393c6 feat: course recommendations for Skills Builder
feat: course recommendations for Skills Builder
2023-03-28 09:37:59 -04:00
renovate[bot]
9354f11a99 fix(deps): update dependency @edx/frontend-component-header to v3.6.5 2023-03-28 12:04:23 +00:00
renovate[bot]
e7fc8f52fb chore(deps): update dependency @commitlint/cli to v17.5.1 2023-03-28 10:16:30 +00:00
Maxwell Frank
d8c8f5d7bd feat: course recommendations for Skills Builder 2023-03-27 19:28:46 +00:00
renovate[bot]
e5355e7ac8 chore(deps): update dependency @edx/frontend-build to v12.6.2 2023-03-24 09:14:55 +00:00
Maxwell Frank
99a80d3e66 Merge pull request #718 from openedx/mfrank/authenticated-page-route
fix: authenticated page route
2023-03-22 10:56:11 -04:00
Maxwell Frank
abf9860f62 fix: authenticated page route 2023-03-20 13:39:01 +00:00
renovate[bot]
ccc62a0e48 fix(deps): update dependency redux-saga to v1.2.3 2023-03-20 10:39:41 +00:00
renovate[bot]
650d3d469f fix(deps): update dependency @edx/paragon to v20.28.5 2023-03-20 08:06:56 +00:00
renovate[bot]
ab80fd7671 fix(deps): update dependency @edx/frontend-component-header to v3.6.4 2023-03-13 13:09:42 +00:00
Mashal Malik
f55b304732 refactor: remove unused tranisfex v2 url (#704) 2023-03-13 10:45:28 +05:00
Jenkins
65971820d4 chore(i18n): update translations 2023-03-12 16:40:39 -04:00
Maxwell Frank
7da386264b Merge pull request #706 from openedx/mfrank/retrieving-job-skills-data
APER-2187 Render jobs and related skills for Skills Builder
2023-03-08 14:03:46 -05:00
Maxwell Frank
b1fe21cded feat: SkillsBuilder jobs with related skills 2023-03-07 19:07:10 +00:00
Jenkins
40225d7db3 chore(i18n): update translations 2023-03-05 15:40:37 -05:00
Maxwell Frank
b4ba5276ae Merge pull request #702 from openedx/mfrank/adding-career-interests
feat: SkillsBuilder career interests selection
2023-02-28 14:55:57 -05:00
Maxwell Frank
ddff5364ce feat: SkillsBuilder career interests selection 2023-02-28 19:51:16 +00:00
David Joy
f57f5c4725 docs: update the maintaining group to openedx/2u-aperture (#703)
The @edx/arch-fed group no longer exists - this repo is maintained by the @openedx/2u-aperture team.
2023-02-28 13:46:03 -05:00
Feanil Patel
e6feef00eb Merge pull request #696 from openedx/repo_checks/ensure_workflows
Update standard workflow files.
2023-02-27 22:36:12 -05:00
Maxwell Frank
87487e37d7 Merge pull request #693 from openedx/mfrank/goals-and-job-select-v2
APER-2186: adding goal and job title selection
2023-02-27 09:16:06 -05:00
renovate[bot]
6b451a4437 fix(deps): update dependency @edx/frontend-component-footer to v11.6.3 2023-02-27 12:33:52 +00:00
renovate[bot]
b10b31860d chore(deps): update commitlint monorepo to v17.4.4 2023-02-27 09:29:59 +00:00
Jenkins
83e2b66c77 chore(i18n): update translations 2023-02-26 15:40:39 -05:00
dependabot[bot]
6fa5681e91 build(deps): bump cookiejar from 2.1.3 to 2.1.4 (#674)
Bumps [cookiejar](https://github.com/bmeck/node-cookiejar) from 2.1.3 to 2.1.4.
- [Release notes](https://github.com/bmeck/node-cookiejar/releases)
- [Commits](https://github.com/bmeck/node-cookiejar/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-24 13:07:48 -08:00
dependabot[bot]
e9e48e4eb0 build(deps): bump json5 from 1.0.1 to 1.0.2 (#661)
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>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-24 13:03:26 -08:00
renovate[bot]
17b4933278 fix(deps): update dependency @edx/frontend-platform to v3 (#660)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-24 12:52:53 -08:00
Maxwell Frank
68dc8a1045 feat: first two questions of Skills Builder 2023-02-24 19:26:53 +00:00
Justin Hynes
21a3e9259d Merge pull request #695 from openedx/jhynes/aper-2262
feat: add utility function to retrieve product recommendations based on job skills
2023-02-24 09:06:26 -05:00
Justin Hynes
a6086fd4bf feat: add utility function to retrieve product recommendations based on job skills
[APER-2262]

- add a utility function to retrieve product recommendations based on skills from a job a learner is interested in
- add additional tests and coverage around new utility functions in `search.jsx`
2023-02-24 08:57:37 -05:00
edX requirements bot
0c427cf5e3 chore: update browserslist DB (#656) 2023-02-23 13:44:15 -08:00
Feanil Patel
75ea8bc207 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:01:50 -05:00
Feanil Patel
47c06c0f5d 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:01:49 -05:00
Feanil Patel
8e0ab6db4d 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:01:48 -05:00
Jenkins
20159f140e chore(i18n): update translations 2023-02-19 15:40:37 -05:00
Justin Hynes
2d05de92af Merge pull request #691 from openedx/jhynes/aper-2261_algolia-utility-functions
feat: Add utility functions for querying job related data from Algolia
2023-02-17 14:12:54 -05:00
Justin Hynes
10f93420f4 feat: Add utility functions for querying job related data from Algolia
[APER-2261]
* rename `hooks.jsx` to `search.jsx` as this is more of a collection of utilities for working with Algolia
* add a utiltiy function for returning job info (from our "job" Algolia index) based on a list of jobs a learner is interested in
* add a utility function for formatting job names based on the syntax Algolia expects
2023-02-17 14:08:11 -05:00
Maxwell Frank
a12f91f7a5 Merge pull request #685 from openedx/mfrank/building-out-reducer
feat: adding actions and reducer for Skills Builder
2023-02-15 13:34:06 -05:00
Maxwell Frank
8f42e6fbfb feat: adding actions and reducer 2023-02-15 17:09:12 +00:00
Justin Hynes
4ecdf583ea Merge pull request #690 from openedx/jhynes/aper-2261
feat: Add Algolia support to Profile MFE for Skills Builder
2023-02-15 11:37:46 -05:00
Justin Hynes
e75864b860 feat: Add Algolia support to Profile MFE
[APER-2261]

This PR adds Algolia support to the Profile MFE and the upcoming Skills Builder feature.

* Adds new dependency for the `algoliasearch` package
* Add new config to support Algolia
* Update MFE configuration so we can access the new configuration variables
* Add hook to initialize Algolia client and return job and product Algolia indexes (based on settings)
* Update SkillsBuilderModal to add test code that displays the results of querying Algolia
2023-02-15 09:56:52 -05:00
Jenkins
a697e3c543 chore(i18n): update translations 2023-02-12 15:40:35 -05:00
Jason Wesson
04607dba1d Feat: display Learning Goal in profile (#676)
* feat: add unit tests for LearningGoal component

* feat: add LearningGoals component to Profile

---------

Co-authored-by: Jason Wesson <jwesson@2u.com>
2023-02-08 13:54:47 -08:00
Justin Hynes
6a4c8d9138 Merge pull request #682 from openedx/jhynes/aper-2258
feat: add Skills Builder Header component, refactor to use ModalDialog
2023-02-06 14:45:31 -05:00
Justin Hynes
dbf716eef5 feat: add Skills Builder Header component, refactor to use ModalDialog
[APER-2258]

This PR adds the SkillsBuilderHeader component to the profile MFE.

There was also some additional refactoring work required to display the header in the modal. The FullscreenModal component is not flexible enough to allow custom header designs to be displayed (only text). We have to pivot to using the `ModalDialog` family of components instead.
2023-02-06 13:34:04 -05:00
renovate[bot]
5eaab4f07d fix(deps): update dependency redux to v4.2.1 2023-02-06 13:31:33 +00:00
renovate[bot]
a139c2f71d fix(deps): update dependency @edx/frontend-component-footer to v11.6.2 2023-02-06 11:47:01 +00:00
Maxwell Frank
9e34fdd68d Merge pull request #680 from openedx/mfrank/adding-skills-context
feat: added skills context
2023-02-01 13:31:52 -05:00
Justin Hynes
109c5d437d Merge pull request #681 from openedx/jhynes/aper-2240-cleanup
fix: remove LR MFE URL building logic
2023-01-31 13:48:51 -05:00
Justin Hynes
25d0ecb531 fix: remove learner record MFE URL building logic
[APER-2240]

The Profile MFE no longer needs to understand anything about the Learner Record MFE. The Credentials IDA now has logic to determine if a request should be redirected to the Learner Record MFE so we can remove these changes from the Profile MFE.
2023-01-30 14:00:13 -05:00
Maxwell Frank
767af3c40b feat: added skills context 2023-01-30 15:46:15 +00:00
renovate[bot]
6a05552969 fix(deps): update dependency core-js to v3.27.2 2023-01-30 15:02:41 +00:00
renovate[bot]
628914dce3 fix(deps): update dependency @edx/frontend-component-header to v3.6.1 2023-01-30 10:28:08 +00:00
Jenkins
be7e204c91 chore(i18n): update translations 2023-01-29 15:40:36 -05:00
Bilal Qamar
c1d4c36a65 chore: update dependency @edx/frontend-build to v12.4.19 (#675) 2023-01-26 12:20:35 +05:00
renovate[bot]
ce04a04c36 fix(deps): update dependency @edx/frontend-component-footer to v11.6.1 2023-01-23 14:58:40 +00:00
renovate[bot]
346c08e5d6 chore(deps): update dependency @edx/frontend-build to v12.4.16 2023-01-23 11:27:47 +00:00
Jenkins
fe61237464 chore(i18n): update translations 2023-01-22 15:40:35 -05:00
renovate[bot]
c89285f0e8 chore(deps): update dependency glob to v8.1.0 2023-01-16 15:28:14 +00:00
renovate[bot]
7523a1edb3 chore(deps): update commitlint monorepo to v17.4.2 2023-01-16 11:27:14 +00:00
Jenkins
9f1c16a599 chore(i18n): update translations 2023-01-15 15:40:34 -05:00
Maxwell Frank
fdcef0edc8 Merge pull request #664 from openedx/mfrank/adding-skills-route
feat: set up skills builder route
2023-01-11 13:53:03 -05:00
Maxwell Frank
1f056dfac7 feat: set up skills builder route 2023-01-11 18:45:06 +00:00
renovate[bot]
2814349f37 fix(deps): update dependency @edx/brand to v1.2.0 2023-01-09 11:50:01 +00:00
renovate[bot]
a4327a98e4 chore(deps): update commitlint monorepo to v17.4.0 2023-01-09 08:15:56 +00:00
renovate[bot]
50fe0ecb6f fix(deps): update dependency core-js to v3.27.1 2023-01-02 08:58:39 +00:00
renovate[bot]
8e011fdf7b fix(deps): update dependency core-js to v3.27.0 2022-12-26 08:57:37 +00:00
dependabot[bot]
a6a35f3762 build(deps): bump loader-utils from 1.4.0 to 1.4.2 (#655)
Bumps [loader-utils](https://github.com/webpack/loader-utils) from 1.4.0 to 1.4.2.
- [Release notes](https://github.com/webpack/loader-utils/releases)
- [Changelog](https://github.com/webpack/loader-utils/blob/v1.4.2/CHANGELOG.md)
- [Commits](https://github.com/webpack/loader-utils/compare/v1.4.0...v1.4.2)

---
updated-dependencies:
- dependency-name: loader-utils
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-22 12:54:32 -08:00
renovate[bot]
259f4b2a5e chore(deps): update dependency @edx/frontend-build to v12.4.15 (#625)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-22 12:34:58 -08:00
Muhammad Abdullah Waheed
65a4091e78 Automate Browserlist DB Update (#615)
* feat: added cron github action to auto update brwoserlist DB periodically

* refactor: used a shared script to update broswerslist DB, create PR and automerge it
2022-12-22 12:06:26 -08:00
Jason Wesson
e5ee7894b0 refactor: updated frontend-build & resolved eslint issues (#654)
Co-authored-by: Bilal Qamar <59555732+BilalQamar95@users.noreply.github.com>
2022-12-22 12:00:53 -08:00
renovate[bot]
8f781ea867 chore(deps): update dependency glob to v8 (#622)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-20 13:16:24 -08:00
dependabot[bot]
7d208a91ac build(deps): bump loader-utils from 1.4.0 to 1.4.2 (#635)
Bumps [loader-utils](https://github.com/webpack/loader-utils) from 1.4.0 to 1.4.2.
- [Release notes](https://github.com/webpack/loader-utils/releases)
- [Changelog](https://github.com/webpack/loader-utils/blob/v1.4.2/CHANGELOG.md)
- [Commits](https://github.com/webpack/loader-utils/compare/v1.4.0...v1.4.2)

---
updated-dependencies:
- dependency-name: loader-utils
  dependency-type: indirect
...

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-20 13:07:00 -08:00
dependabot[bot]
80599a617f build(deps): bump minimatch and recursive-readdir (#642)
Bumps [minimatch](https://github.com/isaacs/minimatch) and [recursive-readdir](https://github.com/jergason/recursive-readdir). These dependencies needed to be updated together.

Updates `minimatch` from 3.0.4 to 3.1.2
- [Release notes](https://github.com/isaacs/minimatch/releases)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2)

Updates `recursive-readdir` from 2.2.2 to 2.2.3
- [Release notes](https://github.com/jergason/recursive-readdir/releases)
- [Changelog](https://github.com/jergason/recursive-readdir/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jergason/recursive-readdir/commits/v2.2.3)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-type: indirect
- dependency-name: recursive-readdir
  dependency-type: indirect

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-20 12:59:41 -08:00
dependabot[bot]
652559b157 build(deps): bump decode-uri-component from 0.2.0 to 0.2.2 (#644)
Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2.
- [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases)
- [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2)

---
updated-dependencies:
- dependency-name: decode-uri-component
  dependency-type: indirect

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-20 12:53:22 -08:00
renovate[bot]
5363663170 fix(deps): update dependency universal-cookie to v4 (#279)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-20 12:44:44 -08:00
renovate[bot]
b34041f090 fix(deps): update dependency core-js to v3.26.1 2022-12-19 10:22:55 +00:00
renovate[bot]
a82e3e9918 fix(deps): update dependency @edx/frontend-component-header to v3.6.0 2022-12-19 08:03:15 +00:00
mashal-m
6c15c2a0fd fix: remove is-es6 check 2022-12-15 12:43:57 +00:00
mashal-m
da5bf2f533 build: use shared browserslist configuration and upgrade paragon version 2022-12-15 12:43:57 +00:00
renovate[bot]
e507548d48 fix(deps): update dependency @edx/frontend-component-footer to v11.6.0 2022-12-12 11:18:25 +00:00
renovate[bot]
ff6c63c86b fix(deps): update dependency redux-saga to v1.2.2 2022-12-12 08:31:07 +00:00
renovate[bot]
6e24a48570 fix(deps): update dependency @edx/frontend-component-header to v3.5.0 2022-12-05 13:32:14 +00:00
renovate[bot]
42a0d27b47 fix(deps): update dependency @edx/frontend-component-footer to v11.5.2 2022-12-05 11:02:32 +00:00
edX requirements bot
6a79462567 fix: -t flag added in pull translation command (#639) 2022-11-30 16:43:21 +05:00
renovate[bot]
afe39e8b9e fix(deps): update dependency @edx/frontend-component-header to v3.4.1 2022-11-28 12:53:13 +00:00
renovate[bot]
38afcb8a5a fix(deps): update dependency @edx/frontend-component-footer to v11.5.1 2022-11-28 09:16:22 +00:00
renovate[bot]
5bf65de9e4 chore(deps): update commitlint monorepo to v17.3.0 2022-11-28 09:09:07 +00:00
renovate[bot]
28423c261d fix(deps): update dependency regenerator-runtime to v0.13.11 2022-11-21 09:04:15 +00:00
renovate[bot]
0986fd05ab chore(deps): update commitlint monorepo to v17.2.0 2022-11-14 08:32:19 +00:00
renovate[bot]
21adb70478 fix(deps): update dependency reselect to v4.1.7 2022-11-14 08:25:41 +00:00
renovate[bot]
daca35ffbe fix(deps): update dependency redux-thunk to v2.4.2 2022-11-07 10:07:44 +00:00
renovate[bot]
9fe9164bb2 chore(deps): update dependency enzyme-adapter-react-16 to v1.15.7 2022-11-07 07:58:45 +00:00
Jenkins
09e010443d chore(i18n): update translations 2022-10-30 16:40:23 -04:00
renovate[bot]
87377a1443 fix(deps): pin dependency react-helmet to 6.1.0 2022-10-24 08:47:44 +00:00
Jenkins
5f89049506 chore(i18n): update translations 2022-10-23 16:40:27 -04:00
Diana Olarte
4f00bc43b9 feat: allow runtieme configuration (#586)
Allows frontend-app-profile to be configured at
runtime using the LMS's new MFE Configuration API.

Part of https://github.com/openedx/frontend-wg/issues/103
2022-10-17 12:13:59 -04:00
renovate[bot]
f732fa7ffc fix(deps): update dependency regenerator-runtime to v0.13.10 2022-10-17 09:48:16 +00:00
renovate[bot]
963ff21423 fix(deps): update dependency redux-saga to v1.2.1 2022-10-10 12:57:02 +00:00
renovate[bot]
bb5a8004b9 fix(deps): update dependency core-js to v3.25.5 2022-10-10 10:01:03 +00:00
renovate[bot]
de81959252 chore(deps): update dependency @edx/frontend-build to v12.0.6 2022-10-10 06:41:00 +00:00
renovate[bot]
964dbe26b7 fix(deps): update dependency core-js to v3.25.4 2022-10-03 11:37:09 +00:00
renovate[bot]
be0865c8d4 fix(deps): update react-router monorepo to v5.3.4 2022-10-03 08:00:29 +00:00
Jenkins
b4afc24ef2 chore(i18n): update translations 2022-10-02 16:41:52 -04:00
renovate[bot]
392f01cecf fix(deps): update dependency react-redux to v7.2.9 2022-09-26 15:45:28 +00:00
renovate[bot]
cb504f2d57 fix(deps): update dependency classnames to v2.3.2 2022-09-26 11:50:55 +00:00
Jenkins
599b655ac4 chore(i18n): update translations 2022-09-25 16:39:48 -04:00
Thomas Tracy
e28bc0a62e Merge pull request #608 from openedx/renovate/major-commitlint-monorepo
chore(deps): update commitlint monorepo to v17 (major)
2022-09-23 10:38:27 -04:00
renovate[bot]
af46aa208f chore(deps): update commitlint monorepo to v17 2022-09-22 17:01:15 +00:00
renovate[bot]
2ad4d24262 chore(deps): update dependency @edx/frontend-build to v12.0.5 2022-09-22 16:57:54 +00:00
Thomas Tracy
d4c49fb34b Merge pull request #582 from openedx/renovate/redux-4.x
fix(deps): update dependency redux to v4.2.0
2022-09-21 15:41:36 -04:00
renovate[bot]
0034fcf79f fix(deps): update dependency redux to v4.2.0 2022-09-21 14:39:57 +00:00
Thomas Tracy
b3bb371d05 Merge pull request #588 from openedx/renovate/actions-checkout-3.x
chore(deps): update actions/checkout action to v3
2022-09-21 10:36:36 -04:00
renovate[bot]
1f5c4939e4 chore(deps): update actions/checkout action to v3 2022-09-21 14:21:21 +00:00
Thomas Tracy
349c4f799d Merge pull request #591 from openedx/renovate/actions-setup-node-3.x
chore(deps): update actions/setup-node action to v3
2022-09-21 10:14:47 -04:00
Thomas Tracy
1d3c09f7a5 Merge pull request #592 from openedx/renovate/codecov-codecov-action-3.x
chore(deps): update codecov/codecov-action action to v3
2022-09-21 10:14:21 -04:00
Thomas Tracy
777ba47a3c Merge pull request #581 from openedx/renovate/font-awesome
fix(deps): update dependency @fortawesome/react-fontawesome to v0.2.0
2022-09-21 10:13:21 -04:00
renovate[bot]
379bb8a9c4 chore(deps): update codecov/codecov-action action to v3 2022-09-20 20:18:43 +00:00
renovate[bot]
1e14092771 chore(deps): update actions/setup-node action to v3 2022-09-20 20:18:38 +00:00
renovate[bot]
066f447d38 fix(deps): update dependency @fortawesome/react-fontawesome to v0.2.0 2022-09-20 20:17:55 +00:00
Thomas Tracy
d7d6cd8ad4 Merge pull request #589 from openedx/bilalqamar95/frontend-build-upgrade
Upgraded frontend-build version to v12
2022-09-20 16:13:58 -04:00
Thomas Tracy
4a40868afa chore: rebuild package lock with updated reactifex 2022-09-20 16:09:57 -04:00
Bilal Qamar
22d0f8b688 refactor: updated tests to accommodate jsx-no-constructed-context-values rule 2022-09-20 16:08:15 -04:00
Bilal Qamar
95cffc73f1 refactor: pinned frontend-build version & ignored jsx-no-constructed-context-values for tests 2022-09-20 16:08:11 -04:00
Bilal Qamar
759428dd3e refactor: resolved eslint issues after master branch merge 2022-09-20 16:07:50 -04:00
Bilal Qamar
8bb7dd7430 refactor: updated frontend-build to 12.0.3 2022-09-20 16:07:46 -04:00
Bilal Qamar
3733497ecb refactor: resolved eslint issues 2022-09-20 16:06:40 -04:00
Bilal Qamar
1b5f8ee732 refactor: updated frontend-build to v12.0.2 2022-09-20 16:06:35 -04:00
Bilal Qamar
8fa5bf57b0 refactor: upgraded frontend-build version to v12 2022-09-20 16:05:54 -04:00
Thomas Tracy
011c4ef356 Merge pull request #599 from openedx/renovate/edx-reactifex-2.x
chore(deps): update dependency @edx/reactifex to v2
2022-09-20 14:24:51 -04:00
Thomas Tracy
43a58961f3 Merge pull request #604 from openedx/abdullahwaheed/transifex-languages-list-update
Supported Transifex languages in Makefile
2022-09-20 14:23:22 -04:00
Thomas Tracy
939c18c765 Merge pull request #602 from openedx/abdullahwaheed/renovate-bot-edx-packages-auto-update
Renovate config to automate @edx namespaced minor/patch version upgrades
2022-09-20 14:22:23 -04:00
Thomas Tracy
c68ef187ee Merge pull request #590 from openedx/dependabot/npm_and_yarn/terser-4.8.1
build(deps): bump terser from 4.8.0 to 4.8.1
2022-09-20 14:21:44 -04:00
Thomas Tracy
50289e3f52 Merge pull request #605 from openedx/tcril/fix-gh-org-url
Fix github url strings (org edx -> openedx)
2022-09-20 14:20:51 -04:00
renovate[bot]
188e29f6e9 chore(deps): update dependency @edx/reactifex to v2 2022-09-16 19:49:18 +00:00
Sarina Canelake
7d11b73997 fix: update path to .github workflows to read from openedx org 2022-09-14 09:42:46 -04:00
Sarina Canelake
f1b7c86f88 fix: fix github url strings (org edx -> openedx) 2022-09-14 09:42:46 -04:00
Abdullah Waheed
ab62a2d231 feat: added new translations in Makefile and updated all the translations 2022-09-06 15:11:57 +05:00
Abdullah Waheed
728fd3f232 refactor: updated renovate config to auto update minor and patch versions of edx dependencies 2022-08-23 15:01:30 +05:00
Muhammad Abdullah Waheed
7503e6c5cb Paragon form component deprecations (#596)
* refactor: removed ValidationFormGroup deprecations

* refactor: updated unit tests

* fix: linting issue

* refactor: added unit tests for some uncovered code
2022-08-18 10:41:50 +05:00
edx-semantic-release
8363307cb4 chore(i18n): update translations 2022-08-14 16:39:20 -04:00
Muhammad Abdullah Waheed
34a9caa0bb fix: Paragon StatusAlert deprecation (#574)
* refactor: migrated StatusAlert deprecated package to Alert in AgeMessage component

* refactor: migrated StatusAlert deprecated package to Alert for remaining components

* refactor: changed snapshot to unit test to fix ci issue

* fix: updated unit test scrip to make it consistent to timezone differences and fixed snapshot issue

* feat: added unit tests of SocialLinks component to fix ci issue and improve coverage

* refactor: used aria-labelledby in place of ID as suggested in PR

* fix: unnecessary removal of coverage from test script

* fix: typo
2022-08-11 08:20:50 -04:00
edx-semantic-release
392167e554 chore(i18n): update translations 2022-08-07 16:39:27 -04:00
renovate[bot]
a087f4e983 fix(deps): update dependency core-js to v3.24.1 2022-08-01 17:21:30 +00:00
dependabot[bot]
1ffd5275bc 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 14:25:27 +00:00
renovate[bot]
87374a045d fix(deps): update dependency core-js to v3.23.5 2022-07-18 10:23:13 +00:00
Thomas Tracy
fbe9d9bb1c Merge pull request #585 from openedx/revert-580-ttracy/cookie-policy-banner-test
Revert "feat: Add cookie banner to profile for testing"
2022-07-11 15:04:42 -04:00
Thomas Tracy
a0b49a7a1c Revert "feat: Add cookie banner to profile for testing" 2022-07-11 14:54:11 -04:00
renovate[bot]
a2215044f3 fix(deps): update react-router monorepo to v5.3.3 2022-07-11 11:09:11 +00:00
renovate[bot]
c6c4951890 fix(deps): update dependency core-js to v3.23.4 2022-07-11 11:02:12 +00:00
Jawayria
f603f433d4 Merge pull request #542 from openedx/jenkins/drop-node-12-c50b401
chore!: Dropped support for Node 12
2022-07-01 12:36:35 +05:00
Maman Khan
3195e199a1 Merge pull request #566 from openedx/maman/update-vulnerable-packages
Update dependencies node-forge & minimist
2022-06-29 13:26:23 +05:00
Maman Naveed Khan
fd5bc50a37 fix: snapshots timezone issue 2022-06-29 13:00:25 +05:00
Maman Naveed Khan
aedb698133 fix: sync package and package-lock 2022-06-29 12:52:26 +05:00
Maman Naveed Khan
a941e6f073 fix: package lock updated 2022-06-29 12:46:37 +05:00
Maman Naveed Khan
84ea38de77 fix: updated snapshots 2022-06-29 12:44:36 +05:00
Maman Naveed Khan
3460734ff7 Merge branch 'master' into maman/update-vulnerable-packages 2022-06-29 12:39:25 +05:00
Thomas Tracy
2e9c124ced Merge pull request #580 from openedx/ttracy/cookie-policy-banner-test
feat: Add cookie banner to profile for testing
2022-06-28 14:01:21 -04:00
tj-tracy
7b61520544 feat: Add cookie banner to profile for testing 2022-06-28 17:33:38 +00:00
renovate[bot]
077f8d5b84 fix(deps): update dependency prop-types to v15.8.1 2022-06-27 11:40:07 +00:00
renovate[bot]
a1606709b2 fix(deps): update dependency core-js to v3.23.3 2022-06-27 11:33:45 +00:00
renovate[bot]
d8b0ab3442 fix(deps): update dependency reselect to v4.1.6 2022-06-20 16:20:34 +00:00
renovate[bot]
694165312c fix(deps): update dependency @edx/paragon to v19.25.3 2022-06-20 12:49:19 +00:00
edx-semantic-release
2b0dff352d chore(i18n): update translations 2022-06-12 16:40:36 -04:00
Renovate Bot
23e61bdf72 fix(deps): update dependency core-js to v3.22.8 2022-06-06 15:31:37 +00:00
Renovate Bot
bbfcb61ef3 fix(deps): update dependency @edx/paragon to v19.25.1 2022-06-06 12:59:03 +00:00
edx-semantic-release
547ce30879 chore(i18n): update translations 2022-06-03 13:17:32 -04:00
maman
a4d0f276be fix: updated vulnerable packages in package lock 2022-06-03 16:06:00 +05:00
maman
8f36e976e7 Merge branch 'master' into maman/update-vulnerable-packages 2022-06-03 15:49:55 +05:00
Renovate Bot
fa602f566f fix(deps): update dependency core-js to v3.22.7 2022-05-30 12:34:11 +00:00
Renovate Bot
7842ec56d2 fix(deps): update dependency @edx/paragon to v19.25.0 2022-05-30 09:59:48 +00:00
Diana Catalina Olarte
1acc1d0262 fix: show site name instead edX 2022-05-23 14:36:49 +01:00
Renovate Bot
b69dc2d10a fix(deps): update dependency @edx/paragon to v19.23.1 2022-05-23 12:50:56 +00:00
Renovate Bot
4cb73e0851 fix(deps): update dependency @edx/frontend-component-header to v2.6.1 2022-05-23 10:52:32 +00:00
Renovate Bot
016e6bf184 fix(deps): update dependency @edx/frontend-component-footer to v10.3.0 2022-05-16 13:52:25 +00:00
Renovate Bot
e877d0d749 chore(deps): update dependency glob to v7.2.3 2022-05-16 10:41:58 +00:00
Renovate Bot
2e1cd607d5 fix(deps): update dependency @edx/paragon to v19.21.2 2022-05-11 00:32:40 +00:00
David Joy
e4033037f2 build: adding nvmrc, bumping paragon to latest (#557)
* build: adding nvmrc, bumping paragon to latest

Adding .nvmrc is a nicety. Bumping paragon to latest is necessary to ensure compatiblity with the edX override header (frontend-component-header-edx).

* test: snapshot needed updating to account for new data-testid

This is the result of upgrading to the latest paragon.  Presumably some test IDs were added.
2022-05-09 16:15:48 -04:00
Renovate Bot
9a730117fb fix(deps): update dependency @edx/frontend-component-header to v2.5.0 2022-05-09 12:16:45 +00:00
Jawayria
7a59c32660 Merge pull request #552 from openedx/jenkins/version-check-33ed66e
feat: Add package-lock file version check
2022-05-06 15:53:33 +05:00
Renovate Bot
bfcfe35530 chore(deps): update dependency @edx/reactifex to v1.1.0 2022-05-02 16:04:48 +00:00
Renovate Bot
cf9bd36eb4 chore(deps): update dependency @edx/frontend-build to v9.2.2 2022-05-02 12:49:29 +00:00
edX requirements bot
af34fc4079 feat: Add package-lock file version check 2022-04-29 08:45:54 -04:00
Renovate Bot
33ed66e916 fix(deps): update dependency react-redux to v7.2.8 2022-04-25 15:57:32 +00:00
Renovate Bot
4982e2768d fix(deps): update dependency @fortawesome/react-fontawesome to v0.1.18 2022-04-25 12:06:20 +00:00
Renovate Bot
26ba34e648 fix(deps): update dependency @edx/frontend-platform to v1.15.6 2022-04-18 18:46:39 +00:00
Renovate Bot
6e71b7281e fix(deps): update dependency @edx/frontend-component-header to v2.4.6 2022-04-18 14:24:03 +00:00
Renovate Bot
5f9675a8a7 fix(deps): update dependency @edx/frontend-component-footer to v10.2.4 2022-04-11 16:23:38 +00:00
Renovate Bot
95155df409 chore(deps): update dependency @edx/frontend-build to v9.1.4 2022-04-11 13:41:03 +00:00
Renovate Bot
ed97f0db72 chore(deps): update dependency node-forge [security] 2022-04-04 14:42:03 +00:00
Renovate Bot
abce0a5387 chore(deps): pin dependency @edx/reactifex to v 2022-04-04 14:40:51 +00:00
edX requirements bot
ba3388dee8 chore!: Dropped support for Node 12 2022-04-04 08:04:42 -04:00
Usama Sadiq
c50b401c14 Merge pull request #541 from openedx/usamasadiq/update-pull-translations-command
build: update transifex pull translations command
2022-04-04 16:22:46 +05:00
UsamaSadiq
0c50bce43d build: update transifex pull translations command 2022-04-04 14:47:17 +05:00
Usama Sadiq
e56914eb80 Merge pull request #535 from openedx/jenkins/transifex-client-migration-ead9180
fix: transifex migration to new client
2022-04-04 14:09:02 +05:00
edX requirements bot
918aa91e49 feat: Added support for node v16 (#530)
Co-authored-by: Mohammad Ahtasham ul Hassan <ahthassan74@gmail.com>
2022-03-25 14:51:14 +05:00
David Joy
87230613c5 build: Delete CODEOWNERS (#537) 2022-03-18 10:25:02 -04:00
Ali Adnan
e2dfde2432 Merge pull request #534 from openedx/aadnan/migrate-reactifex
feat: migrate translations to reactifex
2022-03-18 14:01:31 +05:00
edX requirements bot
75ea16103a fix: transifex migration to new client 2022-03-17 08:51:00 -04:00
aliadnan
f5a6c483e2 feat: migrate translations to reactifex 2022-03-17 17:43:51 +05:00
Sarina Canelake
ead91806e6 Merge DEPR automation workflow
Add DEPR workflow automation
2022-02-24 15:21:46 -05:00
Sarina Canelake
f5e46741d2 build: add DEPR workflow automation 2022-02-23 14:36:56 -05:00
Renovate Bot
9cc77ddc1b fix(deps): update dependency @fortawesome/react-fontawesome to v0.1.17 2022-01-31 08:21:25 +00:00
Renovate Bot
2e0549a859 fix(deps): update dependency core-js to v3.20.3 2022-01-17 09:51:23 +00:00
Renovate Bot
cb515e81fc fix(deps): update dependency @edx/frontend-platform to v1.14.9 2022-01-17 09:24:30 +00:00
Renovate Bot
f8520ca2dc fix(deps): update dependency @edx/frontend-component-header to v2.4.3 2021-12-27 09:49:05 +00:00
Renovate Bot
cce3146fed fix(deps): update dependency core-js to v3.20.0 2021-12-20 10:02:18 +00:00
Renovate Bot
1e48a55029 fix(deps): update dependency @edx/frontend-component-header to v2.4.2 2021-12-20 09:42:31 +00:00
Renovate Bot
9d4d6ee2a1 chore(deps): update dependency @edx/frontend-build to v8.2.0 2021-12-13 12:38:12 +00:00
Renovate Bot
b9e4fdaf64 fix(deps): update dependency @edx/frontend-platform to v1.14.4 2021-12-13 10:52:54 +00:00
Renovate Bot
7b14eeb42c fix(deps): update dependency core-js to v3.19.3 2021-12-06 09:10:22 +00:00
Renovate Bot
2b2a94f78c fix(deps): update dependency reselect to v4.1.5 2021-12-06 08:57:31 +00:00
Renovate Bot
5e94fa62ed fix(deps): update dependency redux-thunk to v2.4.1 2021-11-29 08:53:00 +00:00
Renovate Bot
f610c5bc70 fix(deps): update dependency @edx/frontend-platform to v1.14.1 2021-11-29 08:39:18 +00:00
Renovate Bot
5922947843 fix(deps): update dependency reselect to v4.1.4 2021-11-22 10:27:21 +00:00
Renovate Bot
02da9797b4 fix(deps): update dependency redux-thunk to v2.4.0 2021-11-22 10:13:32 +00:00
Renovate Bot
8cf5b82a78 fix(deps): update dependency core-js to v3.19.1 2021-11-15 12:54:15 +00:00
Renovate Bot
c265d57ea5 chore(deps): update dependency @edx/frontend-build to v8.1.6 2021-11-15 11:00:20 +00:00
edX Transifex Bot
1069f23239 chore(i18n): update translations 2021-11-15 01:40:52 +05:00
Renovate Bot
718400dcd1 fix(deps): update dependency @edx/frontend-platform to v1.14.0 2021-11-08 10:59:03 +00:00
Renovate Bot
59e112205d chore(deps): update dependency @edx/frontend-build to v8.1.3 2021-11-08 10:43:06 +00:00
Renovate Bot
7948812a78 fix(deps): update dependency redux to v4.1.2 2021-11-01 09:16:29 +00:00
Renovate Bot
3da88dd557 fix(deps): update dependency react-redux to v7.2.6 2021-11-01 09:06:12 +00:00
edX Transifex Bot
7181950081 chore(i18n): update translations 2021-11-01 01:40:48 +05:00
Waheed Ahmed
8fbedf008c Merge pull request #488 from edx/remove-age-banner
feat: add feature flag to toggle age banner
2021-10-25 17:13:18 +05:00
uzairr
ac912e5ffc feat: add feature flag to toggle age banner
Based on the requirement for COPPA,users under the age of 13 are
not be informed to update the age information.

Fixes: VAN-753
2021-10-25 17:10:03 +05:00
Renovate Bot
299cbbea6c fix(deps): update dependency @fortawesome/react-fontawesome to v0.1.16 2021-10-25 09:05:53 +00:00
Renovate Bot
3f904fe8f6 chore(deps): update dependency @edx/frontend-build to v8.0.6 2021-10-25 08:57:34 +00:00
Renovate Bot
b378967023 fix(deps): update dependency core-js to v3.18.2 2021-10-11 10:42:51 +00:00
Renovate Bot
180af03af8 chore(deps): update dependency @commitlint/cli to v13.2.1 2021-10-11 07:52:57 +00:00
edX Transifex Bot
17ca164085 chore(i18n): update translations 2021-10-11 01:41:31 +05:00
Ned Batchelder
7cfc973c72 build: use the organization commitlint check 2021-10-07 13:54:25 -04:00
Renovate Bot
912c06caee chore(deps): update commitlint monorepo to v13.2.0 2021-10-04 07:19:32 +00:00
Renovate Bot
58c654d8f1 chore(deps): update dependency glob to v7.2.0 2021-09-27 10:34:02 +00:00
Renovate Bot
fdb5de902d fix(deps): update dependency core-js to v3.18.1 2021-09-27 09:59:22 +00:00
dependabot[bot]
84360e6f42 build(deps): bump tmpl from 1.0.4 to 1.0.5 (#479)
Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5.
- [Release notes](https://github.com/daaku/nodejs-tmpl/releases)
- [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5)

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

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-21 10:41:34 -04:00
Renovate Bot
2fad316329 fix(deps): update dependency core-js to v3.18.0 2021-09-20 09:10:07 +00:00
Renovate Bot
c820dedbfc fix(deps): update dependency @edx/frontend-platform to v1.12.7 2021-09-20 09:03:19 +00:00
Renovate Bot
5199d88114 fix(deps): update dependency @edx/frontend-platform to v1.12.6 2021-09-13 11:22:51 +00:00
Renovate Bot
0383167754 fix(deps): update dependency core-js to v3.17.3 2021-09-13 09:50:51 +00:00
Renovate Bot
17f42c8f97 fix(deps): update react-router monorepo 2021-09-06 08:45:44 +00:00
Renovate Bot
13e5a684e9 fix(deps): update dependency react-redux to v7.2.5 2021-09-06 08:38:28 +00:00
David Joy
56f5d655c6 fix: modernize build process, remove npm publish, use github actions (#472)
* build: switch from travis to Github actions.

Subsequent commits will clean up some of the 'npm-dist' code that we're no longer using.

* build: remove npm distribution from repository

Once upon a time, we published the components of the profile MFE to NPM because we believed we might want to embed them in frontend-app-learner-portal.  We abandoned that idea about two years ago, but never cleaned up the experiment of publishing the MFE to npm.

This commit does that.  The prior commit on this branch disabled it by cutting over from travis to github actions - this commit just finishes the job.

* fix: cleaning up a bad URL for order history.

* docs: cleaning up a documentation URL in openedx.yml

* fix: removing download of Roboto font

None of our other MFEs do this; it was left over from an early design decision.  It also doesn't appear to be having any effect, as I think this font is included via Paragon, if at all.  It may also be that it's a secondary font choice after something else already available.  Regardless, removing these two lines had no effect on the look and feel of the MFE, and reduces bundle size.

* fix: using updated logo instead of pre-rebrand edX logo.

This now uses the FAVICON_URL environment variable like all our other MFEs.
2021-08-31 12:07:59 -04:00
David Joy
d651b6c789 fix: clean up unused dependencies and env variables (#471)
* build: cleanup environment variables

Setting 'null' to an empty string '' (which is falsy and the right thing here)

* fix: clean up unused dependencies

- Removing a number of packages from dependencies that simply were not in use.
- Removing 'font-awesome' dependency which we didn't actually need in our stylesheet - we don't use it, though we were importing it and setting a variable from it.  Not sure why it was ever there.

* fix: remove unused dependency

We get 'history' through frontend-platform.
2021-08-30 14:10:59 -04:00
renovate[bot]
0fb10ab34d fix(deps): update font awesome (#271)
* fix(deps): update font awesome

* test: fixing broken snapshot from font-awesome upgrade

I visually verified the facebook icon is fine by loading up the app.

Co-authored-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: David Joy <davjoy@gmail.com>
2021-08-30 11:13:57 -04:00
dependabot[bot]
fbbd9560e6 build(deps): bump path-parse from 1.0.6 to 1.0.7 (#460)
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-30 10:56:56 -04:00
Renovate Bot
5c78d8c3dd fix(deps): update dependency core-js to v3.16.4 2021-08-30 10:13:09 +00:00
Renovate Bot
dd0e324dd1 chore(deps): update dependency husky to v7.0.2 2021-08-30 08:28:06 +00:00
Renovate Bot
f41b071994 fix(deps): update dependency @edx/frontend-platform to v1.12.4 2021-08-23 08:23:52 +00:00
Renovate Bot
00517dd28f chore(deps): update dependency @edx/frontend-build to v8.0.4 2021-08-23 08:14:25 +00:00
Adam Stankiewicz
b1bc9b5009 build: upgrade to frontend-build v8.0.3 (#465)
* build: upgrade to frontend-build v8.0.2

* build: use 8.0.3 instead to fix apiKey issue
2021-08-19 18:08:55 -04:00
Adam Stankiewicz
55bfc0b677 build: test new relic source maps with webpack 5 (#464) 2021-08-19 13:28:34 -04:00
Renovate Bot
071d8d095c fix(deps): update dependency @edx/frontend-platform to v1.12.3 2021-08-16 07:32:41 +00:00
Renovate Bot
a867d0e5b3 fix(deps): update dependency @edx/frontend-component-footer to v10.1.6 2021-08-16 07:22:47 +00:00
Justin Hynes
30619822a7 Merge pull request #461 from edx/jhynes/microba-1321_learner-record-mfe-redirect
feat: Enable routing of traffic to Learner Record MFE when `view my records` button is pressed
2021-08-11 14:24:21 -04:00
Justin Hynes
357b1c844d feat: Enable routing of traffic to Learner Record MFE when view my records button is pressed
[MICROBA-1321]
* Add two new configuration settings: `ENABLE_LEARNER_RECORD_MFE` and `LEARNER_RECORD_MFE_BASE_URL`
* Add function to `ProfilePage.jsx` to determine where learners should be routed (Credentials or Learner Record MFE) when the `View My Records` button is pressed on the profile page.
2021-08-11 14:18:31 -04:00
stvn
0ee56a0eeb merge(#454): renovate/major-commitlint-monorepo
commits
=======
- chore(deps): update commitlint monorepo to v13
2021-08-09 21:54:33 -07:00
Renovate Bot
0ec21e4c1f chore(deps): update commitlint monorepo to v13 2021-08-09 12:18:33 +00:00
Renovate Bot
9c2dd032d1 fix(deps): update dependency redux to v4.1.1 2021-08-09 12:11:51 +00:00
Renovate Bot
ab26fd84fe fix(deps): update dependency core-js to v3.16.1 2021-08-09 10:07:35 +00:00
Renovate Bot
8aebaf7583 fix(deps): update dependency core-js to v3.16.0 2021-08-02 05:23:04 +00:00
Renovate Bot
77d28e2aba fix(deps): update dependency @edx/frontend-platform to v1.11.3 2021-08-02 05:10:30 +00:00
Renovate Bot
40b9526f92 fix(deps): update dependency @edx/paragon to v16.6.1 2021-07-26 08:35:06 +00:00
Renovate Bot
462b64f720 chore(deps): update dependency @edx/frontend-build to v7.1.0 2021-07-26 08:25:13 +00:00
Renovate Bot
931710d489 fix(deps): update dependency regenerator-runtime to v0.13.9 2021-07-26 04:35:23 +00:00
Renovate Bot
b871bb6835 chore(deps): update dependency codecov to v3.8.3 2021-07-26 04:25:26 +00:00
stvn
4dbd66a615 merge(#446): renovate/husky-7.x
commits
=======
- chore(deps): update dependency husky to v7
2021-07-21 11:27:35 -07:00
Renovate Bot
c797320d71 chore(deps): update dependency husky to v7 2021-07-19 07:07:02 +00:00
Renovate Bot
b1ca0dd34e fix(deps): update dependency @edx/paragon to v16.3.1 2021-07-19 07:02:11 +00:00
Renovate Bot
6b256eb09e fix(deps): update dependency @edx/frontend-platform to v1.11.1 2021-07-19 06:51:12 +00:00
Renovate Bot
78267b5326 chore(deps): update dependency @edx/frontend-build to v7.0.6 2021-07-19 06:38:56 +00:00
David Joy
f06bea9612 fix: remove purgecss (#440)
PurgeCSS doesn’t work with the latest version of PostCSS, far as I can tell.  It ends up removing too many classes.  It has always been sort of problematic and we only use it in a few MFEs, so I think it’s time for it to go.
2021-07-13 10:16:09 -04:00
Renovate Bot
242a03ee72 fix(deps): update dependency @edx/paragon to v16.1.0 2021-07-12 07:28:45 +00:00
Renovate Bot
4b35d64d13 chore(deps): update dependency @edx/frontend-build to v7.0.3 2021-07-12 07:19:22 +00:00
David Joy
16d179d9b0 fix: upgrades frontend build to v7 and paragon to v16 (#439)
* build: upgrades frontend build to v7 and paragon to v16

* test: update test snapshots

Three things happening here:

- The implementation of the external link icon in Hyperlink was updated to have an SVG icon instead of font-awesome
- The implementation of StatefulButton also changed to use SVG icons instead of font-awesome
- Dropdown appears to be setting an onKeyDown handler that it wasn’t before.  This is fine.
2021-07-07 16:01:45 -04:00
renovate[bot]
42d6535969 chore(deps): update dependency @edx/frontend-build to v6 (#438)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-07-06 14:44:56 -04:00
Renovate Bot
ba1036c7ed fix(deps): update dependency core-js to v3.15.2 2021-07-05 07:38:42 +00:00
Renovate Bot
c6fb8acb63 fix(deps): update dependency core-js to v3.15.1 2021-06-28 07:25:46 +00:00
Renovate Bot
78c816dd68 chore(deps): update dependency es-check to v5.2.4 2021-06-28 07:12:56 +00:00
Sarina Canelake
6f2253e904 Merge pull request #433 from edx/renovate/husky-6.x
chore(deps): update dependency husky to v6
2021-06-21 16:59:07 -04:00
Renovate Bot
1b618bcbab chore(deps): update dependency husky to v6 2021-06-21 06:52:58 +00:00
Renovate Bot
6511559261 fix(deps): update dependency redux to v4.1.0 2021-06-21 06:46:14 +00:00
Renovate Bot
e96c3c9c31 fix(deps): update dependency core-js to v3.15.0 2021-06-21 06:30:11 +00:00
stvn
0052682b6e merge(#403): renovate/major-commitlint-monorepo
commits
=======
- chore(deps): update commitlint monorepo to v12
2021-06-15 00:37:17 -07:00
Renovate Bot
6b36f988fe chore(deps): update commitlint monorepo to v12 2021-06-15 07:26:20 +00:00
99 changed files with 31370 additions and 25464 deletions

56
.env
View File

@@ -1,37 +1,31 @@
NODE_ENV='production'
ACCESS_TOKEN_COOKIE_NAME=null
BASE_URL=null
CREDENTIALS_BASE_URL=null
CSRF_TOKEN_API_PATH=null
ECOMMERCE_BASE_URL=null
LANGUAGE_PREFERENCE_COOKIE_NAME=null
LMS_BASE_URL=null
LOGIN_URL=null
LOGOUT_URL=null
MARKETING_SITE_BASE_URL=null
ORDER_HISTORY_URL=null
REFRESH_ACCESS_TOKEN_ENDPOINT=null
SEGMENT_KEY=null
ACCESS_TOKEN_COOKIE_NAME=''
BASE_URL=''
CREDENTIALS_BASE_URL=''
CSRF_TOKEN_API_PATH=''
ECOMMERCE_BASE_URL=''
LANGUAGE_PREFERENCE_COOKIE_NAME=''
LMS_BASE_URL=''
LOGIN_URL=''
LOGOUT_URL=''
MARKETING_SITE_BASE_URL=''
ORDER_HISTORY_URL=''
ACCOUNT_SETTINGS_URL=''
ACCOUNT_PROFILE_URL=''
REFRESH_ACCESS_TOKEN_ENDPOINT=''
SEGMENT_KEY=''
SITE_NAME=''
USER_INFO_COOKIE_NAME=null
APPLE_APP_STORE_URL=null
CONTACT_URL=null
ENTERPRISE_LEARNER_PORTAL_HOSTNAME=null
ENTERPRISE_MARKETING_FOOTER_UTM_MEDIUM=null
ENTERPRISE_MARKETING_URL=null
ENTERPRISE_MARKETING_UTM_CAMPAIGN=null
ENTERPRISE_MARKETING_UTM_SOURCE=null
FACEBOOK_URL=null
GOOGLE_PLAY_URL=null
LINKED_IN_URL=null
OPEN_SOURCE_URL=null
PRIVACY_POLICY_URL=null
REDDIT_URL=null
SUPPORT_URL=null
TERMS_OF_SERVICE_URL=null
TWITTER_URL=null
YOU_TUBE_URL=null
USER_INFO_COOKIE_NAME=''
CONTACT_URL=''
ENTERPRISE_LEARNER_PORTAL_HOSTNAME=''
SUPPORT_URL=''
TERMS_OF_SERVICE_URL=''
LOGO_URL=''
LOGO_TRADEMARK_URL=''
LOGO_WHITE_URL=''
FAVICON_URL=''
COLLECT_YEAR_OF_BIRTH=true
APP_ID=''
MFE_CONFIG_API_URL=''
SEARCH_CATALOG_URL=''
ENABLE_SKILLS_BUILDER_PROFILE=''

View File

@@ -3,36 +3,30 @@ PORT=1995
ACCESS_TOKEN_COOKIE_NAME='edx-jwt-cookie-header-payload'
BASE_URL='localhost:1995'
CREDENTIALS_BASE_URL='http://localhost:18150'
ACCOUNT_SETTINGS_URL=http://localhost:1997
CSRF_TOKEN_API_PATH='/csrf/api/v1/token'
ACCOUNT_PROFILE_URL=http://localhost:1995
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/logout'
MARKETING_SITE_BASE_URL='http://localhost:18000'
ORDER_HISTORY_URL='localhost:1996/orders'
ORDER_HISTORY_URL='http://localhost:1996/orders'
REFRESH_ACCESS_TOKEN_ENDPOINT='http://localhost:18000/login_refresh'
SEGMENT_KEY=null
SEGMENT_KEY=''
SITE_NAME=localhost
USER_INFO_COOKIE_NAME='edx-user-info'
APPLE_APP_STORE_URL='https://www.apple.com/ios/app-store/'
CONTACT_URL='http://localhost:18000/contact'
ENTERPRISE_LEARNER_PORTAL_HOSTNAME='http://localhost:8080'
ENTERPRISE_MARKETING_FOOTER_UTM_MEDIUM='Footer'
ENTERPRISE_MARKETING_URL='http://example.com'
ENTERPRISE_MARKETING_UTM_CAMPAIGN='my_campaign'
ENTERPRISE_MARKETING_UTM_SOURCE='edX profile'
FACEBOOK_URL='https://www.facebook.com'
GOOGLE_PLAY_URL='https://play.google.com/store'
LINKED_IN_URL='https://www.linkedin.com'
OPEN_SOURCE_URL='http://localhost:18000/openedx'
PRIVACY_POLICY_URL='http://localhost:18000/privacy-policy'
REDDIT_URL='https://www.reddit.com'
SUPPORT_URL='http://localhost:18000/support'
TERMS_OF_SERVICE_URL='http://localhost:18000/terms-of-service'
TWITTER_URL='https://twitter.com'
YOU_TUBE_URL='https://www.youtube.com'
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
COLLECT_YEAR_OF_BIRTH=true
APP_ID=''
MFE_CONFIG_API_URL=''
SEARCH_CATALOG_URL='http://localhost:18000/courses'
ENABLE_SKILLS_BUILDER_PROFILE=''

View File

@@ -5,10 +5,12 @@ 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'
ACCOUNT_SETTINGS_URL='http://localhost:1997'
ACCOUNT_PROFILE_URL='http://localhost:1995'
LOGIN_URL='http://localhost:18000/login'
LOGOUT_URL='http://localhost:18000/logout'
MARKETING_SITE_BASE_URL='http://localhost:18000'
ORDER_HISTORY_URL='localhost:1996/orders'
ORDER_HISTORY_URL='http://localhost:1996/orders'
REFRESH_ACCESS_TOKEN_ENDPOINT='http://localhost:18000/login_refresh'
SEGMENT_KEY=null
SITE_NAME=localhost
@@ -17,3 +19,9 @@ 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
ENABLE_LEARNER_RECORD_MFE=''
ENABLE_SKILLS_BUILDER_PROFILE=''
LEARNER_RECORD_MFE_BASE_URL='http://localhost:1990'
COLLECT_YEAR_OF_BIRTH=true
APP_ID=''
MFE_CONFIG_API_URL=''

View File

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

2
.github/CODEOWNERS vendored
View File

@@ -1 +1 @@
* @edx/community-engineering
* @openedx/2U-infinity

7
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,7 @@
version: 2
updates:
# Adding new check for github-actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"

24
.github/pull_request_template.md vendored Normal file
View File

@@ -0,0 +1,24 @@
### Description
Include a description of your changes here, along with a link to any relevant Jira tickets and/or GitHub issues.
#### How Has This Been Tested?
Please describe in detail how you tested your changes.
#### Screenshots/sandbox (optional):
Include a link to the sandbox for design changes or screenshot for before and after. **Remove this section if it's not applicable.**
|Before|After|
|-------|-----|
| | |
#### Merge Checklist
* [ ] If your update includes visual changes, have they been reviewed by a designer? Send them a link to the Sandbox, if applicable.
* [ ] Is there adequate test coverage for your changes?
#### Post-merge Checklist
* [ ] Deploy the changes to prod after verifying on stage or ask **@openedx/2u-infinity** to do it.
* [ ] 🎉 🙌 Celebrate! Thanks for your contribution.

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

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

@@ -0,0 +1,30 @@
name: ci
on:
push:
branches:
- master
pull_request:
jobs:
tests:
runs-on: ubuntu-latest
strategy:
matrix:
npm-test:
- i18n_extract
- lint
- test
node: [18, 20]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
- run: make requirements
- run: make test NPM_TESTS=build
- run: make test NPM_TESTS=${{ matrix.npm-test }}
- name: Coverage
if: ${{ matrix.npm-test == 'test' }}
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

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

View File

@@ -0,0 +1,12 @@
name: Update Browserslist DB
on:
schedule:
- cron: '0 0 * * 1'
workflow_dispatch:
jobs:
update-browserslist:
uses: openedx/.github/.github/workflows/update-browserslist-db.yml@master
secrets:
requirements_bot_github_token: ${{ secrets.requirements_bot_github_token }}

4
.gitignore vendored
View File

@@ -14,7 +14,7 @@ temp/babel-plugin-react-intl
### Emacs ###
*~
/.vscode
/temp
/npm-dist
/.vscode
/module.config.js
src/i18n/messages

1
.nvmrc Normal file
View File

@@ -0,0 +1 @@
20

View File

@@ -1,27 +0,0 @@
{
"branch": "master",
"tagFormat": "v${version}",
"verifyConditions": [
"@semantic-release/npm",
{
"path": "@semantic-release/github",
"assets": {
"path": "npm-dist/*"
}
}
],
"analyzeCommits": "@semantic-release/commit-analyzer",
"generateNotes": "@semantic-release/release-notes-generator",
"prepare": "@semantic-release/npm",
"publish": [
"@semantic-release/npm",
{
"path": "@semantic-release/github",
"assets": {
"path": "npm-dist/*"
}
}
],
"success": [],
"fail": []
}

View File

@@ -1,23 +0,0 @@
language: node_js
node_js: 12
before_install:
- npm install -g npm@6
install:
- npm ci
script:
- make validate-no-uncommitted-package-lock-changes
- npm run i18n_extract
- npm run lint
- npm run test
- npm run build
- npm run npm-build
- npm run is-es5
after_success:
- npx semantic-release
- codecov
env:
global:
# GH_TOKEN
- secure: qvCsyn5Ioj+b/gvX95yaQ+Vha+r60pGxuKFm6HzVbnWJyKAbR1NN8+RpIo0HUD9S5RPEFjLae82bLa2g/syS+D1DU9qF8NYderjy58bjibgrPdC1YOhi2SEY5u6TW6/T88+w9DyfZ6MF883lJi/6uzs24bHE13RguARlO79OeGvHk6SecoJSWe9yq2IHA0wAScKrvS64+AcUWyTDUvkrxHEvupVJs6aJ6EsdPALODLJ7JnXX7Rh+68nyqbezh+ZnumxBPkdCzUNdtO9C0o7JjV6/P1xg9rNre/huWGx4SYndPaPEmoOpWEfyCZw1ub83LHC1HBnE7eRJku/CmiaiaLGSfeU2sCRteBLlSyI5fEOQ4Su2xLu2k+Yuczj4BlIbjr+xC+bNg+WbOF8vj7TL4/YCxOG/8V4nLfDcHFsZDsPoYZyBe9Z5HsS77S5ZrutQ3i/qR+4zfs4X/QfPXfW3MqI7+oGo+PVNPgxI24i2Kwq5+ZUjnmkVnuGC5ZOZMN8aYojEvqdF+u5VALL/YCmXsXysL6BUsqv4kiZJpQEVBG0WPbh0FJH8qiB8OjLGogxkoSrL4Yd++o4fnSAvW1UgARIlJ0iHVf5r/wVei1KCQiFS6mh0Pwq1lM0Vo2SlTCF5UylnV80Hv7XY6Sp9dYi/EaVG1dv4DyJOHnPti1JAM/U=
# NPM_TOKEN
- secure: S6spzx4jJGWqucSwjaSdPEaNWlwzA75FisK+NoLFDY6uU7KIi2dayHiFlSW1C1vl5xQkkosHXJAInSwcnQMCUomCEuD1FFzydXA1/Dn8NmPc35coKR4CX9yJiArRbjZZjboCulrTPUVWHWoPfA7JTnqCDgOnXspgRKy7emzFLXkdn8vuUQcyXmmT/vDfQQjgq/T+DdBbMiradMvlTzxmKydAVeHAZ03A1Z5O6ePnR6IsFv4LgJ/RfGn501jHeTww6HsxfQX27tWLo5AyQ00YjMl9oXfs57n5u+em/ph3Xoc8Pz6wjkMLJ+eYo+xkYjoZ3d+/f+WXPLMBUNz0LpIBs7LcBHhAc2z4N+dce42CTXur/v8ra0BZEnZQsvOakHvox6KisDDlipPqc0yF7MgThbd31fc8QjdVxdh5w7tLH4PJ7QpBUtZwPskDLABKjnrxkxH+BysHADvVaNOBcZMwIA9yHY3GqzpyQ2upcS07h5a+SHx07viuA7hEn14XCtYrM1AHwS0n2sNdinb0qWOCcGOXzl39FU3N6xNueKoH/eIXuqJ7oiUkKBiSP9zApTApPL6nrng0InZhGjzZHOMNePPdin/uIrxk/fp/wqneGTQemCGRkfHdPT0yuIP22bUv/OmDtgNEG9t9hbIZGYgQmG4FTeTQQ7lC5RjmLrn+uWI=

View File

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

55
Makefile Executable file → Normal file
View File

@@ -1,17 +1,23 @@
transifex_resource = frontend-app-profile
transifex_langs = "ar,fr,es_419,zh_CN"
intl_imports = ./node_modules/.bin/intl-imports.js
transifex_utils = ./node_modules/.bin/transifex-utils.js
i18n = ./src/i18n
transifex_input = $(i18n)/transifex_input.json
tx_url1 = https://www.transifex.com/api/2/project/edx-platform/resource/$(transifex_resource)/translation/en/strings/
tx_url2 = https://www.transifex.com/api/2/project/edx-platform/resource/$(transifex_resource)/source/
# This directory must match .babelrc .
transifex_temp = ./temp/babel-plugin-react-intl
transifex_temp = ./temp/babel-plugin-formatjs
requirements:
npm install
NPM_TESTS=build i18n_extract lint test
.PHONY: test
test: $(addprefix test.npm.,$(NPM_TESTS)) ## validate ci suite
.PHONY: test.npm.*
test.npm.%: validate-no-uncommitted-package-lock-changes
test -d node_modules || $(MAKE) requirements
npm run $(*)
.PHONY: requirements
requirements: ## install ci requirements
npm ci
i18n.extract:
# Pulling display strings from .jsx files into .json files...
@@ -29,29 +35,20 @@ detect_changed_source_translations:
# Checking for changed translations...
git diff --exit-code $(i18n)
# Pushes translations to Transifex. You must run make extract_translations first.
push_translations:
# Pushing strings to Transifex...
tx push -s
# Fetching hashes from Transifex...
./node_modules/reactifex/bash_scripts/get_hashed_strings.sh $(tx_url1)
# Writing out comments to file...
$(transifex_utils) $(transifex_temp) --comments
# Pushing comments to Transifex...
./node_modules/reactifex/bash_scripts/put_comments.sh $(tx_url2)
# Pulls translations from Transifex.
pull_translations:
tx pull -f --mode reviewed --language=$(transifex_langs)
rm -rf src/i18n/messages
mkdir src/i18n/messages
cd src/i18n/messages \
&& atlas pull $(ATLAS_OPTIONS) \
translations/frontend-platform/src/i18n/messages:frontend-platform \
translations/paragon/src/i18n/messages:paragon \
translations/frontend-component-header/src/i18n/messages:frontend-component-header \
translations/frontend-component-footer/src/i18n/messages:frontend-component-footer \
translations/frontend-app-profile/src/i18n/messages:frontend-app-profile
$(intl_imports) frontend-platform paragon frontend-component-header frontend-component-footer frontend-app-profile
# 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
npm-build:
rm -rf ./npm-dist
./node_modules/.bin/fedx-scripts babel src/profile --out-dir npm-dist --source-maps --ignore **/*.test.jsx,**/*.test.js,**/setupTest.js --copy-files
@# --copy-files will bring in everything else that wasn't processed by babel. Remove what we don't want.
@find npm-dist -name '*.test.js*' -delete
@rm -rf ./npm-dist/__mocks__

View File

@@ -1,70 +1,153 @@
|Build Status| |Codecov| |npm_version| |npm_downloads| |license| |semantic-release|
#####################
frontend-app-profile
====================
#####################
This is a micro-frontend application responsible for the display and updating of user profiles. Please tag **@edx/arch-fed** on any PRs or issues.
|license-badge| |status-badge| |ci-badge| |codecov-badge|
.. |license-badge| image:: https://img.shields.io/github/license/openedx/frontend-app-profile.svg
:target: https://github.com/openedx/frontend-app-profile/blob/main/LICENSE
:alt: License
.. |status-badge| image:: https://img.shields.io/badge/Status-Maintained-brightgreen
.. |ci-badge| image:: https://github.com/openedx/frontend-app-profile/actions/workflows/ci.yml/badge.svg
:target: https://github.com/openedx/frontend-app-profile/actions/workflows/ci.yml
:alt: Continuous Integration
.. |codecov-badge| image:: https://codecov.io/github/openedx/frontend-app-profile/coverage.svg?branch=main
:target: https://codecov.io/github/openedx/frontend-app-profile?branch=main
:alt: Codecov
********
Purpose
********
This is a micro-frontend application responsible for the display and updating of user profiles.
When a user views their own profile, they're given fields to edit their full name, location, primary spoken language, education, social links, and bio. Each field also has a dropdown to select the visibility of that field - i.e., whether it can be viewed by other learners.
When a user views someone else's profile, they see all those fields that that user set as public.
----------
***************
Getting Started
***************
Development
-----------
Installation
============
Start Devstack
^^^^^^^^^^^^^^
Follow these steps to provision, run, and enable an instance of the
Profile MFE for local development via the `devstack`_.
To use this application `devstack <https://github.com/edx/devstack>`__ must be running and you must be logged into it.
.. _devstack: https://github.com/openedx/devstack#getting-started
- Start devstack
- Log in (http://localhost:18000/login)
#. To use this application, `devstack <https://github.com/openedx/devstack>`__ must be running and you must be logged into it.
Start the development server
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Start devstack
* Log in (http://localhost:18000/login)
In this project, install requirements and start the development server by running:
#. To run Profile, install requirements and start the development server by running:
.. code:: bash
.. code-block::
npm install
npm start # The server will run on port 1995
1. Clone your new repo:
Once the dev server is up visit http://localhost:1995/u/staff.
``git clone https://github.com/openedx/frontend-app-profile.git``
----------
2. Use node v18.x.
Configuration and Deployment
----------------------------
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-app-profile && npm ci``
4. Start the dev server:
``npm start``
The server will run on port 1995
Once the dev server is up, visit http://localhost:1995/u/staff.
Plugins
=======
This MFE can be customized using `Frontend Plugin Framework <https://github.com/openedx/frontend-plugin-framework>`_.
The parts of this MFE that can be customized in that manner are documented `here </src/plugin-slots>`_.
Configuration
=============
This MFE is configured via node environment variables supplied at build time. See the .env file for the list of required environment variables. Example build syntax with a single environment variable:
.. code:: bash
.. code-block::
NODE_ENV=production ACCESS_TOKEN_COOKIE_NAME='edx-jwt-cookie-header-payload' npm run build
Getting Help
============
For more information see the document: `Micro-frontend applications in Open
edX <https://edx.readthedocs.io/projects/edx-developer-docs/en/latest/micro-frontends-in-open-edx.html>`__.
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`_.
Notes
-----
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. Please tag **@openedx/2u-infinity** on any PRs or issues.
The production Webpack configuration for this repo uses `Purgecss <https://www.purgecss.com/>`__ to remove unused CSS from the production css file. In ``webpack.prod.config.js`` the Purgecss plugin is configured to scan directories to determine what css selectors should remain. Currently the src/ directory is scanned along with all ``@edx/frontend-component*`` node modules and ``@edx/paragon``. **If you add and use a component in this repo that relies on HTML classes or ids for styling you must add it to the Purgecss configuration or it will be unstyled in the production build.**
https://github.com/openedx/frontend-app-profile/issues
.. |Build Status| image:: https://api.travis-ci.org/edx/frontend-app-profile.svg?branch=master
:target: https://travis-ci.org/edx/frontend-app-profile
.. |Codecov| image:: https://img.shields.io/codecov/c/github/edx/frontend-app-profile
:target: https://codecov.io/gh/edx/frontend-app-profile
.. |npm_version| image:: https://img.shields.io/npm/v/@edx/frontend-app-profile.svg
:target: https://www.npmjs.com/package/@edx/frontend-app-profile
.. |npm_downloads| image:: https://img.shields.io/npm/dt/@edx/frontend-app-profile.svg
:target: https://www.npmjs.com/package/@edx/frontend-app-profile
.. |license| image:: https://img.shields.io/npm/l/@edx/frontend-app-profile.svg
:target: @edx/frontend-app-profile
.. |semantic-release| image:: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
:target: https://github.com/semantic-release/semantic-release
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/getting-help
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.
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/
People
======
The assigned maintainers for this component and other project details may be
found in `Backstage`_. Backstage pulls this data from the ``catalog-info.yaml``
file in this repo.
.. _Backstage: https://backstage.herokuapp.com/catalog/default/component/frontend-app-profile
Reporting Security Issues
=========================
Please do not report security issues in public. Email security@openedx.org instead.

24
catalog-info.yaml Normal file
View File

@@ -0,0 +1,24 @@
# 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-app-profile'
description: 'This is a micro-frontend application responsible for displaying and updating the user profiles.'
links:
- url: 'https://github.com/openedx/frontend-app-profile/blob/master/README.rst'
title: 'Documentation'
icon: 'Article'
annotations:
# (Optional) Annotation keys and values can be whatever you want.
# We use it in Open edX repos to have a comma-separated list of GitHub user
# names that might be interested in changes to the architecture of this
# component.
openedx.org/arch-interest-groups: ""
# This can be multiple comma-separated projects.
openedx.org/add-to-projects: "openedx:23"
spec:
owner: group:2u-infinity
type: 'service'
lifecycle: 'production'
# (Optional) An array of different components or resources.

View File

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

View File

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

View File

@@ -1,7 +1,6 @@
# This file describes this Open edX repo, as described in OEP-2:
# http://open-edx-proposals.readthedocs.io/en/latest/oeps/oep-0002.html#specification
# https://open-edx-proposals.readthedocs.io/en/latest/oep-0002-bp-repo-metadata.html#specification
nick: prof
oeps: {}
owner: edx/arch-team
openedx-release: {ref: master}

41802
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,92 +4,74 @@
"description": "User profile micro-frontend for Open edX",
"author": "edX",
"license": "AGPL-3.0",
"main": "npm-dist/index.js",
"repository": {
"type": "git",
"url": "git+https://github.com/edx/frontend-app-profile.git"
"url": "git+https://github.com/openedx/frontend-app-profile.git"
},
"scripts": {
"build": "fedx-scripts webpack",
"npm-build": "make npm-build",
"i18n_extract": "BABEL_ENV=i18n fedx-scripts babel src --quiet > /dev/null",
"is-es5": "es-check es5 ./dist/*.js",
"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",
"test": "fedx-scripts jest --coverage --passWithNoTests"
},
"files": [
"/npm-dist"
],
"husky": {
"hooks": {
"pre-commit": "npm run lint",
"commit-msg": "commitlint -e $GIT_PARAMS"
}
"test": "TZ=UTC fedx-scripts jest --coverage --passWithNoTests",
"stubs": "pact-stub-service ./src/pacts/frontend-app-profile-edx-platform.json --port 18000"
},
"bugs": {
"url": "https://github.com/edx/frontend-app-profile/issues"
"url": "https://github.com/openedx/frontend-app-profile/issues"
},
"homepage": "https://github.com/edx/frontend-app-profile#readme",
"homepage": "https://github.com/openedx/frontend-app-profile#readme",
"publishConfig": {
"access": "public"
},
"browserslist": [
"last 2 versions",
"ie 11"
"extends @edx/browserslist-config"
],
"dependencies": {
"@edx/brand": "npm:@edx/brand-openedx@1.1.0",
"@edx/frontend-component-footer": "10.1.5",
"@edx/frontend-component-header": "2.3.0",
"@edx/frontend-platform": "1.11.0",
"@edx/paragon": "13.1.2",
"@fortawesome/fontawesome-svg-core": "1.2.25",
"@fortawesome/free-brands-svg-icons": "5.7.2",
"@fortawesome/free-regular-svg-icons": "5.7.2",
"@fortawesome/free-solid-svg-icons": "5.7.2",
"@fortawesome/react-fontawesome": "0.1.8",
"classnames": "2.3.1",
"core-js": "3.14.0",
"email-prop-type": "1.1.7",
"font-awesome": "4.7.0",
"form-urlencoded": "3.0.2",
"history": "4.10.1",
"@edx/brand": "npm:@openedx/brand-openedx@^1.2.2",
"@edx/frontend-component-header": "^5.6.0",
"@edx/frontend-platform": "8.1.2",
"@edx/openedx-atlas": "^0.6.0",
"@fortawesome/fontawesome-svg-core": "6.6.0",
"@fortawesome/free-brands-svg-icons": "6.6.0",
"@fortawesome/free-regular-svg-icons": "6.6.0",
"@fortawesome/free-solid-svg-icons": "6.6.0",
"@fortawesome/react-fontawesome": "0.2.2",
"@openedx/frontend-slot-footer": "^1.0.2",
"@openedx/paragon": "^22.2.2",
"@pact-foundation/pact": "^11.0.2",
"@redux-devtools/extension": "3.3.0",
"classnames": "2.5.1",
"core-js": "3.38.1",
"history": "5.3.0",
"lodash.camelcase": "4.3.0",
"lodash.get": "4.4.2",
"lodash.memoize": "4.1.2",
"lodash.pick": "4.4.0",
"lodash.snakecase": "4.1.1",
"newrelic": "5.13.1",
"prop-types": "15.7.2",
"react": "16.14.0",
"react-dom": "16.14.0",
"react-redux": "7.2.4",
"react-router": "5.2.0",
"react-router-dom": "5.2.0",
"react-transition-group": "4.4.2",
"redux": "4.0.5",
"redux-devtools-extension": "2.13.9",
"prop-types": "15.8.1",
"react": "17.0.2",
"react-dom": "17.0.2",
"react-helmet": "6.1.0",
"react-redux": "7.2.9",
"react-router": "6.27.0",
"react-router-dom": "6.27.0",
"redux": "4.2.1",
"redux-logger": "3.0.6",
"redux-saga": "1.1.3",
"redux-thunk": "2.3.0",
"regenerator-runtime": "0.13.7",
"reselect": "4.0.0",
"universal-cookie": "3.1.0"
"redux-saga": "1.3.0",
"redux-thunk": "2.4.2",
"regenerator-runtime": "0.14.1",
"reselect": "4.1.8",
"universal-cookie": "4.0.4"
},
"devDependencies": {
"@commitlint/cli": "8.3.5",
"@commitlint/config-angular": "8.3.4",
"@edx/frontend-build": "5.6.14",
"codecov": "3.8.2",
"enzyme": "3.11.0",
"enzyme-adapter-react-16": "1.15.6",
"es-check": "5.2.3",
"glob": "7.1.7",
"husky": "3.1.0",
"purgecss-webpack-plugin": "1.6.0",
"react-test-renderer": "16.14.0",
"@commitlint/cli": "19.5.0",
"@commitlint/config-angular": "19.5.0",
"@edx/browserslist-config": "^1.1.1",
"@edx/reactifex": "2.2.0",
"@openedx/frontend-build": "14.1.5",
"@testing-library/jest-dom": "6.6.2",
"@testing-library/react": "12.1.5",
"glob": "10.4.5",
"reactifex": "1.1.1",
"redux-mock-store": "1.5.4"
}

View File

@@ -4,9 +4,7 @@
<title>Learner Profile | <%= process.env.SITE_NAME %></title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin>
<link href="https://fonts.googleapis.com/css?family=Roboto:400,500,700" rel="stylesheet">
<link rel="shortcut icon" href="<%=webpackConfig.output.publicPath%>favicon.ico" type="image/x-icon" />
<link rel="shortcut icon" href="<%=htmlWebpackPlugin.options.FAVICON_URL%>" type="image/x-icon" />
</head>
<body>
<div id="root"></div>

View File

@@ -22,6 +22,11 @@
"pin"
],
"automerge": true
},
{
"matchPackagePatterns": ["@edx", "@openedx"],
"matchUpdateTypes": ["minor", "patch"],
"automerge": true
}
],
"timezone": "America/New_York"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -1,7 +1,7 @@
import { getConfig } from '@edx/frontend-platform';
import { applyMiddleware, createStore, compose } from 'redux';
import thunkMiddleware from 'redux-thunk';
import { composeWithDevTools } from 'redux-devtools-extension';
import { composeWithDevTools } from '@redux-devtools/extension';
import { createLogger } from 'redux-logger';
import createSagaMiddleware from 'redux-saga';

21
src/head/Head.jsx Normal file
View File

@@ -0,0 +1,21 @@
import React from 'react';
import { Helmet } from 'react-helmet';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { getConfig } from '@edx/frontend-platform';
import messages from './messages';
const Head = ({ intl }) => (
<Helmet>
<title>
{intl.formatMessage(messages['profile.page.title'], { siteName: getConfig().SITE_NAME })}
</title>
<link rel="shortcut icon" href={getConfig().FAVICON_URL} type="image/x-icon" />
</Helmet>
);
Head.propTypes = {
intl: intlShape.isRequired,
};
export default injectIntl(Head);

17
src/head/Head.test.jsx Normal file
View File

@@ -0,0 +1,17 @@
import React from 'react';
import { IntlProvider } from '@edx/frontend-platform/i18n';
import { Helmet } from 'react-helmet';
import { render } from '@testing-library/react';
import { getConfig } from '@edx/frontend-platform';
import Head from './Head';
describe('Head', () => {
const props = {};
it('should match render title tag and favicon with the site configuration values', () => {
render(<IntlProvider locale="en"><Head {...props} /></IntlProvider>);
const helmet = Helmet.peek();
expect(helmet.title).toEqual(`Profile | ${getConfig().SITE_NAME}`);
expect(helmet.linkTags[0].rel).toEqual('shortcut icon');
expect(helmet.linkTags[0].href).toEqual(getConfig().FAVICON_URL);
});
});

11
src/head/messages.js Normal file
View File

@@ -0,0 +1,11 @@
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
'profile.page.title': {
id: 'profile.page.title',
defaultMessage: 'Profile | {siteName}',
description: 'Title tag',
},
});
export default messages;

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

@@ -0,0 +1 @@
export default [];

View File

@@ -1,32 +0,0 @@
import arMessages from './messages/ar.json';
import caMessages from './messages/ca.json';
// no need to import en messages-- they are in the defaultMessage field
import es419Messages from './messages/es_419.json';
import frMessages from './messages/fr.json';
import zhcnMessages from './messages/zh_CN.json';
import heMessages from './messages/he.json';
import idMessages from './messages/id.json';
import kokrMessages from './messages/ko_kr.json';
import plMessages from './messages/pl.json';
import ptbrMessages from './messages/pt_br.json';
import ruMessages from './messages/ru.json';
import thMessages from './messages/th.json';
import ukMessages from './messages/uk.json';
const messages = {
ar: arMessages,
'es-419': es419Messages,
fr: frMessages,
'zh-cn': zhcnMessages,
ca: caMessages,
he: heMessages,
id: idMessages,
'ko-kr': kokrMessages,
pl: plMessages,
'pt-br': ptbrMessages,
ru: ruMessages,
th: thMessages,
uk: ukMessages,
};
export default messages;

View File

@@ -1,51 +0,0 @@
{
"profile.age.headline": "لا يمكن مشاركة ملفك الشخصي",
"profile.age.details": "لمشاركة ملفك الشخصي مع متعلمي edX الآخرين يجب التحقق من أن يكون عمرك أكثر من ١٣ سنة",
"profile.age.set.date": "اضبط تاريخ ميلاك",
"profile.datejoined.member.since": "عضو منذُ {year}",
"profile.bio.empty": "أضف نبذة قصيرة",
"profile.bio.about.me": "نبذة عنّي",
"profile.certificate.organization.label": "من",
"profile.certificate.completion.date.label": "مكتمل في",
"profile.no.certificates": "لم تحصل على أية شهادات حتى الآن.",
"profile.certificates.my.certificates": "شهاداتي",
"profile.certificates.view.certificate": "معاينة الشهادة",
"profile.certificates.types.verified": "شهادة موثقة",
"profile.certificates.types.professional": "شهادة مهنية",
"profile.certificates.types.unknown": "شهادة",
"profile.country.label": "الموقع",
"profile.country.empty": "أضف موقعًا",
"profile.education.empty": "أضف مؤهلًا تعليميًا",
"profile.education.education": "المستوى التعليمي",
"profile.education.levels.p": "شهادة دكتوراه",
"profile.education.levels.m": "ماجستير أو شهادة مهنيّة",
"profile.education.levels.b": "درجة البكالوريوس",
"profile.education.levels.a": "درجة الزمالة",
"profile.education.levels.hs": "شهادة الثانوية العامة",
"profile.education.levels.jhs": "شهادة الثانوية الصغرى/الإعدادية/المرحلة المتوسّطة",
"profile.education.levels.el": "شهادة المدرسة الابتدائية",
"profile.education.levels.none": "لا يوجد تعليم رسمي",
"profile.education.levels.o": "نوع آخر من التعليم",
"profile.editbutton.edit": "تحرير",
"profile.formcontrols.who.can.see": "من يمكنه مشاهدة هذا:",
"profile.formcontrols.button.cancel": "إلغاء",
"profile.formcontrols.button.save": "حفظ",
"profile.formcontrols.button.saving": "جاري الحفظ",
"profile.formcontrols.button.saved": "تم الحفظ",
"profile.visibility.who.just.me": "أنا فقط",
"profile.visibility.who.everyone": "جميع أعضاء edX",
"profile.name.full.name": "الاسم الكامل",
"profile.name.details": "هذا هو الاسم الذي سيظهر في حسابك وفي شهاداتك",
"profile.name.empty": "إضافة اسم",
"profile.preferredlanguage.empty": "إضافة اللغة",
"profile.preferredlanguage.label": "لغة التحدث الأم",
"profile.profileavatar.upload-button": "تحميل صورة",
"profile.profileavatar.remove.button": "حذف",
"profile.image.alt.attribute": "صورة عرض الملف الشخصي",
"profile.profileavatar.change-button": "تغيير",
"profile.sociallinks.add": "إضافة {network}",
"profile.sociallinks.social.links": "روابط قنوات التواصل الاجتماعي",
"profile.notfound.message": "الصفحة التي تبحث عنها غير متوفرة أو هناك خطأ في نص الرابط. الرجاء التحقق من الرابط والمحاولة مجددا.",
"profile.viewMyRecords": "عرض سجلّاتي",
"profile.loading": "جاري تحميل الملف الشخصي ..."
}

View File

@@ -1 +0,0 @@
{}

View File

@@ -1,51 +0,0 @@
{
"profile.age.headline": "Tu perfil no puede ser compartido.",
"profile.age.details": "Para compartir tu perfil con otros estudiantes de edX, debes confirmar que tienes más de 13 años.",
"profile.age.set.date": "Establece tu fecha de nacimiento",
"profile.datejoined.member.since": "Miembro desde {year}",
"profile.bio.empty": "Añade una breve biografía",
"profile.bio.about.me": "Sobre Mí",
"profile.certificate.organization.label": "Desde",
"profile.certificate.completion.date.label": "Completado el {date}",
"profile.no.certificates": "Todavía no ha obtenido ningún certificado.",
"profile.certificates.my.certificates": "Mis Certificados",
"profile.certificates.view.certificate": "Ver Certificado",
"profile.certificates.types.verified": "Certificado verificado",
"profile.certificates.types.professional": "Certificado profesional",
"profile.certificates.types.unknown": "Certificado",
"profile.country.label": "Ubicación",
"profile.country.empty": "Añade ubicación",
"profile.education.empty": "Añade Educación",
"profile.education.education": "Educación",
"profile.education.levels.p": "Doctorado",
"profile.education.levels.m": "Master o magíster",
"profile.education.levels.b": "Pregrado o Licenciatura",
"profile.education.levels.a": "Grado técnico - tecnológico",
"profile.education.levels.hs": "Enseñanza secundaria",
"profile.education.levels.jhs": "Formación media",
"profile.education.levels.el": "Enseñanza primaria",
"profile.education.levels.none": "Ninguna educación formal",
"profile.education.levels.o": "Otra educación",
"profile.editbutton.edit": "Editar",
"profile.formcontrols.who.can.see": "Quién puede ver esto:",
"profile.formcontrols.button.cancel": "Cancelar",
"profile.formcontrols.button.save": "Guardar",
"profile.formcontrols.button.saving": "Guardando",
"profile.formcontrols.button.saved": "Guardado",
"profile.visibility.who.just.me": "Solo yo",
"profile.visibility.who.everyone": "Todos en edX",
"profile.name.full.name": "Nombre completo",
"profile.name.details": "Este es el nombre que aparecerá en tu cuenta y en tus certificados.",
"profile.name.empty": "Añade nombre",
"profile.preferredlanguage.empty": "Añadir idioma",
"profile.preferredlanguage.label": "Idioma principal que hablas",
"profile.profileavatar.upload-button": "Subir foto",
"profile.profileavatar.remove.button": "Eliminar",
"profile.image.alt.attribute": "avatar del perfil",
"profile.profileavatar.change-button": "Cambiar",
"profile.sociallinks.add": "Añade {network}",
"profile.sociallinks.social.links": "Enlaces De Redes Sociales",
"profile.notfound.message": "La página que estas buscando no está disponible o hay un error en la URL. Por favor, comprueba la URL y vuelve a intentarlo.",
"profile.viewMyRecords": "Ver mis registros",
"profile.loading": "Cargando perfil..."
}

View File

@@ -1,51 +0,0 @@
{
"profile.age.headline": "Your profile cannot be shared.",
"profile.age.details": "To share your profile with other edX learners, you must confirm that you are over the age of 13.",
"profile.age.set.date": "Set your date of birth",
"profile.datejoined.member.since": "Member since {year}",
"profile.bio.empty": "Add a short bio",
"profile.bio.about.me": "About Me",
"profile.certificate.organization.label": "From",
"profile.certificate.completion.date.label": "Completed on {date}",
"profile.no.certificates": "You don't have any certificates yet.",
"profile.certificates.my.certificates": "My Certificates",
"profile.certificates.view.certificate": "View Certificate",
"profile.certificates.types.verified": "Verified Certificate",
"profile.certificates.types.professional": "Professional Certificate",
"profile.certificates.types.unknown": "Certificate",
"profile.country.label": "Location",
"profile.country.empty": "Add location",
"profile.education.empty": "Add education",
"profile.education.education": "Education",
"profile.education.levels.p": "Doctorate",
"profile.education.levels.m": "Master's or professional degree",
"profile.education.levels.b": "Bachelor's Degree",
"profile.education.levels.a": "Associate's degree",
"profile.education.levels.hs": "Secondary/high school",
"profile.education.levels.jhs": "Junior secondary/junior high/middle school",
"profile.education.levels.el": "Elementary/primary school",
"profile.education.levels.none": "No formal education",
"profile.education.levels.o": "Other education",
"profile.editbutton.edit": "Edit",
"profile.formcontrols.who.can.see": "Who can see this:",
"profile.formcontrols.button.cancel": "Cancel",
"profile.formcontrols.button.save": "Save",
"profile.formcontrols.button.saving": "Saving",
"profile.formcontrols.button.saved": "Saved",
"profile.visibility.who.just.me": "Just me",
"profile.visibility.who.everyone": "Everyone on edX",
"profile.name.full.name": "Full Name",
"profile.name.details": "This is the name that appears in your account and on your certificates.",
"profile.name.empty": "Add name",
"profile.preferredlanguage.empty": "Add language",
"profile.preferredlanguage.label": "Primary Language Spoken",
"profile.profileavatar.upload-button": "Upload Photo",
"profile.profileavatar.remove.button": "Remove",
"profile.image.alt.attribute": "profile avatar",
"profile.profileavatar.change-button": "Change",
"profile.sociallinks.add": "Add {network}",
"profile.sociallinks.social.links": "Social Links",
"profile.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.",
"profile.viewMyRecords": "View My Records",
"profile.loading": "Profile loading..."
}

View File

@@ -1 +0,0 @@
{}

View File

@@ -1 +0,0 @@
{}

View File

@@ -1 +0,0 @@
{}

View File

@@ -1 +0,0 @@
{}

View File

@@ -1 +0,0 @@
{}

View File

@@ -1 +0,0 @@
{}

View File

@@ -1 +0,0 @@
{}

View File

@@ -1 +0,0 @@
{}

View File

@@ -1,51 +0,0 @@
{
"profile.age.headline": "Your profile cannot be shared.",
"profile.age.details": "To share your profile with other edX learners, you must confirm that you are over the age of 13.",
"profile.age.set.date": "Set your date of birth",
"profile.datejoined.member.since": "Member since {year}",
"profile.bio.empty": "Add a short bio",
"profile.bio.about.me": "About Me",
"profile.certificate.organization.label": "From",
"profile.certificate.completion.date.label": "Completed on {date}",
"profile.no.certificates": "You don't have any certificates yet.",
"profile.certificates.my.certificates": "My Certificates",
"profile.certificates.view.certificate": "View Certificate",
"profile.certificates.types.verified": "Verified Certificate",
"profile.certificates.types.professional": "Professional Certificate",
"profile.certificates.types.unknown": "Certificate",
"profile.country.label": "Location",
"profile.country.empty": "Add location",
"profile.education.empty": "Add education",
"profile.education.education": "Education",
"profile.education.levels.p": "Doctorate",
"profile.education.levels.m": "Master's or professional degree",
"profile.education.levels.b": "Bachelor's Degree",
"profile.education.levels.a": "Associate's degree",
"profile.education.levels.hs": "Secondary/high school",
"profile.education.levels.jhs": "Junior secondary/junior high/middle school",
"profile.education.levels.el": "Elementary/primary school",
"profile.education.levels.none": "No formal education",
"profile.education.levels.o": "Other education",
"profile.editbutton.edit": "Edit",
"profile.formcontrols.who.can.see": "Who can see this:",
"profile.formcontrols.button.cancel": "Cancel",
"profile.formcontrols.button.save": "Save",
"profile.formcontrols.button.saving": "Saving",
"profile.formcontrols.button.saved": "Saved",
"profile.visibility.who.just.me": "Just me",
"profile.visibility.who.everyone": "Everyone on edX",
"profile.name.full.name": "Full Name",
"profile.name.details": "This is the name that appears in your account and on your certificates.",
"profile.name.empty": "Add name",
"profile.preferredlanguage.empty": "Add language",
"profile.preferredlanguage.label": "Primary Language Spoken",
"profile.profileavatar.upload-button": "Upload Photo",
"profile.profileavatar.remove.button": "Remove",
"profile.image.alt.attribute": "profile avatar",
"profile.profileavatar.change-button": "Change",
"profile.sociallinks.add": "Add {network}",
"profile.sociallinks.social.links": "Social Links",
"profile.notfound.message": "The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again.",
"profile.viewMyRecords": "View My Records",
"profile.loading": "Profile loading..."
}

View File

@@ -5,6 +5,7 @@ import {
APP_INIT_ERROR,
APP_READY,
initialize,
mergeConfig,
subscribe,
} from '@edx/frontend-platform';
import {
@@ -14,30 +15,27 @@ import {
import React from 'react';
import ReactDOM from 'react-dom';
import { Route, Switch } from 'react-router-dom';
import Header, { messages as headerMessages } from '@edx/frontend-component-header';
import Footer, { messages as footerMessages } from '@edx/frontend-component-footer';
import Header from '@edx/frontend-component-header';
import FooterSlot from '@openedx/frontend-slot-footer';
import appMessages from './i18n';
import { ProfilePage, NotFoundPage } from './profile';
import messages from './i18n';
import configureStore from './data/configureStore';
import './index.scss';
import './assets/favicon.ico';
import Head from './head/Head';
import AppRoutes from './routes/AppRoutes';
subscribe(APP_READY, () => {
ReactDOM.render(
<AppProvider store={configureStore()}>
<Head />
<Header />
<main>
<Switch>
<Route path="/u/:username" component={ProfilePage} />
<Route path="/notfound" component={NotFoundPage} />
<Route path="*" component={NotFoundPage} />
</Switch>
<main id="main">
<AppRoutes />
</main>
<Footer />
<FooterSlot />
</AppProvider>,
document.getElementById('root'),
);
@@ -48,11 +46,14 @@ subscribe(APP_INIT_ERROR, (error) => {
});
initialize({
messages: [
appMessages,
headerMessages,
footerMessages,
],
requireAuthenticatedUser: true,
messages,
hydrateAuthenticatedUser: true,
handlers: {
config: () => {
mergeConfig({
COLLECT_YEAR_OF_BIRTH: process.env.COLLECT_YEAR_OF_BIRTH,
ENABLE_SKILLS_BUILDER_PROFILE: process.env.ENABLE_SKILLS_BUILDER_PROFILE,
}, 'App loadConfig override handler');
},
},
});

View File

@@ -1,9 +1,6 @@
$fa-font-path: "~font-awesome/fonts";
@import "~font-awesome/scss/font-awesome";
@import "~@edx/brand/paragon/fonts";
@import "~@edx/brand/paragon/variables";
@import "~@edx/paragon/scss/core/core";
@import "~@openedx/paragon/scss/core/core";
@import "~@edx/brand/paragon/overrides";
@import "~@edx/frontend-component-header/dist/index";
@import "~@edx/frontend-component-footer/dist/footer";

View File

@@ -0,0 +1,77 @@
{
"consumer": {
"name": "frontend-app-profile"
},
"interactions": [
{
"description": "A request for user's basic information",
"providerStates": [
{
"name": "Account and user's information does not exist"
}
],
"request": {
"method": "GET",
"path": "/api/user/v1/accounts/staff_not_found"
},
"response": {
"status": 404
}
},
{
"description": "A request for user's basic information",
"providerStates": [
{
"name": "I have a user's basic information"
}
],
"request": {
"method": "GET",
"path": "/api/user/v1/accounts/staff"
},
"response": {
"body": {
"bio": "This is my bio",
"country": "ME",
"dateJoined": "2017-06-07T00:44:23Z",
"email": "staff@example.com",
"isActive": true,
"name": "Lemon Seltzer",
"username": "staff",
"yearOfBirth": 1901
},
"headers": {
"Content-Type": "application/json"
},
"matchingRules": {
"body": {
"$": {
"combine": "AND",
"matchers": [
{
"match": "type"
}
]
}
}
},
"status": 200
}
}
],
"metadata": {
"pact-js": {
"version": "11.0.2"
},
"pactRust": {
"ffi": "0.4.0",
"models": "1.0.4"
},
"pactSpecification": {
"version": "3.0.0"
}
},
"provider": {
"name": "edx-platform"
}
}

View File

@@ -0,0 +1,50 @@
# Footer Slot
### Slot ID: `footer_slot`
## Description
This slot is used to replace/modify/hide the footer.
The implementation of the `FooterSlot` component lives in [the `frontend-slot-footer` repository](https://github.com/openedx/frontend-slot-footer/).
## Example
The following `env.config.jsx` will replace the default footer.
![Screenshot of Default Footer](./images/default_footer.png)
with a simple custom footer
![Screenshot of Custom Footer](./images/custom_footer.png)
```jsx
import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework';
const config = {
pluginSlots: {
footer_slot: {
plugins: [
{
// Hide the default footer
op: PLUGIN_OPERATIONS.Hide,
widgetId: 'default_contents',
},
{
// Insert a custom footer
op: PLUGIN_OPERATIONS.Insert,
widget: {
id: 'custom_footer',
type: DIRECT_PLUGIN,
RenderWidget: () => (
<h1 style={{textAlign: 'center'}}>🦶</h1>
),
},
},
]
}
},
}
export default config;
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,3 @@
# `frontend-app-profile` Plugin Slots
* [`footer_slot`](./FooterSlot/)

View File

@@ -1,40 +1,40 @@
import React from 'react';
import PropTypes from 'prop-types';
import { StatusAlert } from '@edx/paragon';
import { Alert } from '@openedx/paragon';
import { FormattedMessage } from '@edx/frontend-platform/i18n';
import { getConfig } from '@edx/frontend-platform';
function AgeMessage({ accountSettingsUrl }) {
return (
<StatusAlert
alertType="info"
dialog={(
<>
<FormattedMessage
id="profile.age.headline"
defaultMessage="Your profile cannot be shared."
description="error message"
tagName="h6"
/>
<FormattedMessage
id="profile.age.details"
defaultMessage="To share your profile with other edX learners, you must confirm that you are over the age of 13."
description="error message"
tagName="p"
/>
<a href={accountSettingsUrl}>
<FormattedMessage
id="profile.age.set.date"
defaultMessage="Set your date of birth"
description="label on a link to set birthday"
/>
</a>
</>
)}
dismissible={false}
open
const AgeMessage = ({ accountSettingsUrl }) => (
<Alert
variant="info"
dismissible={false}
show
>
<Alert.Heading id="profile.age.headline">
<FormattedMessage
id="profile.age.cannotShare"
defaultMessage="Your profile cannot be shared."
description="Error message indicating that the user's profile cannot be shared"
/>
</Alert.Heading>
<FormattedMessage
id="profile.age.details"
defaultMessage="To share your profile with other {siteName} learners, you must confirm that you are over the age of 13."
description="Error message"
tagName="p"
values={{
siteName: getConfig().SITE_NAME,
}}
/>
);
}
<Alert.Link href={accountSettingsUrl}>
<FormattedMessage
id="profile.age.set.date"
defaultMessage="Set your date of birth"
description="Label on a link to set birthday"
/>
</Alert.Link>
</Alert>
);
AgeMessage.propTypes = {
accountSettingsUrl: PropTypes.string.isRequired,

View File

@@ -1,7 +1,5 @@
import React from 'react';
function Banner() {
return <div className="profile-page-bg-banner bg-primary d-none d-md-block p-relative" />;
}
const Banner = () => <div className="profile-page-bg-banner bg-primary d-md-block p-relative" />;
export default Banner;

View File

@@ -2,7 +2,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import { FormattedMessage, FormattedDate } from '@edx/frontend-platform/i18n';
function DateJoined({ date }) {
const DateJoined = ({ date }) => {
if (date == null) {
return null;
}
@@ -19,7 +19,7 @@ function DateJoined({ date }) {
/>
</p>
);
}
};
DateJoined.propTypes = {
date: PropTypes.string,

View File

@@ -1,16 +1,16 @@
import React from 'react';
import { FormattedMessage } from '@edx/frontend-platform/i18n';
export default function NotFoundPage() {
return (
<div className="container-fluid d-flex py-5 justify-content-center align-items-start text-center">
<p className="my-0 py-5 text-muted" style={{ maxWidth: '32em' }}>
<FormattedMessage
id="profile.notfound.message"
defaultMessage="The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again."
description="error message when a page does not exist"
/>
</p>
</div>
);
}
const NotFoundPage = () => (
<div className="container-fluid d-flex py-5 justify-content-center align-items-start text-center">
<p className="my-0 py-5 text-muted" style={{ maxWidth: '32em' }}>
<FormattedMessage
id="profile.notfound.message"
defaultMessage="The page you're looking for is unavailable or there's an error in the URL. Please check the URL and try again."
description="error message when a page does not exist"
/>
</p>
</div>
);
export default NotFoundPage;

View File

@@ -3,10 +3,10 @@ import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { sendTrackingLogEvent } from '@edx/frontend-platform/analytics';
import { ensureConfig } from '@edx/frontend-platform';
import { ensureConfig, getConfig } from '@edx/frontend-platform';
import { AppContext } from '@edx/frontend-platform/react';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { StatusAlert, Hyperlink } from '@edx/paragon';
import { Alert, Hyperlink } from '@openedx/paragon';
// Actions
import {
@@ -30,8 +30,10 @@ import Bio from './forms/Bio';
import Certificates from './forms/Certificates';
import AgeMessage from './AgeMessage';
import DateJoined from './DateJoined';
import UsernameDescription from './UsernameDescription';
import PageLoading from './PageLoading';
import Banner from './Banner';
import LearningGoal from './forms/LearningGoal';
// Selectors
import { profilePageSelector } from './data/selectors';
@@ -39,16 +41,18 @@ import { profilePageSelector } from './data/selectors';
// i18n
import messages from './ProfilePage.messages';
import withParams from '../utils/hoc';
ensureConfig(['CREDENTIALS_BASE_URL', 'LMS_BASE_URL'], 'ProfilePage');
class ProfilePage extends React.Component {
constructor(props, context) {
super(props, context);
const credentialsBaseUrl = context.config.CREDENTIALS_BASE_URL;
const credentialsBaseUrl = context.config.CREDENTIALS_BASE_URL;
this.state = {
viewMyRecordsUrl: credentialsBaseUrl ? `${credentialsBaseUrl}/records` : null,
accountSettingsUrl: `${context.config.LMS_BASE_URL}/account/settings`,
accountSettingsUrl: context.config.ACCOUNT_SETTINGS_URL,
};
this.handleSaveProfilePhoto = this.handleSaveProfilePhoto.bind(this);
@@ -60,16 +64,12 @@ class ProfilePage extends React.Component {
}
componentDidMount() {
this.props.fetchProfile(this.props.match.params.username);
this.props.fetchProfile(this.props.params.username);
sendTrackingLogEvent('edx.profile.viewed', {
username: this.props.match.params.username,
username: this.props.params.username,
});
}
isAuthenticatedUserProfile() {
return this.props.match.params.username === this.context.authenticatedUser.username;
}
handleSaveProfilePhoto(formData) {
this.props.saveProfilePhoto(this.context.authenticatedUser.username, formData);
}
@@ -94,6 +94,18 @@ class ProfilePage extends React.Component {
this.props.updateDraft(name, value);
}
isYOBDisabled() {
const { yearOfBirth } = this.props;
const currentYear = new Date().getFullYear();
const isAgeOrNotCompliant = !yearOfBirth || ((currentYear - yearOfBirth) < 13);
return isAgeOrNotCompliant && getConfig().COLLECT_YEAR_OF_BIRTH !== 'true';
}
isAuthenticatedUserProfile() {
return this.props.params.username === this.context.authenticatedUser.username;
}
// Inserted into the DOM in two places (for responsive layout)
renderViewMyRecordsButton() {
if (!(this.state.viewMyRecordsUrl && this.isAuthenticatedUserProfile())) {
@@ -112,13 +124,12 @@ class ProfilePage extends React.Component {
const { dateJoined } = this.props;
return (
<>
<span data-hj-suppress>
<h1 className="h2 mb-0 font-weight-bold">{this.props.match.params.username}</h1>
<DateJoined date={dateJoined} />
<hr className="d-none d-md-block" />
</span>
</>
<span data-hj-suppress>
<h1 className="h2 mb-0 font-weight-bold text-truncate">{this.props.params.username}</h1>
<DateJoined date={dateJoined} />
{this.isYOBDisabled() && <UsernameDescription />}
<hr className="d-none d-md-block" />
</span>
);
}
@@ -132,7 +143,9 @@ class ProfilePage extends React.Component {
return (
<div className="row">
<div className="col-md-4 col-lg-3">
<StatusAlert alertType="danger" dialog={photoUploadError.userMessage} dismissible={false} open />
<Alert variant="danger" dismissible={false} show>
{photoUploadError.userMessage}
</Alert>
</div>
</div>
);
@@ -160,8 +173,11 @@ class ProfilePage extends React.Component {
socialLinks,
draftSocialLinksByPlatform,
visibilitySocialLinks,
learningGoal,
visibilityLearningGoal,
languageProficiencies,
visibilityLanguageProficiencies,
courseCertificates,
visibilityCourseCertificates,
bio,
visibilityBio,
@@ -180,6 +196,17 @@ class ProfilePage extends React.Component {
changeHandler: this.handleChange,
};
const isBlockVisible = (blockInfo) => this.isAuthenticatedUserProfile()
|| (!this.isAuthenticatedUserProfile() && Boolean(blockInfo));
const isLanguageBlockVisible = isBlockVisible(languageProficiencies.length);
const isEducationBlockVisible = isBlockVisible(levelOfEducation);
const isSocialLinksBLockVisible = isBlockVisible(socialLinks.some((link) => link.socialLink !== null));
const isBioBlockVisible = isBlockVisible(bio);
const isCertificatesBlockVisible = isBlockVisible(courseCertificates.length);
const isNameBlockVisible = isBlockVisible(name);
const isLocationBlockVisible = isBlockVisible(country);
return (
<div className="container-fluid">
<div className="row align-items-center pt-4 mb-4 pt-md-0 mb-md-0">
@@ -196,7 +223,7 @@ class ProfilePage extends React.Component {
/>
</div>
</div>
<div className="col pl-0">
<div className="col">
<div className="d-md-none">
{this.renderHeadingLockup()}
</div>
@@ -214,51 +241,73 @@ class ProfilePage extends React.Component {
<div className="d-md-none mb-4">
{this.renderViewMyRecordsButton()}
</div>
<Name
name={name}
visibilityName={visibilityName}
formId="name"
{...commonFormProps}
/>
<Country
country={country}
visibilityCountry={visibilityCountry}
formId="country"
{...commonFormProps}
/>
<PreferredLanguage
languageProficiencies={languageProficiencies}
visibilityLanguageProficiencies={visibilityLanguageProficiencies}
formId="languageProficiencies"
{...commonFormProps}
/>
<Education
levelOfEducation={levelOfEducation}
visibilityLevelOfEducation={visibilityLevelOfEducation}
formId="levelOfEducation"
{...commonFormProps}
/>
<SocialLinks
socialLinks={socialLinks}
draftSocialLinksByPlatform={draftSocialLinksByPlatform}
visibilitySocialLinks={visibilitySocialLinks}
formId="socialLinks"
{...commonFormProps}
/>
{isNameBlockVisible && (
<Name
name={name}
visibilityName={visibilityName}
formId="name"
{...commonFormProps}
/>
)}
{isLocationBlockVisible && (
<Country
country={country}
visibilityCountry={visibilityCountry}
formId="country"
{...commonFormProps}
/>
)}
{isLanguageBlockVisible && (
<PreferredLanguage
languageProficiencies={languageProficiencies}
visibilityLanguageProficiencies={visibilityLanguageProficiencies}
formId="languageProficiencies"
{...commonFormProps}
/>
)}
{isEducationBlockVisible && (
<Education
levelOfEducation={levelOfEducation}
visibilityLevelOfEducation={visibilityLevelOfEducation}
formId="levelOfEducation"
{...commonFormProps}
/>
)}
{isSocialLinksBLockVisible && (
<SocialLinks
socialLinks={socialLinks}
draftSocialLinksByPlatform={draftSocialLinksByPlatform}
visibilitySocialLinks={visibilitySocialLinks}
formId="socialLinks"
{...commonFormProps}
/>
)}
</div>
<div className="pt-md-3 col-md-8 col-lg-7 offset-lg-1">
{this.renderAgeMessage()}
<Bio
bio={bio}
visibilityBio={visibilityBio}
formId="bio"
{...commonFormProps}
/>
<Certificates
visibilityCourseCertificates={visibilityCourseCertificates}
formId="certificates"
{...commonFormProps}
/>
{!this.isYOBDisabled() && this.renderAgeMessage()}
{isBioBlockVisible && (
<Bio
bio={bio}
visibilityBio={visibilityBio}
formId="bio"
{...commonFormProps}
/>
)}
{getConfig().ENABLE_SKILLS_BUILDER_PROFILE && (
<LearningGoal
learningGoal={learningGoal}
visibilityLearningGoal={visibilityLearningGoal}
formId="learningGoal"
{...commonFormProps}
/>
)}
{isCertificatesBlockVisible && (
<Certificates
visibilityCourseCertificates={visibilityCourseCertificates}
formId="certificates"
{...commonFormProps}
/>
)}
</div>
</div>
</div>
@@ -284,6 +333,7 @@ ProfilePage.propTypes = {
// Bio form data
bio: PropTypes.string,
yearOfBirth: PropTypes.number,
visibilityBio: PropTypes.string.isRequired,
// Certificates form data
@@ -321,6 +371,10 @@ ProfilePage.propTypes = {
})),
visibilitySocialLinks: PropTypes.string.isRequired,
// Learning Goal form data
learningGoal: PropTypes.string,
visibilityLearningGoal: PropTypes.string.isRequired,
// Other data we need
profileImage: PropTypes.shape({
src: PropTypes.string,
@@ -343,10 +397,8 @@ ProfilePage.propTypes = {
updateDraft: PropTypes.func.isRequired,
// Router
match: PropTypes.shape({
params: PropTypes.shape({
username: PropTypes.string.isRequired,
}).isRequired,
params: PropTypes.shape({
username: PropTypes.string.isRequired,
}).isRequired,
// i18n
@@ -359,11 +411,13 @@ ProfilePage.defaultProps = {
photoUploadError: {},
profileImage: {},
name: null,
yearOfBirth: null,
levelOfEducation: null,
country: null,
socialLinks: [],
draftSocialLinksByPlatform: {},
bio: null,
learningGoal: null,
languageProficiencies: [],
courseCertificates: null,
requiresParentalConsent: null,
@@ -381,4 +435,4 @@ export default connect(
closeForm,
updateDraft,
},
)(injectIntl(ProfilePage));
)(injectIntl(withParams(ProfilePage)));

View File

@@ -3,10 +3,10 @@ import { getConfig } from '@edx/frontend-platform';
import * as analytics from '@edx/frontend-platform/analytics';
import { AppContext } from '@edx/frontend-platform/react';
import { configure as configureI18n, IntlProvider } from '@edx/frontend-platform/i18n';
import { mount } from 'enzyme';
import { render } from '@testing-library/react';
import React from 'react';
import PropTypes from 'prop-types';
import { Provider } from 'react-redux';
import renderer from 'react-test-renderer';
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
@@ -15,10 +15,10 @@ import ProfilePage from './ProfilePage';
const mockStore = configureMockStore([thunk]);
const storeMocks = {
loadingApp: require('./__mocks__/loadingApp.mockStore.js'),
viewOwnProfile: require('./__mocks__/viewOwnProfile.mockStore.js'),
viewOtherProfile: require('./__mocks__/viewOtherProfile.mockStore.js'),
savingEditedBio: require('./__mocks__/savingEditedBio.mockStore.js'),
loadingApp: require('./__mocks__/loadingApp.mockStore'),
viewOwnProfile: require('./__mocks__/viewOwnProfile.mockStore'),
viewOtherProfile: require('./__mocks__/viewOtherProfile.mockStore'),
savingEditedBio: require('./__mocks__/savingEditedBio.mockStore'),
};
const requiredProfilePageProps = {
fetchUserAccount: () => {},
@@ -28,7 +28,7 @@ const requiredProfilePageProps = {
deleteProfilePhoto: () => {},
openField: () => {},
closeField: () => {},
match: { params: { username: 'staff' } },
params: { username: 'staff' },
};
// Mock language cookie
@@ -65,84 +65,171 @@ beforeEach(() => {
analytics.sendTrackingLogEvent.mockReset();
});
const ProfilePageWrapper = ({
contextValue, store, params, requiresParentalConsent,
}) => (
<AppContext.Provider
value={contextValue}
>
<IntlProvider locale="en">
<Provider store={store}>
<ProfilePage {...requiredProfilePageProps} params={params} requiresParentalConsent={requiresParentalConsent} />
</Provider>
</IntlProvider>
</AppContext.Provider>
);
ProfilePageWrapper.defaultProps = {
params: { username: 'staff' },
requiresParentalConsent: null,
};
ProfilePageWrapper.propTypes = {
contextValue: PropTypes.shape({}).isRequired,
store: PropTypes.shape({}).isRequired,
params: PropTypes.shape({}),
requiresParentalConsent: PropTypes.bool,
};
describe('<ProfilePage />', () => {
describe('Renders correctly in various states', () => {
it('app loading', () => {
const component = (
<AppContext.Provider
value={{
authenticatedUser: { userId: null, username: null, administrator: false },
config: getConfig(),
}}
>
<IntlProvider locale="en">
<Provider store={mockStore(storeMocks.loadingApp)}>
<ProfilePage {...requiredProfilePageProps} />
</Provider>
</IntlProvider>
</AppContext.Provider>
);
const tree = renderer.create(component).toJSON();
const contextValue = {
authenticatedUser: { userId: null, username: null, administrator: false },
config: getConfig(),
};
const component = <ProfilePageWrapper contextValue={contextValue} store={mockStore(storeMocks.loadingApp)} />;
const { container: tree } = render(component);
expect(tree).toMatchSnapshot();
});
it('viewing own profile', () => {
const component = (
<AppContext.Provider
value={{
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: getConfig(),
}}
>
<IntlProvider locale="en">
<Provider store={mockStore(storeMocks.viewOwnProfile)}>
<ProfilePage {...requiredProfilePageProps} />
</Provider>
</IntlProvider>
</AppContext.Provider>
);
const tree = renderer.create(component).toJSON();
const contextValue = {
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: getConfig(),
};
const component = <ProfilePageWrapper contextValue={contextValue} store={mockStore(storeMocks.viewOwnProfile)} />;
const { container: tree } = render(component);
expect(tree).toMatchSnapshot();
});
it('viewing other profile', () => {
it('viewing other profile with all fields', () => {
const contextValue = {
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: getConfig(),
};
const component = (
<AppContext.Provider
value={{
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: getConfig(),
}}
>
<IntlProvider locale="en">
<Provider store={mockStore(storeMocks.viewOtherProfile)}>
<ProfilePage
{...requiredProfilePageProps}
match={{ params: { username: 'verified' } }} // Override default match
/>
</Provider>
</IntlProvider>
</AppContext.Provider>
<ProfilePageWrapper
contextValue={contextValue}
store={mockStore({
...storeMocks.viewOtherProfile,
profilePage: {
...storeMocks.viewOtherProfile.profilePage,
account: {
...storeMocks.viewOtherProfile.profilePage.account,
name: 'user',
country: 'EN',
bio: 'bio',
courseCertificates: ['course certificates'],
levelOfEducation: 'some level',
languageProficiencies: ['some lang'],
socialLinks: ['twitter'],
timeZone: 'time zone',
accountPrivacy: 'all_users',
},
},
})}
match={{ params: { username: 'verified' } }} // Override default match
/>
);
const tree = renderer.create(component).toJSON();
const { container: tree } = render(component);
expect(tree).toMatchSnapshot();
});
it('while saving an edited bio', () => {
const contextValue = {
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: getConfig(),
};
const component = (
<AppContext.Provider
value={{
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: getConfig(),
}}
>
<IntlProvider locale="en">
<Provider store={mockStore(storeMocks.savingEditedBio)}>
<ProfilePage {...requiredProfilePageProps} />
</Provider>
</IntlProvider>
</AppContext.Provider>
<ProfilePageWrapper
contextValue={contextValue}
store={mockStore(storeMocks.savingEditedBio)}
/>
);
const tree = renderer.create(component).toJSON();
const { container: tree } = render(component);
expect(tree).toMatchSnapshot();
});
it('while saving an edited bio with error', () => {
const storeData = JSON.parse(JSON.stringify(storeMocks.savingEditedBio));
storeData.profilePage.errors.bio = { userMessage: 'bio error' };
const contextValue = {
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: getConfig(),
};
const component = (
<ProfilePageWrapper
contextValue={contextValue}
store={mockStore(storeData)}
/>
);
const { container: tree } = render(component);
expect(tree).toMatchSnapshot();
});
it('test country edit with error', () => {
const storeData = JSON.parse(JSON.stringify(storeMocks.savingEditedBio));
storeData.profilePage.errors.country = { userMessage: 'country error' };
storeData.profilePage.currentlyEditingField = 'country';
const contextValue = {
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: getConfig(),
};
const component = (
<ProfilePageWrapper
contextValue={contextValue}
store={mockStore(storeData)}
/>
);
const { container: tree } = render(component);
expect(tree).toMatchSnapshot();
});
it('test education edit with error', () => {
const storeData = JSON.parse(JSON.stringify(storeMocks.savingEditedBio));
storeData.profilePage.errors.levelOfEducation = { userMessage: 'education error' };
storeData.profilePage.currentlyEditingField = 'levelOfEducation';
const contextValue = {
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: getConfig(),
};
const component = (
<ProfilePageWrapper
contextValue={contextValue}
store={mockStore(storeData)}
/>
);
const { container: tree } = render(component);
expect(tree).toMatchSnapshot();
});
it('test preferreded language edit with error', () => {
const storeData = JSON.parse(JSON.stringify(storeMocks.savingEditedBio));
storeData.profilePage.errors.languageProficiencies = { userMessage: 'preferred language error' };
storeData.profilePage.currentlyEditingField = 'languageProficiencies';
const contextValue = {
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: getConfig(),
};
const component = (
<ProfilePageWrapper
contextValue={contextValue}
store={mockStore(storeData)}
/>
);
const { container: tree } = render(component);
expect(tree).toMatchSnapshot();
});
@@ -150,46 +237,69 @@ describe('<ProfilePage />', () => {
const config = getConfig();
config.CREDENTIALS_BASE_URL = '';
const contextValue = {
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: getConfig(),
};
const component = (
<AppContext.Provider
value={{
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config,
}}
>
<IntlProvider locale="en">
<Provider store={mockStore(storeMocks.viewOwnProfile)}>
<ProfilePage {...requiredProfilePageProps} />
</Provider>
</IntlProvider>
</AppContext.Provider>
<ProfilePageWrapper
contextValue={contextValue}
store={mockStore(storeMocks.viewOwnProfile)}
/>
);
const tree = renderer.create(component).toJSON();
const { container: tree } = render(component);
expect(tree).toMatchSnapshot();
});
it('test age message alert', () => {
const storeData = JSON.parse(JSON.stringify(storeMocks.viewOwnProfile));
storeData.userAccount.requiresParentalConsent = true;
storeData.profilePage.account.requiresParentalConsent = true;
const contextValue = {
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: { ...getConfig(), COLLECT_YEAR_OF_BIRTH: true },
};
const { container } = render(
<ProfilePageWrapper
contextValue={contextValue}
store={mockStore(storeData)}
requiresParentalConsent
/>,
);
expect(container.querySelector('.alert-info')).toHaveClass('show');
});
it('test photo error alert', () => {
const storeData = JSON.parse(JSON.stringify(storeMocks.viewOwnProfile));
storeData.profilePage.errors.photo = { userMessage: 'error' };
const contextValue = {
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: { ...getConfig(), COLLECT_YEAR_OF_BIRTH: true },
};
const { container } = render(
<ProfilePageWrapper
contextValue={contextValue}
store={mockStore(storeData)}
requiresParentalConsent
/>,
);
expect(container.querySelector('.alert-danger')).toHaveClass('show');
});
});
describe('handles analytics', () => {
it('calls sendTrackingLogEvent when mounting', () => {
const component = (
<AppContext.Provider
value={{
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: getConfig(),
}}
>
<IntlProvider locale="en">
<Provider store={mockStore(storeMocks.loadingApp)}>
<ProfilePage
{...requiredProfilePageProps}
match={{ params: { username: 'test-username' } }}
/>
</Provider>
</IntlProvider>
</AppContext.Provider>
const contextValue = {
authenticatedUser: { userId: 123, username: 'staff', administrator: true },
config: getConfig(),
};
render(
<ProfilePageWrapper
contextValue={contextValue}
store={mockStore(storeMocks.loadingApp)}
params={{ username: 'test-username' }}
/>,
);
const wrapper = mount(component);
wrapper.update();
expect(analytics.sendTrackingLogEvent.mock.calls.length).toBe(1);
expect(analytics.sendTrackingLogEvent.mock.calls[0][0]).toEqual('edx.profile.viewed');

View File

@@ -0,0 +1,23 @@
import React from 'react';
import { FormattedMessage } from '@edx/frontend-platform/i18n';
import { VisibilityOff } from '@openedx/paragon/icons';
import { Icon } from '@openedx/paragon';
import { getConfig } from '@edx/frontend-platform';
const UsernameDescription = () => (
<div className="d-flex align-items-center mt-3 mb-2rem">
<Icon src={VisibilityOff} className="icon-visibility-off" />
<div className="username-description">
<FormattedMessage
id="profile.username.description"
defaultMessage="Your profile information is only visible to you. Only your username is visible to others on {siteName}."
description="A description of the username field"
values={{
siteName: getConfig().SITE_NAME,
}}
/>
</div>
</div>
);
export default UsernameDescription;

View File

@@ -12,7 +12,8 @@ module.exports = {
imageUrlMedium: null,
imageUrlLarge: null
},
levelOfEducation: null
levelOfEducation: null,
learningGoal: null
},
profilePage: {
errors: {},

View File

@@ -42,7 +42,8 @@ module.exports = {
secondaryEmail: null,
timeZone: null,
gender: null,
accountPrivacy: 'custom'
accountPrivacy: 'custom',
learningGoal: null,
},
profilePage: {
errors: {},
@@ -91,7 +92,8 @@ module.exports = {
timeZone: null,
levelOfEducation: 'el',
gender: null,
accountPrivacy: 'custom'
accountPrivacy: 'custom',
learningGoal: null,
},
preferences: {
visibilityUserLocation: 'all_users',
@@ -104,7 +106,8 @@ module.exports = {
visibilityName: 'private',
visibilityLanguageProficiencies: 'all_users',
visibilityCountry: 'all_users',
accountPrivacy: 'custom'
accountPrivacy: 'custom',
visibilityLearningGoal: 'private',
},
courseCertificates: [
{

View File

@@ -42,7 +42,8 @@ module.exports = {
secondaryEmail: null,
timeZone: null,
gender: null,
accountPrivacy: 'custom'
accountPrivacy: 'custom',
learningGoal: 'advance_career',
},
profilePage: {
errors: {},
@@ -83,7 +84,8 @@ module.exports = {
preferences: {},
courseCertificates: [],
drafts: {},
isLoadingProfile: false
isLoadingProfile: false,
learningGoal: 'advance_career',
},
router: {
location: {

View File

@@ -42,7 +42,8 @@ module.exports = {
secondaryEmail: null,
timeZone: null,
gender: null,
accountPrivacy: 'custom'
accountPrivacy: 'custom',
learningGoal: 'advance_career'
},
profilePage: {
errors: {},
@@ -91,7 +92,8 @@ module.exports = {
timeZone: null,
levelOfEducation: 'el',
gender: null,
accountPrivacy: 'custom'
accountPrivacy: 'custom',
learningGoal: 'advance_career'
},
preferences: {
visibilityUserLocation: 'all_users',
@@ -104,7 +106,8 @@ module.exports = {
visibilityName: 'private',
visibilityLanguageProficiencies: 'all_users',
visibilityCountry: 'all_users',
accountPrivacy: 'custom'
accountPrivacy: 'custom',
visibilityLearningGoal: 'private',
},
courseCertificates: [
{

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ const EDUCATION_LEVELS = [
'jhs',
'el',
'none',
'o',
'other',
];
const SOCIAL = {

View File

@@ -0,0 +1,7 @@
const mockData = {
learningGoal: 'advance_career',
editMode: 'static',
visibilityLearningGoal: 'private',
};
export default mockData;

View File

@@ -0,0 +1,80 @@
// This test file simply creates a contract that defines
// expectations and correct responses from the Pact stub server.
import path from 'path';
import { PactV3, MatchersV3 } from '@pact-foundation/pact';
import { initializeMockApp, getConfig, setConfig } from '@edx/frontend-platform';
import { getAccount } from './services';
const expectedUserInfo200 = {
username: 'staff',
email: 'staff@example.com',
bio: 'This is my bio',
name: 'Lemon Seltzer',
country: 'ME',
dateJoined: '2017-06-07T00:44:23Z',
isActive: true,
yearOfBirth: 1901,
};
const provider = new PactV3({
log: path.resolve(process.cwd(), 'src/pact-logs/pact.log'),
dir: path.resolve(process.cwd(), 'src/pacts'),
consumer: 'frontend-app-profile',
provider: 'edx-platform',
});
describe('getAccount for one username', () => {
beforeAll(async () => {
initializeMockApp();
});
it('returns a HTTP 200 and user information', async () => {
const username200 = 'staff';
await provider.addInteraction({
states: [{ description: "I have a user's basic information" }],
uponReceiving: "A request for user's basic information",
withRequest: {
method: 'GET',
path: `/api/user/v1/accounts/${username200}`,
headers: {},
},
willRespondWith: {
status: 200,
headers: {},
body: MatchersV3.like(expectedUserInfo200),
},
});
return provider.executeTest(async (mockserver) => {
setConfig({
...getConfig(),
LMS_BASE_URL: mockserver.url,
});
const response = await getAccount(username200);
expect(response).toEqual(expectedUserInfo200);
});
});
it('Account does not exist', async () => {
const username404 = 'staff_not_found';
await provider.addInteraction({
states: [{ description: "Account and user's information does not exist" }],
uponReceiving: "A request for user's basic information",
withRequest: {
method: 'GET',
path: `/api/user/v1/accounts/${username404}`,
},
willRespondWith: {
status: 404,
},
});
await provider.executeTest(async (mockserver) => {
setConfig({
...getConfig(),
LMS_BASE_URL: mockserver.url,
});
await expect(getAccount(username404).then((response) => response.data)).rejects.toThrow('Request failed with status code 404');
});
});
});

View File

@@ -24,7 +24,7 @@ export const initialState = {
isAuthenticatedUserProfile: false,
};
const profilePage = (state = initialState, action) => {
const profilePage = (state = initialState, action = {}) => {
switch (action.type) {
case FETCH_PROFILE.BEGIN:
return {

View File

@@ -66,6 +66,25 @@ export function* handleFetchProfile(action) {
} else {
[account, courseCertificates] = result;
}
// Set initial visibility values for account
// Set account_privacy as custom is necessary so that when viewing another user's profile,
// their full name is displayed and change visibility forms are worked correctly
if (isAuthenticatedUserProfile && result[0].accountPrivacy === 'all_users') {
yield call(ProfileApiService.patchPreferences, action.payload.username, {
account_privacy: 'custom',
'visibility.name': 'all_users',
'visibility.bio': 'all_users',
'visibility.course_certificates': 'all_users',
'visibility.country': 'all_users',
'visibility.date_joined': 'all_users',
'visibility.level_of_education': 'all_users',
'visibility.language_proficiencies': 'all_users',
'visibility.social_links': 'all_users',
'visibility.time_zone': 'all_users',
});
}
yield put(fetchProfileSuccess(
account,
preferences,

View File

@@ -35,9 +35,12 @@ export const editableFormModeSelector = createSelector(
// or is being hidden from us (for other users' profiles)
let propExists = account[formId] != null && account[formId].length > 0;
propExists = formId === 'certificates' ? certificates.length > 0 : propExists; // overwrite for certificates
// If this isn't the current user's profile or if
// If this isn't the current user's profile
if (!isAuthenticatedUserProfile) {
return 'static';
}
// the current user has no age set / under 13 ...
if (!isAuthenticatedUserProfile || account.requiresParentalConsent) {
if (account.requiresParentalConsent) {
// then there are only two options: static or nothing.
// We use 'null' as a return value because the consumers of
// getMode render nothing at all on a mode of null.
@@ -228,13 +231,13 @@ export const visibilitiesSelector = createSelector(
switch (accountPrivacy) {
case 'custom':
return {
visibilityBio: preferences.visibilityBio || 'private',
visibilityCourseCertificates: preferences.visibilityCourseCertificates || 'private',
visibilityCountry: preferences.visibilityCountry || 'private',
visibilityLevelOfEducation: preferences.visibilityLevelOfEducation || 'private',
visibilityLanguageProficiencies: preferences.visibilityLanguageProficiencies || 'private',
visibilityName: preferences.visibilityName || 'private',
visibilitySocialLinks: preferences.visibilitySocialLinks || 'private',
visibilityBio: preferences.visibilityBio || 'all_users',
visibilityCourseCertificates: preferences.visibilityCourseCertificates || 'all_users',
visibilityCountry: preferences.visibilityCountry || 'all_users',
visibilityLevelOfEducation: preferences.visibilityLevelOfEducation || 'all_users',
visibilityLanguageProficiencies: preferences.visibilityLanguageProficiencies || 'all_users',
visibilityName: preferences.visibilityName || 'all_users',
visibilitySocialLinks: preferences.visibilitySocialLinks || 'all_users',
};
case 'private':
return {
@@ -335,6 +338,7 @@ export const profilePageSelector = createSelector(
profileImage,
requiresParentalConsent: account.requiresParentalConsent,
dateJoined: account.dateJoined,
yearOfBirth: account.yearOfBirth,
// Bio form data
bio: formValues.bio,

View File

@@ -2,7 +2,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { ValidationFormGroup } from '@edx/paragon';
import { Form } from '@openedx/paragon';
import messages from './Bio.messages';
@@ -56,10 +56,9 @@ class Bio extends React.Component {
editing: (
<div role="dialog" aria-labelledby={`${formId}-label`}>
<form onSubmit={this.handleSubmit}>
<ValidationFormGroup
for={formId}
invalid={error !== null}
invalidMessage={error}
<Form.Group
controlId={formId}
isInvalid={error !== null}
>
<label className="edit-section-header" htmlFor={formId}>
{intl.formatMessage(messages['profile.bio.about.me'])}
@@ -71,7 +70,12 @@ class Bio extends React.Component {
value={bio}
onChange={this.handleChange}
/>
</ValidationFormGroup>
{error !== null && (
<Form.Control.Feedback hasIcon={false}>
{error}
</Form.Control.Feedback>
)}
</Form.Group>
<FormControls
visibilityId="visibilityBio"
saveState={saveState}

View File

@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import {
FormattedDate, FormattedMessage, injectIntl, intlShape,
} from '@edx/frontend-platform/i18n';
import { Hyperlink } from '@edx/paragon';
import { Hyperlink } from '@openedx/paragon';
import { connect } from 'react-redux';
import get from 'lodash.get';
@@ -68,7 +68,7 @@ class Certificates extends React.Component {
})();
return (
<div key={`${modifiedDate}-${courseId}`} className="col col-sm-6 d-flex align-items-stretch">
<div key={`${modifiedDate}-${courseId}`} className="col-12 col-sm-6 d-flex align-items-stretch">
<div className="card mb-4 certificate flex-grow-1">
<div
className="certificate-type-illustration"

View File

@@ -2,7 +2,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { ValidationFormGroup } from '@edx/paragon';
import { Form } from '@openedx/paragon';
import messages from './Country.messages';
@@ -67,10 +67,9 @@ class Country extends React.Component {
editing: (
<div role="dialog" aria-labelledby={`${formId}-label`}>
<form onSubmit={this.handleSubmit}>
<ValidationFormGroup
for={formId}
invalid={error !== null}
invalidMessage={error}
<Form.Group
controlId={formId}
isInvalid={error !== null}
>
<label className="edit-section-header" htmlFor={formId}>
{intl.formatMessage(messages['profile.country.label'])}
@@ -89,7 +88,12 @@ class Country extends React.Component {
<option key={code} value={code}>{name}</option>
))}
</select>
</ValidationFormGroup>
{error !== null && (
<Form.Control.Feedback hasIcon={false}>
{error}
</Form.Control.Feedback>
)}
</Form.Group>
<FormControls
visibilityId="visibilityCountry"
saveState={saveState}

View File

@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import get from 'lodash.get';
import { ValidationFormGroup } from '@edx/paragon';
import { Form } from '@openedx/paragon';
import messages from './Education.messages';
@@ -63,10 +63,9 @@ class Education extends React.Component {
editing: (
<div role="dialog" aria-labelledby={`${formId}-label`}>
<form onSubmit={this.handleSubmit}>
<ValidationFormGroup
for={formId}
invalid={error !== null}
invalidMessage={error}
<Form.Group
controlId={formId}
isInvalid={error !== null}
>
<label className="edit-section-header" htmlFor={formId}>
{intl.formatMessage(messages['profile.education.education'])}
@@ -90,7 +89,12 @@ class Education extends React.Component {
</option>
))}
</select>
</ValidationFormGroup>
{error !== null && (
<Form.Control.Feedback hasIcon={false}>
{error}
</Form.Control.Feedback>
)}
</Form.Group>
<FormControls
visibilityId="visibilityLevelOfEducation"
saveState={saveState}

View File

@@ -0,0 +1,92 @@
import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import get from 'lodash.get';
// Mock Data
import mockData from '../data/mock_data';
import messages from './LearningGoal.messages';
// Components
import EditableItemHeader from './elements/EditableItemHeader';
import SwitchContent from './elements/SwitchContent';
// Selectors
import { editableFormSelector } from '../data/selectors';
const LearningGoal = (props) => {
let { learningGoal, editMode, visibilityLearningGoal } = props;
const { intl } = props;
if (!learningGoal) {
learningGoal = mockData.learningGoal;
}
if (!editMode || editMode === 'empty') { // editMode defaults to 'empty', not sure why yet
editMode = mockData.editMode;
}
if (!visibilityLearningGoal) {
visibilityLearningGoal = mockData.visibilityLearningGoal;
}
return (
<SwitchContent
className="mb-5"
expression={editMode}
cases={{
editable: (
<>
<EditableItemHeader
content={intl.formatMessage(messages['profile.learningGoal.learningGoal'])}
showVisibility={visibilityLearningGoal !== null}
visibility={visibilityLearningGoal}
/>
<p data-hj-suppress className="lead">
{intl.formatMessage(get(
messages,
`profile.learningGoal.options.${learningGoal}`,
messages['profile.learningGoal.options.something_else'],
))}
</p>
</>
),
static: (
<>
<EditableItemHeader content={intl.formatMessage(messages['profile.learningGoal.learningGoal'])} />
<p data-hj-suppress className="lead">
{intl.formatMessage(get(
messages,
`profile.learningGoal.options.${learningGoal}`,
messages['profile.learningGoal.options.something_else'],
))}
</p>
</>
),
}}
/>
);
};
LearningGoal.propTypes = {
// From Selector
learningGoal: PropTypes.oneOf(['advance_career', 'start_career', 'learn_something_new', 'something_else']),
visibilityLearningGoal: PropTypes.oneOf(['private', 'all_users']),
editMode: PropTypes.oneOf(['editable', 'static']),
// i18n
intl: intlShape.isRequired,
};
LearningGoal.defaultProps = {
editMode: 'static',
learningGoal: null,
visibilityLearningGoal: 'private',
};
export default connect(
editableFormSelector,
{},
)(injectIntl(LearningGoal));

View File

@@ -0,0 +1,31 @@
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
'profile.learningGoal.learningGoal': {
id: 'profile.learningGoal.learningGoal',
defaultMessage: 'Learning Goal',
description: 'A section of a user profile that displays their current learning goal.',
},
'profile.learningGoal.options.start_career': {
id: 'profile.learningGoal.options.start_career',
defaultMessage: 'I want to start my career',
description: 'Selected by user if their goal is to start their career.',
},
'profile.learningGoal.options.advance_career': {
id: 'profile.learningGoal.options.advance_career',
defaultMessage: 'I want to advance my career',
description: 'Selected by user if their goal is to advance their career.',
},
'profile.learningGoal.options.learn_something_new': {
id: 'profile.learningGoal.options.learn_something_new',
defaultMessage: 'I want to learn something new',
description: 'Selected by user if their goal is to learn something new.',
},
'profile.learningGoal.options.something_else': {
id: 'profile.learningGoal.options.something_else',
defaultMessage: 'Something else',
description: 'Selected by user if their goal is not described by the other choices.',
},
});
export default messages;

View File

@@ -0,0 +1,116 @@
import PropTypes from 'prop-types';
import React, { useMemo } from 'react';
import { Provider } from 'react-redux';
import { render, screen } from '@testing-library/react';
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import { configure as configureI18n, IntlProvider } from '@edx/frontend-platform/i18n';
import { getConfig } from '@edx/frontend-platform';
import { AppContext } from '@edx/frontend-platform/react';
import messages from '../../i18n';
import viewOwnProfileMockStore from '../__mocks__/viewOwnProfile.mockStore';
import savingEditedBioMockStore from '../__mocks__/savingEditedBio.mockStore';
import LearningGoal from './LearningGoal';
const mockStore = configureMockStore([thunk]);
// props to be passed down to LearningGoal component
const requiredLearningGoalProps = {
formId: 'learningGoal',
learningGoal: 'advance_career',
drafts: {},
visibilityLearningGoal: 'private',
editMode: 'static',
saveState: null,
error: null,
openHandler: jest.fn(),
};
configureI18n({
loggingService: { logError: jest.fn() },
config: {
ENVIRONMENT: 'production',
LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum',
},
messages,
});
const LearningGoalWrapper = (props) => {
const contextValue = useMemo(() => ({
authenticatedUser: { userId: null, username: null, administrator: false },
config: getConfig(),
}), []);
return (
<AppContext.Provider
value={contextValue}
>
<IntlProvider locale="en">
<Provider store={props.store}>
<LearningGoal {...props} />
</Provider>
</IntlProvider>
</AppContext.Provider>
);
};
LearningGoalWrapper.defaultProps = {
store: mockStore(viewOwnProfileMockStore),
};
LearningGoalWrapper.propTypes = {
store: PropTypes.shape({}),
};
const LearningGoalWrapperWithStore = ({ store }) => {
const contextValue = useMemo(() => ({
authenticatedUser: { userId: null, username: null, administrator: false },
config: getConfig(),
}), []);
return (
<AppContext.Provider
value={contextValue}
>
<IntlProvider locale="en">
<Provider store={mockStore(store)}>
<LearningGoal {...requiredLearningGoalProps} formId="learningGoal" />
</Provider>
</IntlProvider>
</AppContext.Provider>
);
};
LearningGoalWrapperWithStore.defaultProps = {
store: mockStore(savingEditedBioMockStore),
};
LearningGoalWrapperWithStore.propTypes = {
store: PropTypes.shape({}),
};
describe('<LearningGoal />', () => {
describe('renders the current learning goal', () => {
it('renders "I want to advance my career"', () => {
render(
<LearningGoalWrapper
{...requiredLearningGoalProps}
formId="learningGoal"
/>,
);
expect(screen.getByText('I want to advance my career')).toBeTruthy();
});
it('renders "Something else"', () => {
requiredLearningGoalProps.learningGoal = 'something_else';
render(
<LearningGoalWrapper
{...requiredLearningGoalProps}
formId="learningGoal"
/>,
);
expect(screen.getByText('Something else')).toBeTruthy();
});
});
});

View File

@@ -2,7 +2,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { ValidationFormGroup } from '@edx/paragon';
import { Form } from '@openedx/paragon';
import messages from './PreferredLanguage.messages';
@@ -77,10 +77,9 @@ class PreferredLanguage extends React.Component {
editing: (
<div role="dialog" aria-labelledby={`${formId}-label`}>
<form onSubmit={this.handleSubmit}>
<ValidationFormGroup
for={formId}
invalid={error !== null}
invalidMessage={error}
<Form.Group
controlId={formId}
isInvalid={error !== null}
>
<label className="edit-section-header" htmlFor={formId}>
{intl.formatMessage(messages['profile.preferredlanguage.label'])}
@@ -98,7 +97,12 @@ class PreferredLanguage extends React.Component {
<option key={code} value={code}>{name}</option>
))}
</select>
</ValidationFormGroup>
{error !== null && (
<Form.Control.Feedback hasIcon={false}>
{error}
</Form.Control.Feedback>
)}
</Form.Group>
<FormControls
visibilityId="visibilityLanguageProficiencies"
saveState={saveState}

View File

@@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Button, Dropdown } from '@edx/paragon';
import { Button, Dropdown } from '@openedx/paragon';
import { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { ReactComponent as DefaultAvatar } from '../assets/avatar.svg';

View File

@@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import { StatusAlert } from '@edx/paragon';
import { Alert } from '@openedx/paragon';
import { connect } from 'react-redux';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faTwitter, faFacebook, faLinkedin } from '@fortawesome/free-brands-svg-icons';
@@ -33,6 +33,108 @@ const platformDisplayInfo = {
},
};
const SocialLink = ({ url, name, platform }) => (
<a href={url} className="font-weight-bold">
<FontAwesomeIcon className="mr-2" icon={platformDisplayInfo[platform].icon} />
{name}
</a>
);
SocialLink.propTypes = {
url: PropTypes.string.isRequired,
platform: PropTypes.string.isRequired,
name: PropTypes.string.isRequired,
};
const EditableListItem = ({
url, platform, onClickEmptyContent, name,
}) => {
const linkDisplay = url ? (
<SocialLink name={name} url={url} platform={platform} />
) : (
<EmptyContent onClick={onClickEmptyContent}>Add {name}</EmptyContent>
);
return <li className="form-group">{linkDisplay}</li>;
};
EditableListItem.propTypes = {
url: PropTypes.string,
platform: PropTypes.string.isRequired,
name: PropTypes.string.isRequired,
onClickEmptyContent: PropTypes.func,
};
EditableListItem.defaultProps = {
url: null,
onClickEmptyContent: null,
};
const EditingListItem = ({
platform, name, value, onChange, error,
}) => (
<li className="form-group">
<label htmlFor={`social-${platform}`}>{name}</label>
<input
className={classNames('form-control', { 'is-invalid': Boolean(error) })}
type="text"
id={`social-${platform}`}
name={platform}
value={value || ''}
onChange={onChange}
aria-describedby="social-error-feedback"
/>
</li>
);
EditingListItem.propTypes = {
platform: PropTypes.string.isRequired,
value: PropTypes.string,
name: PropTypes.string.isRequired,
onChange: PropTypes.func.isRequired,
error: PropTypes.string,
};
EditingListItem.defaultProps = {
value: null,
error: null,
};
const EmptyListItem = ({ onClick, name }) => (
<li className="mb-4">
<EmptyContent onClick={onClick}>
<FormattedMessage
id="profile.sociallinks.add"
defaultMessage="Add {network}"
values={{
network: name,
}}
description="{network} is the name of a social network such as Facebook or Twitter"
/>
</EmptyContent>
</li>
);
EmptyListItem.propTypes = {
name: PropTypes.string.isRequired,
onClick: PropTypes.func.isRequired,
};
const StaticListItem = ({ name, url, platform }) => (
<li className="mb-2">
<SocialLink name={name} url={url} platform={platform} />
</li>
);
StaticListItem.propTypes = {
name: PropTypes.string.isRequired,
url: PropTypes.string,
platform: PropTypes.string.isRequired,
};
StaticListItem.defaultProps = {
url: null,
};
class SocialLinks extends React.Component {
constructor(props) {
super(props);
@@ -65,19 +167,6 @@ class SocialLinks extends React.Component {
}
}
mergeWithDrafts(newSocialLink) {
const knownPlatforms = ['twitter', 'facebook', 'linkedin'];
const updated = [];
knownPlatforms.forEach((platform) => {
if (newSocialLink.platform === platform) {
updated.push(newSocialLink);
} else if (this.props.draftSocialLinksByPlatform[platform] !== undefined) {
updated.push(this.props.draftSocialLinksByPlatform[platform]);
}
});
return updated;
}
handleSubmit(e) {
e.preventDefault();
this.props.submitHandler(this.props.formId);
@@ -91,6 +180,19 @@ class SocialLinks extends React.Component {
this.props.openHandler(this.props.formId);
}
mergeWithDrafts(newSocialLink) {
const knownPlatforms = ['twitter', 'facebook', 'linkedin'];
const updated = [];
knownPlatforms.forEach((platform) => {
if (newSocialLink.platform === platform) {
updated.push(newSocialLink);
} else if (this.props.draftSocialLinksByPlatform[platform] !== undefined) {
updated.push(this.props.draftSocialLinksByPlatform[platform]);
}
});
return updated;
}
render() {
const {
socialLinks, visibilitySocialLinks, editMode, saveState, error, intl,
@@ -158,14 +260,19 @@ class SocialLinks extends React.Component {
),
editing: (
<div role="dialog" aria-labelledby="social-links-label">
<form onSubmit={this.handleSubmit}>
<form aria-labelledby="editing-form" onSubmit={this.handleSubmit}>
<EditableItemHeader
headingId="social-links-label"
content={intl.formatMessage(messages['profile.sociallinks.social.links'])}
/>
{/* TODO: Replace this alert with per-field errors. Needs API update. */}
<div id="social-error-feedback">
{error !== null ? <StatusAlert alertType="danger" dialog={error} dismissible={false} open /> : null}
{error !== null
? (
<Alert variant="danger" dismissible={false} show>
{error}
</Alert>
) : null}
</div>
<ul className="list-unstyled">
{socialLinks.map(({ platform, socialLink }) => (
@@ -238,113 +345,3 @@ export default connect(
editableFormSelector,
{},
)(injectIntl(SocialLinks));
function SocialLink({ url, name, platform }) {
return (
<a href={url} className="font-weight-bold">
<FontAwesomeIcon className="mr-2" icon={platformDisplayInfo[platform].icon} />
{name}
</a>
);
}
SocialLink.propTypes = {
url: PropTypes.string.isRequired,
platform: PropTypes.string.isRequired,
name: PropTypes.string.isRequired,
};
function EditableListItem({
url, platform, onClickEmptyContent, name,
}) {
const linkDisplay = url ? (
<SocialLink name={name} url={url} platform={platform} />
) : (
<EmptyContent onClick={onClickEmptyContent}>Add {name}</EmptyContent>
);
return <li className="form-group">{linkDisplay}</li>;
}
EditableListItem.propTypes = {
url: PropTypes.string,
platform: PropTypes.string.isRequired,
name: PropTypes.string.isRequired,
onClickEmptyContent: PropTypes.func,
};
EditableListItem.defaultProps = {
url: null,
onClickEmptyContent: null,
};
function EditingListItem({
platform, name, value, onChange, error,
}) {
return (
<li className="form-group">
<label htmlFor={`social-${platform}`}>{name}</label>
<input
className={classNames('form-control', { 'is-invalid': Boolean(error) })}
type="text"
id={`social-${platform}`}
name={platform}
value={value || ''}
onChange={onChange}
aria-describedby="social-error-feedback"
/>
</li>
);
}
EditingListItem.propTypes = {
platform: PropTypes.string.isRequired,
value: PropTypes.string,
name: PropTypes.string.isRequired,
onChange: PropTypes.func.isRequired,
error: PropTypes.string,
};
EditingListItem.defaultProps = {
value: null,
error: null,
};
function EmptyListItem({ onClick, name }) {
return (
<li className="mb-4">
<EmptyContent onClick={onClick}>
<FormattedMessage
id="profile.sociallinks.add"
defaultMessage="Add {network}"
values={{
network: name,
}}
description="{network} is the name of a social network such as Facebook or Twitter"
/>
</EmptyContent>
</li>
);
}
EmptyListItem.propTypes = {
name: PropTypes.string.isRequired,
onClick: PropTypes.func.isRequired,
};
function StaticListItem({ name, url, platform }) {
return (
<li className="mb-2">
<SocialLink name={name} url={url} platform={platform} />
</li>
);
}
StaticListItem.propTypes = {
name: PropTypes.string.isRequired,
url: PropTypes.string,
platform: PropTypes.string.isRequired,
};
StaticListItem.defaultProps = {
url: null,
};

View File

@@ -0,0 +1,165 @@
import { render, fireEvent, screen } from '@testing-library/react';
import PropTypes from 'prop-types';
import React, { useMemo } from 'react';
import { Provider } from 'react-redux';
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import { configure as configureI18n, IntlProvider } from '@edx/frontend-platform/i18n';
import { getConfig } from '@edx/frontend-platform';
import { AppContext } from '@edx/frontend-platform/react';
import SocialLinks from './SocialLinks';
import * as savingEditedBio from '../__mocks__/savingEditedBio.mockStore';
import messages from '../../i18n';
const mockStore = configureMockStore([thunk]);
const defaultProps = {
formId: 'socialLinks',
socialLinks: [
{
platform: 'facebook',
socialLink: 'https://www.facebook.com/aloha',
},
{
platform: 'twitter',
socialLink: 'https://www.twitter.com/ALOHA',
},
],
drafts: {},
visibilitySocialLinks: 'private',
editMode: 'static',
saveState: null,
error: null,
changeHandler: jest.fn(),
submitHandler: jest.fn(),
closeHandler: jest.fn(),
openHandler: jest.fn(),
};
configureI18n({
loggingService: { logError: jest.fn() },
config: {
ENVIRONMENT: 'production',
LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum',
},
messages,
});
const SocialLinksWrapper = (props) => {
const contextValue = useMemo(() => ({
authenticatedUser: { userId: null, username: null, administrator: false },
config: getConfig(),
}), []);
return (
<AppContext.Provider
value={contextValue}
>
<IntlProvider locale="en">
<Provider store={props.store}>
<SocialLinks {...props} />
</Provider>
</IntlProvider>
</AppContext.Provider>
);
};
SocialLinksWrapper.defaultProps = {
store: mockStore(savingEditedBio),
};
SocialLinksWrapper.propTypes = {
store: PropTypes.shape({}),
};
const SocialLinksWrapperWithStore = ({ store }) => {
const contextValue = useMemo(() => ({
authenticatedUser: { userId: null, username: null, administrator: false },
config: getConfig(),
}), []);
return (
<AppContext.Provider
value={contextValue}
>
<IntlProvider locale="en">
<Provider store={mockStore(store)}>
<SocialLinks {...defaultProps} formId="bio" />
</Provider>
</IntlProvider>
</AppContext.Provider>
);
};
SocialLinksWrapperWithStore.defaultProps = {
store: mockStore(savingEditedBio),
};
SocialLinksWrapperWithStore.propTypes = {
store: PropTypes.shape({}),
};
describe('<SocialLinks />', () => {
['certificates', 'bio', 'goals', 'socialLinks'].forEach(editMode => (
it(`calls social links with edit mode ${editMode}`, () => {
const component = <SocialLinksWrapper {...defaultProps} formId={editMode} />;
const { container: tree } = render(component);
expect(tree).toMatchSnapshot();
})
));
it('calls social links with editing', () => {
const changeHandler = jest.fn();
const submitHandler = jest.fn();
const closeHandler = jest.fn();
const { container } = render(
<SocialLinksWrapper
{...defaultProps}
formId="bio"
changeHandler={changeHandler}
submitHandler={submitHandler}
closeHandler={closeHandler}
/>,
);
const { platform } = defaultProps.socialLinks[0];
const inputField = container.querySelector(`#social-${platform}`);
fireEvent.change(inputField, { target: { value: 'test', name: platform } });
expect(changeHandler).toHaveBeenCalledTimes(1);
const selectElement = container.querySelector('#visibilitySocialLinks');
expect(selectElement.value).toBe('private');
fireEvent.change(selectElement, { target: { value: 'all_users', name: 'visibilitySocialLinks' } });
expect(changeHandler).toHaveBeenCalledTimes(2);
fireEvent.submit(container.querySelector('[aria-labelledby="editing-form"]'));
expect(submitHandler).toHaveBeenCalledTimes(1);
fireEvent.click(screen.getByRole('button', { name: 'Cancel' }));
expect(closeHandler).toHaveBeenCalledTimes(1);
});
it('calls social links with static', () => {
const openHandler = jest.fn();
render(
<SocialLinksWrapper
{...defaultProps}
formId="goals"
openHandler={openHandler}
/>,
);
const addFacebookButton = screen.getByRole('button', { name: 'Add Facebook' });
fireEvent.click(addFacebookButton);
expect(openHandler).toHaveBeenCalledTimes(1);
});
it('calls social links with error', () => {
const newStore = JSON.parse(JSON.stringify(savingEditedBio));
newStore.profilePage.errors.bio = { userMessage: 'error' };
const { container } = render(<SocialLinksWrapperWithStore store={newStore} />);
const alertDanger = container.querySelector('.alert-danger');
expect(alertDanger).toBeInTheDocument();
});
});

View File

@@ -0,0 +1,504 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`<SocialLinks /> calls social links with edit mode bio 1`] = `
<div>
<div
class="pgn-transition-replace-group position-relative mb-5"
>
<div
style="padding: .1px 0px;"
>
<div
aria-labelledby="social-links-label"
role="dialog"
>
<form
aria-labelledby="editing-form"
>
<div
class="editable-item-header mb-2"
>
<h2
class="edit-section-header"
id="social-links-label"
>
Social Links
</h2>
</div>
<div
id="social-error-feedback"
/>
<ul
class="list-unstyled"
>
<li
class="form-group"
>
<label
for="social-facebook"
>
Facebook
</label>
<input
aria-describedby="social-error-feedback"
class="form-control"
id="social-facebook"
name="facebook"
type="text"
value="https://www.facebook.com/aloha"
/>
</li>
<li
class="form-group"
>
<label
for="social-twitter"
>
Twitter
</label>
<input
aria-describedby="social-error-feedback"
class="form-control"
id="social-twitter"
name="twitter"
type="text"
value="https://www.twitter.com/ALOHA"
/>
</li>
</ul>
<div
class="d-flex flex-row-reverse flex-wrap justify-content-end align-items-center"
>
<div
class="form-group d-flex flex-wrap"
>
<label
class="col-form-label"
for="visibilitySocialLinks"
>
Who can see this:
</label>
<span
class="d-flex align-items-center"
>
<span
class="d-inline-block ml-1 mr-2"
style="width: 1.5rem;"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-eye-slash "
data-icon="eye-slash"
data-prefix="far"
focusable="false"
role="img"
viewBox="0 0 640 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zm151 118.3C226 97.7 269.5 80 320 80c65.2 0 118.8 29.6 159.9 67.7C518.4 183.5 545 226 558.6 256c-12.6 28-36.6 66.8-70.9 100.9l-53.8-42.2c9.1-17.6 14.2-37.5 14.2-58.7c0-70.7-57.3-128-128-128c-32.2 0-61.7 11.9-84.2 31.5l-46.1-36.1zM394.9 284.2l-81.5-63.9c4.2-8.5 6.6-18.2 6.6-28.3c0-5.5-.7-10.9-2-16c.7 0 1.3 0 2 0c44.2 0 80 35.8 80 80c0 9.9-1.8 19.4-5.1 28.2zm9.4 130.3C378.8 425.4 350.7 432 320 432c-65.2 0-118.8-29.6-159.9-67.7C121.6 328.5 95 286 81.4 256c8.3-18.4 21.5-41.5 39.4-64.8L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5l-41.9-33zM192 256c0 70.7 57.3 128 128 128c13.3 0 26.1-2 38.2-5.8L302 334c-23.5-5.4-43.1-21.2-53.7-42.3l-56.1-44.2c-.2 2.8-.3 5.6-.3 8.5z"
fill="currentColor"
/>
</svg>
</span>
<select
class="d-inline-block form-control"
id="visibilitySocialLinks"
name="visibilitySocialLinks"
type="select"
>
<option
value="private"
>
Just me
</option>
<option
value="all_users"
>
Everyone on localhost
</option>
</select>
</span>
</div>
<div
class="form-group flex-shrink-0 flex-grow-1"
>
<button
aria-disabled="false"
aria-live="assertive"
class="pgn__stateful-btn pgn__stateful-btn-state-pending btn btn-primary"
type="submit"
>
<span
class="d-flex align-items-center justify-content-center"
>
<span
class="pgn__stateful-btn-icon"
>
<span
class="pgn__icon icon-spin"
>
<svg
aria-hidden="true"
fill="none"
focusable="false"
height="24"
role="img"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M22 12A10 10 0 1 1 6.122 3.91l1.176 1.618A8 8 0 1 0 20 12h2Z"
fill="currentColor"
/>
</svg>
</span>
</span>
<span>
Saving
</span>
</span>
</button>
<button
class="btn btn-link"
type="button"
>
Cancel
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
`;
exports[`<SocialLinks /> calls social links with edit mode certificates 1`] = `
<div>
<div
class="pgn-transition-replace-group position-relative mb-5"
>
<div
style="padding: .1px 0px;"
>
<div
class="editable-item-header mb-2"
>
<h2
class="edit-section-header"
>
Social Links
<button
class="float-right px-0 btn btn-link btn-sm"
style="margin-top: -.35rem;"
type="button"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-pencil mr-1"
data-icon="pencil"
data-prefix="fas"
focusable="false"
role="img"
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M410.3 231l11.3-11.3-33.9-33.9-62.1-62.1L291.7 89.8l-11.3 11.3-22.6 22.6L58.6 322.9c-10.4 10.4-18 23.3-22.2 37.4L1 480.7c-2.5 8.4-.2 17.5 6.1 23.7s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L387.7 253.7 410.3 231zM160 399.4l-9.1 22.7c-4 3.1-8.5 5.4-13.3 6.9L59.4 452l23-78.1c1.4-4.9 3.8-9.4 6.9-13.3l22.7-9.1 0 32c0 8.8 7.2 16 16 16l32 0zM362.7 18.7L348.3 33.2 325.7 55.8 314.3 67.1l33.9 33.9 62.1 62.1 33.9 33.9 11.3-11.3 22.6-22.6 14.5-14.5c25-25 25-65.5 0-90.5L453.3 18.7c-25-25-65.5-25-90.5 0zm-47.4 168l-144 144c-6.2 6.2-16.4 6.2-22.6 0s-6.2-16.4 0-22.6l144-144c6.2-6.2 16.4-6.2 22.6 0s6.2 16.4 0 22.6z"
fill="currentColor"
/>
</svg>
Edit
</button>
</h2>
<p
class="mb-0"
>
<span
class="ml-auto small text-muted"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-eye-slash "
data-icon="eye-slash"
data-prefix="far"
focusable="false"
role="img"
viewBox="0 0 640 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zm151 118.3C226 97.7 269.5 80 320 80c65.2 0 118.8 29.6 159.9 67.7C518.4 183.5 545 226 558.6 256c-12.6 28-36.6 66.8-70.9 100.9l-53.8-42.2c9.1-17.6 14.2-37.5 14.2-58.7c0-70.7-57.3-128-128-128c-32.2 0-61.7 11.9-84.2 31.5l-46.1-36.1zM394.9 284.2l-81.5-63.9c4.2-8.5 6.6-18.2 6.6-28.3c0-5.5-.7-10.9-2-16c.7 0 1.3 0 2 0c44.2 0 80 35.8 80 80c0 9.9-1.8 19.4-5.1 28.2zm9.4 130.3C378.8 425.4 350.7 432 320 432c-65.2 0-118.8-29.6-159.9-67.7C121.6 328.5 95 286 81.4 256c8.3-18.4 21.5-41.5 39.4-64.8L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5l-41.9-33zM192 256c0 70.7 57.3 128 128 128c13.3 0 26.1-2 38.2-5.8L302 334c-23.5-5.4-43.1-21.2-53.7-42.3l-56.1-44.2c-.2 2.8-.3 5.6-.3 8.5z"
fill="currentColor"
/>
</svg>
Just me
</span>
</p>
</div>
<ul
class="list-unstyled"
>
<li
class="form-group"
>
<a
class="font-weight-bold"
href="https://www.facebook.com/aloha"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-facebook mr-2"
data-icon="facebook"
data-prefix="fab"
focusable="false"
role="img"
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M512 256C512 114.6 397.4 0 256 0S0 114.6 0 256C0 376 82.7 476.8 194.2 504.5V334.2H141.4V256h52.8V222.3c0-87.1 39.4-127.5 125-127.5c16.2 0 44.2 3.2 55.7 6.4V172c-6-.6-16.5-1-29.6-1c-42 0-58.2 15.9-58.2 57.2V256h83.6l-14.4 78.2H287V510.1C413.8 494.8 512 386.9 512 256h0z"
fill="currentColor"
/>
</svg>
Facebook
</a>
</li>
<li
class="form-group"
>
<a
class="font-weight-bold"
href="https://www.twitter.com/ALOHA"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-twitter mr-2"
data-icon="twitter"
data-prefix="fab"
focusable="false"
role="img"
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"
fill="currentColor"
/>
</svg>
Twitter
</a>
</li>
</ul>
</div>
</div>
</div>
`;
exports[`<SocialLinks /> calls social links with edit mode goals 1`] = `
<div>
<div
class="pgn-transition-replace-group position-relative mb-5"
>
<div
style="padding: .1px 0px;"
>
<div
class="editable-item-header mb-2"
>
<h2
class="edit-section-header"
>
Social Links
</h2>
</div>
<ul
class="list-unstyled"
>
<li
class="mb-4"
>
<div>
<button
class="pl-0 text-left btn btn-link"
tabindex="0"
type="button"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-plus fa-xs mr-2"
data-icon="plus"
data-prefix="fas"
focusable="false"
role="img"
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M256 80c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 144L48 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l144 0 0 144c0 17.7 14.3 32 32 32s32-14.3 32-32l0-144 144 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-144 0 0-144z"
fill="currentColor"
/>
</svg>
Add Facebook
</button>
</div>
</li>
<li
class="mb-4"
>
<div>
<button
class="pl-0 text-left btn btn-link"
tabindex="0"
type="button"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-plus fa-xs mr-2"
data-icon="plus"
data-prefix="fas"
focusable="false"
role="img"
viewBox="0 0 448 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M256 80c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 144L48 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l144 0 0 144c0 17.7 14.3 32 32 32s32-14.3 32-32l0-144 144 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-144 0 0-144z"
fill="currentColor"
/>
</svg>
Add Twitter
</button>
</div>
</li>
</ul>
</div>
</div>
</div>
`;
exports[`<SocialLinks /> calls social links with edit mode socialLinks 1`] = `
<div>
<div
class="pgn-transition-replace-group position-relative mb-5"
>
<div
style="padding: .1px 0px;"
>
<div
class="editable-item-header mb-2"
>
<h2
class="edit-section-header"
>
Social Links
<button
class="float-right px-0 btn btn-link btn-sm"
style="margin-top: -.35rem;"
type="button"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-pencil mr-1"
data-icon="pencil"
data-prefix="fas"
focusable="false"
role="img"
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M410.3 231l11.3-11.3-33.9-33.9-62.1-62.1L291.7 89.8l-11.3 11.3-22.6 22.6L58.6 322.9c-10.4 10.4-18 23.3-22.2 37.4L1 480.7c-2.5 8.4-.2 17.5 6.1 23.7s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L387.7 253.7 410.3 231zM160 399.4l-9.1 22.7c-4 3.1-8.5 5.4-13.3 6.9L59.4 452l23-78.1c1.4-4.9 3.8-9.4 6.9-13.3l22.7-9.1 0 32c0 8.8 7.2 16 16 16l32 0zM362.7 18.7L348.3 33.2 325.7 55.8 314.3 67.1l33.9 33.9 62.1 62.1 33.9 33.9 11.3-11.3 22.6-22.6 14.5-14.5c25-25 25-65.5 0-90.5L453.3 18.7c-25-25-65.5-25-90.5 0zm-47.4 168l-144 144c-6.2 6.2-16.4 6.2-22.6 0s-6.2-16.4 0-22.6l144-144c6.2-6.2 16.4-6.2 22.6 0s6.2 16.4 0 22.6z"
fill="currentColor"
/>
</svg>
Edit
</button>
</h2>
<p
class="mb-0"
>
<span
class="ml-auto small text-muted"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-eye-slash "
data-icon="eye-slash"
data-prefix="far"
focusable="false"
role="img"
viewBox="0 0 640 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zm151 118.3C226 97.7 269.5 80 320 80c65.2 0 118.8 29.6 159.9 67.7C518.4 183.5 545 226 558.6 256c-12.6 28-36.6 66.8-70.9 100.9l-53.8-42.2c9.1-17.6 14.2-37.5 14.2-58.7c0-70.7-57.3-128-128-128c-32.2 0-61.7 11.9-84.2 31.5l-46.1-36.1zM394.9 284.2l-81.5-63.9c4.2-8.5 6.6-18.2 6.6-28.3c0-5.5-.7-10.9-2-16c.7 0 1.3 0 2 0c44.2 0 80 35.8 80 80c0 9.9-1.8 19.4-5.1 28.2zm9.4 130.3C378.8 425.4 350.7 432 320 432c-65.2 0-118.8-29.6-159.9-67.7C121.6 328.5 95 286 81.4 256c8.3-18.4 21.5-41.5 39.4-64.8L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5l-41.9-33zM192 256c0 70.7 57.3 128 128 128c13.3 0 26.1-2 38.2-5.8L302 334c-23.5-5.4-43.1-21.2-53.7-42.3l-56.1-44.2c-.2 2.8-.3 5.6-.3 8.5z"
fill="currentColor"
/>
</svg>
Just me
</span>
</p>
</div>
<ul
class="list-unstyled"
>
<li
class="form-group"
>
<a
class="font-weight-bold"
href="https://www.facebook.com/aloha"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-facebook mr-2"
data-icon="facebook"
data-prefix="fab"
focusable="false"
role="img"
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M512 256C512 114.6 397.4 0 256 0S0 114.6 0 256C0 376 82.7 476.8 194.2 504.5V334.2H141.4V256h52.8V222.3c0-87.1 39.4-127.5 125-127.5c16.2 0 44.2 3.2 55.7 6.4V172c-6-.6-16.5-1-29.6-1c-42 0-58.2 15.9-58.2 57.2V256h83.6l-14.4 78.2H287V510.1C413.8 494.8 512 386.9 512 256h0z"
fill="currentColor"
/>
</svg>
Facebook
</a>
</li>
<li
class="form-group"
>
<a
class="font-weight-bold"
href="https://www.twitter.com/ALOHA"
>
<svg
aria-hidden="true"
class="svg-inline--fa fa-twitter mr-2"
data-icon="twitter"
data-prefix="fab"
focusable="false"
role="img"
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"
fill="currentColor"
/>
</svg>
Twitter
</a>
</li>
</ul>
</div>
</div>
</div>
`;

View File

@@ -3,26 +3,24 @@ import PropTypes from 'prop-types';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faPencilAlt } from '@fortawesome/free-solid-svg-icons';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { Button } from '@edx/paragon';
import { Button } from '@openedx/paragon';
import messages from './EditButton.messages';
function EditButton({
const EditButton = ({
onClick, className, style, intl,
}) {
return (
<Button
variant="link"
size="sm"
className={className}
onClick={onClick}
style={style}
>
<FontAwesomeIcon className="mr-1" icon={faPencilAlt} />
{intl.formatMessage(messages['profile.editbutton.edit'])}
</Button>
);
}
}) => (
<Button
variant="link"
size="sm"
className={className}
onClick={onClick}
style={style}
>
<FontAwesomeIcon className="mr-1" icon={faPencilAlt} />
{intl.formatMessage(messages['profile.editbutton.edit'])}
</Button>
);
export default injectIntl(EditButton);

View File

@@ -4,26 +4,22 @@ import PropTypes from 'prop-types';
import EditButton from './EditButton';
import { Visibility } from './Visibility';
function EditableItemHeader({
const EditableItemHeader = ({
content,
showVisibility,
visibility,
showEditButton,
onClickEdit,
headingId,
}) {
return (
<>
<div className="editable-item-header mb-2">
<h2 className="edit-section-header" id={headingId}>
{content}
{showEditButton ? <EditButton style={{ marginTop: '-.35rem' }} className="float-right px-0" onClick={onClickEdit} /> : null}
</h2>
{showVisibility ? <p className="mb-0"><Visibility to={visibility} /></p> : null}
</div>
</>
);
}
}) => (
<div className="editable-item-header mb-2">
<h2 className="edit-section-header" id={headingId}>
{content}
{showEditButton ? <EditButton style={{ marginTop: '-.35rem' }} className="float-right px-0" onClick={onClickEdit} /> : null}
</h2>
{showVisibility ? <p className="mb-0"><Visibility to={visibility} /></p> : null}
</div>
);
export default EditableItemHeader;

View File

@@ -3,24 +3,22 @@ import PropTypes from 'prop-types';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faPlus } from '@fortawesome/free-solid-svg-icons';
function EmptyContent({ children, onClick, showPlusIcon }) {
return (
<div>
{onClick ? (
<button
type="button"
className="pl-0 text-left btn btn-link"
onClick={onClick}
onKeyDown={(e) => { if (e.key === 'Enter') { onClick(); } }}
tabIndex={0}
>
{showPlusIcon ? <FontAwesomeIcon size="xs" className="mr-2" icon={faPlus} /> : null}
{children}
</button>
) : children}
</div>
);
}
const EmptyContent = ({ children, onClick, showPlusIcon }) => (
<div>
{onClick ? (
<button
type="button"
className="pl-0 text-left btn btn-link"
onClick={onClick}
onKeyDown={(e) => { if (e.key === 'Enter') { onClick(); } }}
tabIndex={0}
>
{showPlusIcon ? <FontAwesomeIcon size="xs" className="mr-2" icon={faPlus} /> : null}
{children}
</button>
) : children}
</div>
);
export default EmptyContent;

View File

@@ -1,15 +1,15 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Button, StatefulButton } from '@edx/paragon';
import { Button, StatefulButton } from '@openedx/paragon';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import messages from './FormControls.messages';
import { VisibilitySelect } from './Visibility';
function FormControls({
const FormControls = ({
cancelHandler, changeHandler, visibility, visibilityId, saveState, intl,
}) {
}) => {
// Eliminate error/failed state for save button
const buttonState = saveState === 'error' ? null : saveState;
@@ -57,7 +57,7 @@ function FormControls({
</div>
</div>
);
}
};
export default injectIntl(FormControls);

View File

@@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import { TransitionReplace } from '@edx/paragon';
import { TransitionReplace } from '@openedx/paragon';
const onChildExit = (htmlNode) => {
// If the leaving child has focus, take control and redirect it
@@ -22,7 +22,7 @@ const onChildExit = (htmlNode) => {
}
};
function SwitchContent({ expression, cases, className }) {
const SwitchContent = ({ expression, cases, className }) => {
const getContent = (caseKey) => {
if (cases[caseKey]) {
if (typeof cases[caseKey] === 'string') {
@@ -48,7 +48,7 @@ function SwitchContent({ expression, cases, className }) {
{getContent(expression)}
</TransitionReplace>
);
}
};
SwitchContent.propTypes = {
expression: PropTypes.string,

View File

@@ -1,23 +1,24 @@
import React from 'react';
import PropTypes from 'prop-types';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { getConfig } from '@edx/frontend-platform';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faEyeSlash, faEye } from '@fortawesome/free-regular-svg-icons';
import messages from './Visibility.messages';
function Visibility({ to, intl }) {
const Visibility = ({ to, intl }) => {
const icon = to === 'private' ? faEyeSlash : faEye;
const label = to === 'private'
? intl.formatMessage(messages['profile.visibility.who.just.me'])
: intl.formatMessage(messages['profile.visibility.who.everyone']);
: intl.formatMessage(messages['profile.visibility.who.everyone'], { siteName: getConfig().SITE_NAME });
return (
<span className="ml-auto small text-muted">
<FontAwesomeIcon icon={icon} /> {label}
</span>
);
}
};
Visibility.propTypes = {
to: PropTypes.oneOf(['private', 'all_users']),
@@ -29,7 +30,7 @@ Visibility.defaultProps = {
to: 'private',
};
function VisibilitySelect({ intl, className, ...props }) {
const VisibilitySelect = ({ intl, className, ...props }) => {
const { value } = props;
const icon = value === 'private' ? faEyeSlash : faEye;
@@ -38,17 +39,17 @@ function VisibilitySelect({ intl, className, ...props }) {
<span className="d-inline-block ml-1 mr-2" style={{ width: '1.5rem' }}>
<FontAwesomeIcon icon={icon} />
</span>
<select className="d-inline-block w-auto form-control" {...props}>
<select className="d-inline-block form-control" {...props}>
<option key="private" value="private">
{intl.formatMessage(messages['profile.visibility.who.just.me'])}
</option>
<option key="all_users" value="all_users">
{intl.formatMessage(messages['profile.visibility.who.everyone'])}
{intl.formatMessage(messages['profile.visibility.who.everyone'], { siteName: getConfig().SITE_NAME })}
</option>
</select>
</span>
);
}
};
VisibilitySelect.propTypes = {
id: PropTypes.string,

View File

@@ -8,7 +8,7 @@ const messages = defineMessages({
},
'profile.visibility.who.everyone': {
id: 'profile.visibility.who.everyone',
defaultMessage: 'Everyone on edX',
defaultMessage: 'Everyone on {siteName}',
description: 'What users can see this area?',
},
});

View File

@@ -23,6 +23,28 @@
background-size: auto 85%;
}
.username-description {
width: auto;
position: absolute;
left: 1.5rem;
top: 5.25rem;
color: $gray-500;
line-height: 0.9rem;
font-size: 0.8rem;
font-style: normal;
font-weight: 400;
margin-left: 0.9rem;
}
.mb-2rem {
margin-bottom: 2rem;
}
.icon-visibility-off {
height: 1rem;
color: $gray-500;
}
.profile-page {
.edit-section-header {
@extend .h6;

17
src/routes/AppRoutes.jsx Normal file
View File

@@ -0,0 +1,17 @@
import React from 'react';
import {
AuthenticatedPageRoute,
PageWrap,
} from '@edx/frontend-platform/react';
import { Routes, Route } from 'react-router-dom';
import { ProfilePage, NotFoundPage } from '../profile';
const AppRoutes = () => (
<Routes>
<Route path="/u/:username" element={<AuthenticatedPageRoute><ProfilePage /></AuthenticatedPageRoute>} />
<Route path="/notfound" element={<PageWrap><NotFoundPage /></PageWrap>} />
<Route path="*" element={<PageWrap><NotFoundPage /></PageWrap>} />
</Routes>
);
export default AppRoutes;

View File

@@ -0,0 +1,63 @@
import React from 'react';
import { AppContext } from '@edx/frontend-platform/react';
import { getConfig } from '@edx/frontend-platform';
import { MemoryRouter as Router } from 'react-router-dom';
import { render, screen } from '@testing-library/react';
import { getLoginRedirectUrl } from '@edx/frontend-platform/auth';
import AppRoutes from './AppRoutes';
jest.mock('@edx/frontend-platform/analytics');
jest.mock('@edx/frontend-platform/auth', () => ({
getLoginRedirectUrl: jest.fn(),
}));
jest.mock('../profile', () => ({
ProfilePage: () => (<div>Profile page</div>),
NotFoundPage: () => (<div>Not found page</div>),
}));
const RoutesWithProvider = (context, path) => (
<AppContext.Provider value={context}>
<Router initialEntries={[`${path}`]}>
<AppRoutes />
</Router>
</AppContext.Provider>
);
const unauthenticatedUser = {
authenticatedUser: null,
config: getConfig(),
};
describe('routes', () => {
test('Profile page should redirect for unauthenticated users', () => {
render(
RoutesWithProvider(unauthenticatedUser, '/u/edx'),
);
expect(getLoginRedirectUrl).toHaveBeenCalled();
});
test('Profile page should be accessible for authenticated users', () => {
render(
RoutesWithProvider(
{
authenticatedUser: {
username: 'edx',
email: 'edx@example.com',
},
config: getConfig(),
},
'/u/edx',
),
);
expect(screen.getByText('Profile page')).toBeTruthy();
});
test('should show NotFound page for a bad route', () => {
render(
RoutesWithProvider(unauthenticatedUser, '/nonMatchingRoute'),
);
expect(screen.getByText('Not found page')).toBeTruthy();
});
});

View File

@@ -1,7 +1,4 @@
/* eslint-disable import/no-extraneous-dependencies */
import 'core-js/stable';
import 'regenerator-runtime/runtime';
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({ adapter: new Adapter() });
import '@testing-library/jest-dom';

10
src/utils/hoc.jsx Normal file
View File

@@ -0,0 +1,10 @@
import React from 'react';
import { useParams } from 'react-router-dom';
const withParams = (WrappedComponent) => {
const WithParamsComponent = (props) => <WrappedComponent params={useParams()} {...props} />;
return WithParamsComponent;
};
export default withParams;

View File

@@ -1,21 +0,0 @@
const glob = require('glob');
const PurgecssPlugin = require('purgecss-webpack-plugin');
const { createConfig } = require('@edx/frontend-build');
module.exports = createConfig('webpack-prod', {
plugins: [
// Scan files for class names and ids and remove unused css
new PurgecssPlugin({
paths: [].concat(
// Scan files in this app
glob.sync('src/**/*', { nodir: true }),
// Scan files in any edx frontend-component
glob.sync('node_modules/@edx/frontend-component*/**/*', { nodir: true }),
// Scan files in paragon
glob.sync('node_modules/@edx/paragon/**/*', { nodir: true }),
),
// Protect react-css-transition class names
whitelistPatterns: [/-enter/, /-appear/, /-exit/],
}),
],
});