Skip to content

Commit 2901bae

Browse files
committed
🔖(chore) bump to version 2.21.0
Added - Add CourseAddToWishlist button to add/remove a course from users wishlist - Added Enrollment's pagination in the dashboard - Allow multiple web analytics providers at the same time. - Display `localizedMessage` on Course Enrollment when backend has `localizedMessage` on the 400 error payload Fixed - Fix form styles to suffix input label with "*" when a select, radio or checkbox input is required - Button can be use with a className prop Changed - Rename web analytics providers, from `google_analytics` to `google_universal_analytics`. The `google_tag_manager` now uses the correct `gtm.js` and the `google_tag` uses the `gtag.js`. Replace the multiple web analytics settings with a single `WEB_ANALYTICS` dict setting. The location logic of web analytics js code has been moved to be inside the `web_analytics.html` template. - For performance reasons the default location for the web analytics js code have been changed from `head` to `footer`. - Rename product.certificate to certificate_definition due to Joanie API update. - Rework frontend file architecture - Hide unenroll button on CourseProductItem widget
1 parent f566701 commit 2901bae

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+2924
-377
lines changed

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ Versioning](https://semver.org/spec/v2.0.0.html).
88

99
## [Unrealeased]
1010

11+
## [2.21.0] - 2023-03-21
12+
1113
### Added
1214

1315
- Add CourseAddToWishlist button to add/remove a course from users wishlist
@@ -1824,7 +1826,8 @@ us:
18241826
- finish integrating the missing pages and improve the sandbox environment;
18251827
- test and polish the use of richie as a django app / node dependency.
18261828

1827-
[unreleased]: https://github.com/openfun/richie/compare/v2.20.1...master
1829+
[unreleased]: https://github.com/openfun/richie/compare/v2.21.0...master
1830+
[2.21.0]: https://github.com/openfun/richie/compare/v2.20.1...2.21.0
18281831
[2.20.1]: https://github.com/openfun/richie/compare/v2.20.0...2.20.1
18291832
[2.20.0]: https://github.com/openfun/richie/compare/v2.19.0...2.20.0
18301833
[2.19.0]: https://github.com/openfun/richie/compare/v2.18.0...2.19.0

UPGRADE.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ $ make migrate
1616

1717
## Unreleased
1818

19+
## 2.20.1 to 2.21.0
20+
1921
- Frontend folder architecture has been totally reworked. If you have overridden
2022
any frontend components, you should have to update your overrides.json file to match new paths. In
2123
the same way, you should also check sass import paths in your custom scss files.

cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/requirements/base.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ django-storages==1.11.1
55
dockerflow==2022.1.0
66
gunicorn==20.1.0
77
psycopg2-binary==2.9.3
8-
richie==2.20.1
8+
richie==2.21.0
99
sentry-sdk==1.5.5

cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/frontend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"CMS"
2121
],
2222
"dependencies": {
23-
"richie-education": "2.20.1"
23+
"richie-education": "2.21.0"
2424
},
2525
"devDependencies": {
2626
"@formatjs/cli": "4.8.2",

docs/cookiecutter.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ If you chose to install Cookiecutter, you can now run it against our
2525
[template][2] as follows:
2626

2727
```bash
28-
cookiecutter gh:openfun/richie --directory cookiecutter --checkout v2.20.1
28+
cookiecutter gh:openfun/richie --directory cookiecutter --checkout v2.21.0
2929
```
3030

3131
If you didn't want to install it on your machine, we provide a Docker image
3232
built with our [own repository][4] that you can use as follows:
3333

3434
```bash
3535
docker run --rm -it -u $(id -u):$(id -g) -v $PWD:/app \
36-
fundocker/cookiecutter gh:openfun/richie --directory cookiecutter --checkout v2.20.1
36+
fundocker/cookiecutter gh:openfun/richie --directory cookiecutter --checkout v2.21.0
3737
```
3838

3939
The `--directory` option is to indicate that our Cookiecutter template is in

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
;;
44
[metadata]
55
name = richie
6-
version = 2.20.1
6+
version = 2.21.0
77
description = A CMS to build learning portals for open education
88
long_description = file:README.md
99
long_description_content_type = text/markdown

src/frontend/i18n/locales/ar-SA.json

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,22 @@
123123
"description": "Error message displayed when a field value is too short.",
124124
"message": "The minimum length is {min} {min, plural, one {char} other {chars}}."
125125
},
126+
"components.CourseAddToWishlist.labelAdd": {
127+
"description": "Label to proceed to add a course to user wishlist.",
128+
"message": "Notify me"
129+
},
130+
"components.CourseAddToWishlist.labelRemove": {
131+
"description": "Label to proceed to remove a course to user wishlist.",
132+
"message": "Do not notify me anymore"
133+
},
134+
"components.CourseAddToWishlist.loading": {
135+
"description": "Accessible message displayed while loading wishlist",
136+
"message": "Loading your wishlist..."
137+
},
138+
"components.CourseAddToWishlist.logMe": {
139+
"description": "Label to proceed to login page before being adding a course to user wishlist.",
140+
"message": "Log in to be notified"
141+
},
126142
"components.CourseGlimpse.categoryLabel": {
127143
"description": "Category label text for screen reader users",
128144
"message": "Category"
@@ -167,10 +183,6 @@
167183
"description": "Accessible label displayed while certificate is being generated.",
168184
"message": "Certificate is being generated..."
169185
},
170-
"components.CourseProductItem.enrolled": {
171-
"description": "Message displayed when authenticated user owned the product",
172-
"message": "Enrolled"
173-
},
174186
"components.CourseProductItem.loadingInitial": {
175187
"description": "Accessible text for the initial loading spinner displayed when product is fetching",
176188
"message": "Loading product information..."
@@ -179,6 +191,10 @@
179191
"description": "Message displayed when authenticated user has purchased the product but order is still pending",
180192
"message": "Pending"
181193
},
194+
"components.CourseProductItem.purchased": {
195+
"description": "Message displayed when authenticated user owned the product",
196+
"message": "Purchased"
197+
},
182198
"components.CourseProductsList.end": {
183199
"description": "End label displayed in the header of course run dates section",
184200
"message": "End"
@@ -341,7 +357,7 @@
341357
},
342358
"components.DashboardCourses.loading": {
343359
"description": "Message displayed while loading orders and enrollments",
344-
"message": "Loading ..."
360+
"message": "Loading orders and enrollments..."
345361
},
346362
"components.DashboardCreateAddressForm.header": {
347363
"description": "Title of the dashboard address creation form",
@@ -906,5 +922,21 @@
906922
"hooks.useResources.errorUpdate": {
907923
"description": "Error message shown to the user when resource update request fails.",
908924
"message": "An error occurred while updating a resource. Please retry later."
925+
},
926+
"hooks.useWishlist.errorCreate": {
927+
"description": "Error message shown to the user when wishlist creation request fails.",
928+
"message": "An error occurred when adding this course to your wishlist. Please retry later."
929+
},
930+
"hooks.useWishlist.errorDelete": {
931+
"description": "Error message shown to the user when wishlist deletion request fails.",
932+
"message": "An error occurred when removing this course from your wishlist. Please retry later."
933+
},
934+
"hooks.useWishlist.errorGet": {
935+
"description": "Error message shown to the user when wishlist fetch request fails.",
936+
"message": "An error occurred while fetching wishlist. Please retry later."
937+
},
938+
"hooks.useWishlist.errorNotFound": {
939+
"description": "Error message shown to the user when no wishlist matches.",
940+
"message": "Cannot find the wishlist."
909941
}
910942
}

src/frontend/i18n/locales/es-ES.json

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,22 @@
123123
"description": "Error message displayed when a field value is too short.",
124124
"message": "The minimum length is {min} {min, plural, one {char} other {chars}}."
125125
},
126+
"components.CourseAddToWishlist.labelAdd": {
127+
"description": "Label to proceed to add a course to user wishlist.",
128+
"message": "Notify me"
129+
},
130+
"components.CourseAddToWishlist.labelRemove": {
131+
"description": "Label to proceed to remove a course to user wishlist.",
132+
"message": "Do not notify me anymore"
133+
},
134+
"components.CourseAddToWishlist.loading": {
135+
"description": "Accessible message displayed while loading wishlist",
136+
"message": "Loading your wishlist..."
137+
},
138+
"components.CourseAddToWishlist.logMe": {
139+
"description": "Label to proceed to login page before being adding a course to user wishlist.",
140+
"message": "Log in to be notified"
141+
},
126142
"components.CourseGlimpse.categoryLabel": {
127143
"description": "Category label text for screen reader users",
128144
"message": "Categoría"
@@ -167,10 +183,6 @@
167183
"description": "Accessible label displayed while certificate is being generated.",
168184
"message": "Certificate is being generated..."
169185
},
170-
"components.CourseProductItem.enrolled": {
171-
"description": "Message displayed when authenticated user owned the product",
172-
"message": "Inscrito"
173-
},
174186
"components.CourseProductItem.loadingInitial": {
175187
"description": "Accessible text for the initial loading spinner displayed when product is fetching",
176188
"message": "Loading product information..."
@@ -179,6 +191,10 @@
179191
"description": "Message displayed when authenticated user has purchased the product but order is still pending",
180192
"message": "Pending"
181193
},
194+
"components.CourseProductItem.purchased": {
195+
"description": "Message displayed when authenticated user owned the product",
196+
"message": "Purchased"
197+
},
182198
"components.CourseProductsList.end": {
183199
"description": "End label displayed in the header of course run dates section",
184200
"message": "Fin"
@@ -341,7 +357,7 @@
341357
},
342358
"components.DashboardCourses.loading": {
343359
"description": "Message displayed while loading orders and enrollments",
344-
"message": "Loading ..."
360+
"message": "Loading orders and enrollments..."
345361
},
346362
"components.DashboardCreateAddressForm.header": {
347363
"description": "Title of the dashboard address creation form",
@@ -906,5 +922,21 @@
906922
"hooks.useResources.errorUpdate": {
907923
"description": "Error message shown to the user when resource update request fails.",
908924
"message": "An error occurred while updating a resource. Please retry later."
925+
},
926+
"hooks.useWishlist.errorCreate": {
927+
"description": "Error message shown to the user when wishlist creation request fails.",
928+
"message": "An error occurred when adding this course to your wishlist. Please retry later."
929+
},
930+
"hooks.useWishlist.errorDelete": {
931+
"description": "Error message shown to the user when wishlist deletion request fails.",
932+
"message": "An error occurred when removing this course from your wishlist. Please retry later."
933+
},
934+
"hooks.useWishlist.errorGet": {
935+
"description": "Error message shown to the user when wishlist fetch request fails.",
936+
"message": "An error occurred while fetching wishlist. Please retry later."
937+
},
938+
"hooks.useWishlist.errorNotFound": {
939+
"description": "Error message shown to the user when no wishlist matches.",
940+
"message": "Cannot find the wishlist."
909941
}
910942
}

src/frontend/i18n/locales/fa-IR.json

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,22 @@
123123
"description": "Error message displayed when a field value is too short.",
124124
"message": "The minimum length is {min} {min, plural, one {char} other {chars}}."
125125
},
126+
"components.CourseAddToWishlist.labelAdd": {
127+
"description": "Label to proceed to add a course to user wishlist.",
128+
"message": "Notify me"
129+
},
130+
"components.CourseAddToWishlist.labelRemove": {
131+
"description": "Label to proceed to remove a course to user wishlist.",
132+
"message": "Do not notify me anymore"
133+
},
134+
"components.CourseAddToWishlist.loading": {
135+
"description": "Accessible message displayed while loading wishlist",
136+
"message": "Loading your wishlist..."
137+
},
138+
"components.CourseAddToWishlist.logMe": {
139+
"description": "Label to proceed to login page before being adding a course to user wishlist.",
140+
"message": "Log in to be notified"
141+
},
126142
"components.CourseGlimpse.categoryLabel": {
127143
"description": "Category label text for screen reader users",
128144
"message": "Category"
@@ -167,10 +183,6 @@
167183
"description": "Accessible label displayed while certificate is being generated.",
168184
"message": "Certificate is being generated..."
169185
},
170-
"components.CourseProductItem.enrolled": {
171-
"description": "Message displayed when authenticated user owned the product",
172-
"message": "Enrolled"
173-
},
174186
"components.CourseProductItem.loadingInitial": {
175187
"description": "Accessible text for the initial loading spinner displayed when product is fetching",
176188
"message": "Loading product information..."
@@ -179,6 +191,10 @@
179191
"description": "Message displayed when authenticated user has purchased the product but order is still pending",
180192
"message": "Pending"
181193
},
194+
"components.CourseProductItem.purchased": {
195+
"description": "Message displayed when authenticated user owned the product",
196+
"message": "Purchased"
197+
},
182198
"components.CourseProductsList.end": {
183199
"description": "End label displayed in the header of course run dates section",
184200
"message": "End"
@@ -341,7 +357,7 @@
341357
},
342358
"components.DashboardCourses.loading": {
343359
"description": "Message displayed while loading orders and enrollments",
344-
"message": "Loading ..."
360+
"message": "Loading orders and enrollments..."
345361
},
346362
"components.DashboardCreateAddressForm.header": {
347363
"description": "Title of the dashboard address creation form",
@@ -906,5 +922,21 @@
906922
"hooks.useResources.errorUpdate": {
907923
"description": "Error message shown to the user when resource update request fails.",
908924
"message": "An error occurred while updating a resource. Please retry later."
925+
},
926+
"hooks.useWishlist.errorCreate": {
927+
"description": "Error message shown to the user when wishlist creation request fails.",
928+
"message": "An error occurred when adding this course to your wishlist. Please retry later."
929+
},
930+
"hooks.useWishlist.errorDelete": {
931+
"description": "Error message shown to the user when wishlist deletion request fails.",
932+
"message": "An error occurred when removing this course from your wishlist. Please retry later."
933+
},
934+
"hooks.useWishlist.errorGet": {
935+
"description": "Error message shown to the user when wishlist fetch request fails.",
936+
"message": "An error occurred while fetching wishlist. Please retry later."
937+
},
938+
"hooks.useWishlist.errorNotFound": {
939+
"description": "Error message shown to the user when no wishlist matches.",
940+
"message": "Cannot find the wishlist."
909941
}
910942
}

