Projet

Général

Profil

Bug #51224

widget ens-calendar : pas de gestion du "live"

Ajouté par Thomas Noël il y a environ 3 ans. Mis à jour il y a environ 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
17 février 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Quand on choisi une date dans le widget ens-calendar (#50311) il n'y a pas d'évaluation live lancée pour mettre à jour d'autres champs sur la page.

Typiquement on ajoute un commentaire en dessous avec le contenu suivant :

{% if form_var_date %}
Date : {{ form_var_date_structured_date_format }} ({{ form_var_date_structured_date }})
Matin : {{ form_var_date_structured_morning }}
Repas du midi : {{ form_var_date_structured_lunch }}
Après-midi : {{ form_var_date_structured_afternoon }}
{% endif %}

celui-ci ne se met à pas à jour.

(ça marche avec une liste simple, c'est vraiment l'usage de template-ens-calendar qui fait que ça ne passe plus)


Fichiers

Révisions associées

Révision d2b4d1e3 (diff)
Ajouté par Thomas Jund il y a environ 3 ans

isere-cd38: ens-calendar: trigger change event when day is selected (#51224)

Historique

#1

Mis à jour par Thomas Noël il y a environ 3 ans

De très loin, je me dis que peut-être les « preventDefault » bloquent la diffusion d'un événement « ce champ a changé », qui provoquerait ensuite l'appel au système "live" ...? Je n'arrive pas à bien cerner l'affaire :/

#2

Mis à jour par Frédéric Péters il y a environ 3 ans

@@ -233,6 +233,7 @@ $(function() {
       e.preventDefault();
       $day_btns.removeClass(activated_day_class);
       $options.eq(this.dataset.optionIdx).prop('selected', true);
+      le select.trigger('wcs:change');
       $(this).addClass(activated_day_class);
     });
   };

quelque chose genre ça (si je comprends bien que la ligne $options.eq... est celle qui amène le changement de valeur).

#3

Mis à jour par Thomas Jund il y a environ 3 ans

Merci Fred, c'est bien ça, j'ai oublié de lancé un event change sur le $select après changement de valeur.
Petite question, pourquoi lancer un event custom 'wcs:change" plutôt que l'event natif "change", une convention particulière ?

#4

Mis à jour par Thomas Jund il y a environ 3 ans

#5

Mis à jour par Frédéric Péters il y a environ 3 ans

Ça peut éviter des enchainements excessifs d'événements qui se répondent, dans le cas présent je pense que trigger('change') pourrait marcher aussi. (à tester).

#6

Mis à jour par Thomas Jund il y a environ 3 ans

ok, merci.
Je garde le trigger sur "wcs:change".

#7

Mis à jour par Thomas Noël il y a environ 3 ans

  • Statut changé de Solution proposée à En cours

Ca marche mais uniquement quand on change de date. Ca ne marche pas quand on arrive la première fois sur le widget. J'ai l'impression qu'il manque un wcs:change à ce moment, lors de l'initialisation de la liste. J'ai donc bidouillé un wcs:change sur la fin de init(), tel que ci-dessous. Sans être bien sûr de moi, ça me semble être ce qu'il faut faire...?

--- a/templates/variants/isere-cd38/qommon/forms/widgets/select--ens-calendar.html
+++ b/templates/variants/isere-cd38/qommon/forms/widgets/select--ens-calendar.html
@@ -233,8 +233,10 @@ $(function() {
       e.preventDefault();
       $day_btns.removeClass(activated_day_class);
       $options.eq(this.dataset.optionIdx).prop('selected', true);
+      $select.trigger('wcs:change');
       $(this).addClass(activated_day_class);
     });
+    $select.trigger('wcs:change');
   };

   // if Static
#8

Mis à jour par Thomas Jund il y a environ 3 ans

théoriquement, on a besoin de lancer l'event "change" en JS lorsque le value du select a été modifié en JS. Sinon, pas besoin.

Ca ne marche pas quand on arrive la première fois sur le widget

Ça veut donc dire que la première fois est déjà modifié en JS via un live et qu'à ce moment là un jour est déjà ou par défaut sélectionné. Donc il faut bien ajouter un event change lorsque l'event "wcs:options-change" est lancé.
Je le mettrais du coup dans la fonction dédiée à l'event plutôt que dans la function init

  $select.on('wcs:options-change', function(ev, data) {
    if (!data) return;
    calendar_days = define_calendar_days(data.items);
    $('<option value=""></option>').prependTo($select);
    $options = $select.find('option');
    init();
+   $select.trigger('wcs:change');
  });
#9

Mis à jour par Thomas Jund il y a environ 3 ans

nouveau patch à tester

#10

Mis à jour par Thomas Noël il y a environ 3 ans

  • Statut changé de Solution proposée à Solution validée

Impec, merci !

#11

Mis à jour par Thomas Noël il y a environ 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit d2b4d1e3c927db59c2439b85ef5f51148799ddd1
Author: Thomas JUND <tjund@entrouvert.com>
Date:   Mon Feb 22 15:10:58 2021 +0100

    isere-cd38: ens-calendar: trigger change event when day is selected (#51224)

#12

Mis à jour par Frédéric Péters il y a environ 3 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF