diff --git a/backend/backend_app/serializers.py b/backend/backend_app/serializers.py index 90940ef69ef4a36d2079717c84427250ca32e504..aa8ac9aca832a718bd69304607467f1c5a0295f0 100644 --- a/backend/backend_app/serializers.py +++ b/backend/backend_app/serializers.py @@ -9,10 +9,14 @@ from backend_app.models.exchange import Exchange class CourseFeedbackSerializer(EssentialModuleSerializer): course_code = serializers.SerializerMethodField() # needed for the front + course_title = serializers.SerializerMethodField() # needed for the front def get_course_code(self, obj): return obj.course.code + def get_course_title(self, obj): + return obj.course.title + def update(self, instance, validated_data): instance.untouched = False return super().update(instance, validated_data) @@ -21,6 +25,7 @@ class CourseFeedbackSerializer(EssentialModuleSerializer): model = CourseFeedback fields = EssentialModuleSerializer.Meta.fields + ( "course_code", + "course_title", "language", "comment", "adequation", diff --git a/frontend/src/components/app/UnlinkedPartners.js b/frontend/src/components/app/UnlinkedPartners.js index 3b43253704895fcde8afd5de451e9439721e518a..bbaf959b7ebeed4aad532a5d3c99f4725ba6f8ae 100644 --- a/frontend/src/components/app/UnlinkedPartners.js +++ b/frontend/src/components/app/UnlinkedPartners.js @@ -60,9 +60,14 @@ class UnlinkedPartners extends CustomComponentForAPI { nUnlinked > 0 ? <> - ⚠ {unlinkedPartners.length} universités partenaires de l'UTC - ne sont pas encore pleinement disponible(s) sur la plateforme. - Plus d'informations  + ⚠  + { + nUnlinked === 1 ? + "1 université partenaire de l'UTC n'est pas encore pleinement disponible" + : + `${nUnlinked} universités partenaires de l'UTC ne sont pas encore pleinement disponibles` + } + sur la plateforme. Plus d'informations  ici diff --git a/frontend/src/components/common/SimplePopupMenu.js b/frontend/src/components/common/SimplePopupMenu.js index ab963ee849a9cef72c2fd27d31aaa8fabf23f3f3..4358a57ef691b249c46c28c70ce5e9ac9e86fdc7 100644 --- a/frontend/src/components/common/SimplePopupMenu.js +++ b/frontend/src/components/common/SimplePopupMenu.js @@ -32,8 +32,8 @@ function SimplePopupMenu(props) { onClose={handleClose} > { - props.items.map(({label, onClick}, key) => ( - { + props.items.map(({label, onClick, disabled}, key) => ( + { onClick(); handleClose(); }}> @@ -51,6 +51,7 @@ SimplePopupMenu.propTypes = { items: PropTypes.arrayOf(PropTypes.shape({ label: PropTypes.string.isRequired, onClick: PropTypes.func.isRequired, + disabled: PropTypes.bool.isRequired, })).isRequired, renderHolder: PropTypes.func.isRequired, }; diff --git a/frontend/src/components/form/Form.js b/frontend/src/components/form/Form.js index 3eea5f0879096a5b045c0bb917a67c63c74cc982..1dcae0fba762812d9e3ec640388985e61225229e 100644 --- a/frontend/src/components/form/Form.js +++ b/frontend/src/components/form/Form.js @@ -152,6 +152,8 @@ class Form extends Component { // we need to compare objects (ie JSON objects) differently if (typeof cmp1 === "object") { return !isEqual(cmp1, cmp2); + } else if ((typeof cmp1 === "number") || (typeof cmp2 === "number")) { + return cmp1 != cmp2; // allow 93 == "93.00" } else { return cmp1 !== cmp2; } diff --git a/frontend/src/components/form/fields/Field.js b/frontend/src/components/form/fields/Field.js index c373cab920258fcdb3571eba6bbac9034c2eeb2e..c129c0395d26ef8644df99a912c8ad90b1a9e9e7 100644 --- a/frontend/src/components/form/fields/Field.js +++ b/frontend/src/components/form/fields/Field.js @@ -134,7 +134,7 @@ Field.propTypes = { required: PropTypes.bool.isRequired, // is the field required ? label: PropTypes.string, // text to go along the field comment: PropTypes.string, // text to give more information on what is expected - value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, // value of the field + value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), // value of the field form: PropTypes.object, // required in constructor (reference of to the) form containing the field fieldMapping: PropTypes.string.isRequired, // name of the field in the data }; diff --git a/frontend/src/components/form/fields/NumberField.js b/frontend/src/components/form/fields/NumberField.js index 94b4a80b5991f54eb777e6923b499932344d18b7..212bc12281069dbd8d3f93621b14b16248f8d5d1 100644 --- a/frontend/src/components/form/fields/NumberField.js +++ b/frontend/src/components/form/fields/NumberField.js @@ -39,8 +39,11 @@ class NumberField extends Field { } serializeFromField() { - const value = super.serializeFromField(); - return parseFloat(value); + const value = super.serializeFromField(), + parsed = parseFloat(value); + + if (isNaN(parsed)) return null; + else return parsed; } handleChangeValue(val) { diff --git a/frontend/src/components/pages/PageEditExchangeFeedbacks.js b/frontend/src/components/pages/PageEditExchangeFeedbacks.js index 5298caf75bb83b851d2b5e771e0cc61a5f03f951..c38c7d9f3780eff3759e142471c11d5e7a5ed745 100644 --- a/frontend/src/components/pages/PageEditExchangeFeedbacks.js +++ b/frontend/src/components/pages/PageEditExchangeFeedbacks.js @@ -45,7 +45,7 @@ class PageEditExchangeFeedbacks extends CustomComponentForAPI { if (id) { return ( <> - + { univId ? {univName} : diff --git a/frontend/src/components/recommendation/SelectListSubPage.js b/frontend/src/components/recommendation/SelectListSubPage.js index 48171cd6a969b69aaecac975ff03252c74d875d1..bf7a7474a6315a73ddfd4ec00bf4a794590c8779 100644 --- a/frontend/src/components/recommendation/SelectListSubPage.js +++ b/frontend/src/components/recommendation/SelectListSubPage.js @@ -103,6 +103,7 @@ class SelectListSubPage extends CustomComponentForAPI { this.props.deleteList(list.id, () => this.props.invalidateReadAll()) }, diff --git a/frontend/src/components/recommendation/view/View.js b/frontend/src/components/recommendation/view/View.js index b9996c006741012938032a78a9e691b491194119..37972d9a50faed691ae8c7015749d2357ccb107f 100644 --- a/frontend/src/components/recommendation/view/View.js +++ b/frontend/src/components/recommendation/view/View.js @@ -452,6 +452,7 @@ class View extends React.Component { this.deleteBlock() }, @@ -466,8 +467,8 @@ class View extends React.Component { this.addBlock("text-block")}, - {label: "Université", onClick: () => this.addBlock("univ-block")}, + {label: "Markdown", onClick: () => this.addBlock("text-block"), disabled: false,}, + {label: "Université", onClick: () => this.addBlock("univ-block"), disabled: false,}, ]} renderHolder={({onClick}) => (