src/frontend/i18n/locales/fr-CA.json

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,22 @@
123123
"description": "Error message displayed when a field value is too short.",
124124
"message": "La longueur minimale est {min} {min, plural, one {caractère} other {caractères}}."
125125
},
126+
"components.CourseAddToWishlist.labelAdd": {
127+
"description": "Label to proceed to add a course to user wishlist.",
128+
"message": "Notify me"
129+
},
130+
"components.CourseAddToWishlist.labelRemove": {
131+
"description": "Label to proceed to remove a course to user wishlist.",
132+
"message": "Do not notify me anymore"
133+
},
134+
"components.CourseAddToWishlist.loading": {
135+
"description": "Accessible message displayed while loading wishlist",
136+
"message": "Loading your wishlist..."
137+
},
138+
"components.CourseAddToWishlist.logMe": {
139+
"description": "Label to proceed to login page before being adding a course to user wishlist.",
140+
"message": "Log in to be notified"
141+
},
126142
"components.CourseGlimpse.categoryLabel": {
127143
"description": "Category label text for screen reader users",
128144
"message": "Catégorie"
@@ -167,10 +183,6 @@
167183
"description": "Accessible label displayed while certificate is being generated.",
168184
"message": "Certificat en cours de génération..."
169185
},
170-
"components.CourseProductItem.enrolled": {
171-
"description": "Message displayed when authenticated user owned the product",
172-
"message": "Inscrit"
173-
},
174186
"components.CourseProductItem.loadingInitial": {
175187
"description": "Accessible text for the initial loading spinner displayed when product is fetching",
176188
"message": "Chargement des informations du produit..."
@@ -179,6 +191,10 @@
179191
"description": "Message displayed when authenticated user has purchased the product but order is still pending",
180192
"message": "Pending"
181193
},
194+
"components.CourseProductItem.purchased": {
195+
"description": "Message displayed when authenticated user owned the product",
196+
"message": "Purchased"
197+
},
182198
"components.CourseProductsList.end": {
183199
"description": "End label displayed in the header of course run dates section",
184200
"message": "Fin"
@@ -341,7 +357,7 @@
341357
},
342358
"components.DashboardCourses.loading": {
343359
"description": "Message displayed while loading orders and enrollments",
344-
"message": "Loading ..."
360+
"message": "Loading orders and enrollments..."
345361
},
346362
"components.DashboardCreateAddressForm.header": {
347363
"description": "Title of the dashboard address creation form",
@@ -906,5 +922,21 @@
906922
"hooks.useResources.errorUpdate": {
907923
"description": "Error message shown to the user when resource update request fails.",
908924
"message": "An error occurred while updating a resource. Please retry later."
925+
},
926+
"hooks.useWishlist.errorCreate": {
927+
"description": "Error message shown to the user when wishlist creation request fails.",
928+
"message": "An error occurred when adding this course to your wishlist. Please retry later."
929+
},
930+
"hooks.useWishlist.errorDelete": {
931+
"description": "Error message shown to the user when wishlist deletion request fails.",
932+
"message": "An error occurred when removing this course from your wishlist. Please retry later."
933+
},
934+
"hooks.useWishlist.errorGet": {
935+
"description": "Error message shown to the user when wishlist fetch request fails.",
936+
"message": "An error occurred while fetching wishlist. Please retry later."
937+
},
938+
"hooks.useWishlist.errorNotFound": {
939+
"description": "Error message shown to the user when no wishlist matches.",
940+
"message": "Cannot find the wishlist."
909941
}
910942
}

0 commit comments

Comments
 (0)