diff --git a/app/scodoc/sco_groups_view.py b/app/scodoc/sco_groups_view.py
index 3a16c98ff7793610f5090229877a01aaf8f8f029..02185fd87906327cb3baeb82a718ed25c1733d93 100644
--- a/app/scodoc/sco_groups_view.py
+++ b/app/scodoc/sco_groups_view.py
@@ -225,9 +225,8 @@ def menu_groups_choice(
     submit_on_change=False,
     default_deselect_others=True,
     html_export=True,
-    change_event=None,  # XXX ???
 ):
-    """menu pour selection groupes
+    """Menu pour selection groupes
     group_ids est la liste des groupes actuellement sélectionnés
     et doit comporter au moins un élément, sauf si formsemestre_id est spécifié.
     (utilisé pour retrouver le semestre et proposer la liste des autres groupes)
@@ -237,10 +236,6 @@ def menu_groups_choice(
     sinon :
         selecteur.value = [xxx, yyy, ...]
 
-    Si change_event :
-        met à jour l'événement onchange du selecteur
-        (attend du js, plus d'informations sur scu.MultiSelect.change_event)
-
     """
     default_group_id = sco_groups.get_default_group(groups_infos.formsemestre_id)
     n_members = len(sco_groups.get_group_members(default_group_id))
@@ -767,7 +762,7 @@ def groups_table(
                 name="options",
                 html_id="group_list_options",
             )
-            multi_select.change_event("change_list_options(event.target.value);")
+            multi_select.change_event("change_list_options(values);")
             H.extend(
                 # ;
                 [
diff --git a/app/static/js/multi-select.js b/app/static/js/multi-select.js
index 178586f81c94422d28c23aa505ded11c9c9b345b..acd2226b32d52def4671d27ed3a78d238c6f449b 100644
--- a/app/static/js/multi-select.js
+++ b/app/static/js/multi-select.js
@@ -20,7 +20,8 @@
 
     <multi-select>.values() => ["val1",...]
     <multi-select>.values(["val1",...]) => // sélectionne les options correspondantes (ne vérifie pas les options "single")
-    <multi-select>.on("change", (values) => {}) => // écoute le changement de valeur
+    <multi-select>.on((values) => {}) => // écoute le changement de valeur
+    <multi-select>.format((values)=>{}) // modifie les valeurs avant d'être envoyées / récupérées. values est un tableau des valeurs des options sélectionnées
  */
 
 class MultiSelect extends HTMLElement {
@@ -247,8 +248,6 @@ class MultiSelect extends HTMLElement {
       (checkbox) => checkbox.checked
     );
 
-    const values = checkedBoxes.map((checkbox) => checkbox.value);
-
     const opts = checkedBoxes.map((checkbox) => {
       return this.querySelector(`option[value="${checkbox.value}"]`);
     });
@@ -263,6 +262,9 @@ class MultiSelect extends HTMLElement {
       btn.textContent = `${checkedBoxes.length} sélections`;
     }
     this.dispatchEvent(new Event("change"));
+
+    // update the form values
+    this._internals.setFormValue(this._values());
   }
 
   _values(newValues = null) {
@@ -284,7 +286,6 @@ class MultiSelect extends HTMLElement {
         checkbox.checked = newValues.includes(checkbox.value);
       });
 
-      this._internals.setFormValue(this._values());
       this._updateSelect();
     }
   }
@@ -298,7 +299,9 @@ class MultiSelect extends HTMLElement {
   }
 
   on(callback) {
-    this.addEventListener("change", callback);
+    this.addEventListener("change", () => {
+      callback(this._values());
+    });
   }
 
   format(callback) {
diff --git a/app/templates/scolar/formulaire_feuille_appel.j2 b/app/templates/scolar/formulaire_feuille_appel.j2
index 8c93e15e750a4044b636ebdd5452cc01785d84aa..6e6e3f2a4097ab397c1cca90951878aeeddc7b58 100644
--- a/app/templates/scolar/formulaire_feuille_appel.j2
+++ b/app/templates/scolar/formulaire_feuille_appel.j2
@@ -23,7 +23,6 @@
         id="feuille_emargement"
         action="{{request.base_url}}"
         method="post"
-        onsubmit="serializeGroupIds(event)"
     >
         {{ form.hidden_tag() }}
         <div class="infos-button">Groupes&nbsp;: {{grp|safe}}</div>
@@ -56,24 +55,4 @@
 {% include "sco_timepicker.j2" %}
 <script src="{{scu.STATIC_DIR}}/js/groups_view.js"></script>
 <script src="{{scu.STATIC_DIR}}/libjs/purl.js"></script>
-<script>
-function serializeGroupIds(event) {
-    // Dealing with multiselect
-    event.preventDefault();
-    var form = document.getElementById("feuille_emargement");
-    var groupIdsField = form.elements["group_ids"];
-
-    // Check if the group_ids field exists and is an array
-    if (groupIdsField && Array.isArray(groupIdsField.value)) {
-        // Convert the array to a comma-separated string
-        var serializedValue = groupIdsField.value.join(',');
-
-        // Replace the field's value with the serialized string
-        groupIdsField.value = serializedValue;
-    }
-
-    // Now submit the form
-    form.submit();
-}
-</script>
-{% endblock scripts %}
\ No newline at end of file
+{% endblock scripts %}