Projet

Général

Profil

Development #44123

Vue de traitement : meilleure présentation d'un champ liste à choix multiple

Ajouté par Emmanuel Cazenave il y a presque 4 ans. Mis à jour il y a environ 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
16 juin 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Dans #44106, il y a un constat de mauvaise lisibilité d'un champ liste à choix multiple dans la vue de traitement : "Merci de nous indiquer les dates" dans https://demarches-rouen.test.entrouvert.org/backoffice/management/centre-loisirs/21/.

(et je me dis naïvement qu'une présentation en bullet ou autre pourrait faire l'affaire).


Fichiers


Demandes liées

Lié à Intégrations graphiques Publik - Development #52097: Styler les listes d'items à choix multiplesFermé16 mars 2021

Actions
Lié à w.c.s. - Development #50532: Le résumé du formulaire ne permet pas de représenter un champ "liste à choix multiple"Fermé26 janvier 2021

Actions

Révisions associées

Révision 149c73db (diff)
Ajouté par Emmanuel Cazenave il y a environ 3 ans

fields: store _structured on ItemsField for every data source (#44123)

Révision d44e6155 (diff)
Ajouté par Emmanuel Cazenave il y a environ 3 ans

fields: display ItemsField using <ul> on summary page if possible (#44123)

Historique

#2

Mis à jour par Frédéric Péters il y a presque 4 ans

Dans le travail en cours sur les blocs de champs il y a un **kwargs ajouté de manière systématique aux méthodes get_view_value(), ça permettra de distinguer les situations mieux qu'aujourd'hui, d'avoir un rendu là dans la vue de traitement d'une demande différent de ce qui est affiché dans une colonne du tableau de traitement.

(ça peut déjà être possible aujourd'hui via la distinction get_view_value et get_short_view_value mais je déconseille d'avancer là-dessus avant les blocs de champs).

#3

Mis à jour par Emmanuel Cazenave il y a environ 3 ans

  • Assigné à mis à Emmanuel Cazenave
#4

Mis à jour par Emmanuel Cazenave il y a environ 3 ans

Pour initier le truc, un patch naif :

iff --git a/wcs/fields.py b/wcs/fields.py
index 91a55bd3..c479864e 100644
--- a/wcs/fields.py
+++ b/wcs/fields.py
@@ -2226,6 +2226,14 @@ class ItemsField(WidgetField, ItemFieldMixin):
             raise ValueError('invalid data for items type (%r)' % value)

     def get_view_value(self, value, **kwargs):
+        # summary page
+        if 'value_id' in kwargs:
+            r = TemplateIO(html=True)
+            r += htmltext('<ul>')
+            for x in kwargs['value_id']:
+                r += htmltext('<li>%s</li>' % x)
+            r += htmltext('</ul>')
+            return r.getvalue()
         if type(value) is str:  # == display_value
             return value
         if value:

Constatation empirique que sur la page de résumé la méthode est appelée avec un value_id contrairement à la page de tableau.
Mais dans value il y un déjà une chaîne de caractère "un, deux", tandis que dans kwargs['value_id'] il y a une liste.

Ci-joint une capture, sans style associé il y une marge supérieure et inférieure sur le <ul> qui n'est pas du plus bel effet.

(je veux bien abandonner ce ticket s'il est jugé plus fastidieux de me guider que de faire soi même).

#5

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

Constatation empirique que sur la page de résumé la méthode est appelée avec un value_id contrairement à la page de tableau.

Oui ce n'est pas nécessairement bien nommé "value_id", c'est nommé ainsi en pensant uniquement aux champs liste; ça vient de get_value_info() dans wcs/fields.py,

        # return the selected value and an optional dictionary that will be
        # passed to get_view_value() to provide additional details.

En pratique pour une liste à choix multiples ce qui se trouve mis dans "value_id" c'est la valeur "raw", la liste des choix.

J'écris "la liste des choix", sur un champ alimenté par une source de données, c'est plus précisément la liste des identifiants des choix, i.e.

+            for x in kwargs['value_id']:
+                r += htmltext('<li>%s</li>' % x)

va afficher 1 et 4, plutôt que "pomme" et "abricot".

Dans le get_value_info sont passées toutes les données disponibles, il y aurait dans le cas de la liste à choix multiples à en extraire les libellés individuels, qui peuvent se trouver, le stockage étant :

{'1': ['1', '4'],
 '1_display': 'Pomme, Abricot',
 '1_structured': [{'id': 1, 'text': 'Pomme', 'nom': 'Pomme'}, {'id': 4, 'text': 'Abricot', 'nom'': 'Abricot'}],
 etc.

(il y a cependant à vérifier que la colonne _structured est bien enregistrée pour les sources de données qui contiennent juste id et text et pas d'attributs supplémentaires).

#6

Mis à jour par Emmanuel Cazenave il y a environ 3 ans

Frédéric Péters a écrit :

(il y a cependant à vérifier que la colonne _structured est bien enregistrée pour les sources de données qui contiennent juste id et text et pas d'attributs supplémentaires).

Non ce n'est pas le cas, mais pas très gênant, ça se gère comme le cas sans data source.

Je tente un bout de css, il y aurait à faire la même chose coté publik-base-theme pour l'affichage front.

#7

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

Non ce n'est pas le cas, mais pas très gênant, ça se gère comme le cas sans data source.

C'est-à-dire que ça va afficher une liste d'identifiants plutôt que des libellés ?

#8

Mis à jour par Emmanuel Cazenave il y a environ 3 ans

Non ça va afficher les libellés.

La situation avant ce patch sur les paramètres reçus par get_view_value sur une page de résumé :

  • pour une des choix rentrés manuellement ('foo', 'bar') ou venant d'une source de donnée "simple" (avec juste 'id' et 'text' : [{'id': '1', 'text': 'foo'}, {'id': '2', 'text': 'bar'}]) ça donne
value = 'foo, bar'
value_id = ['foo', 'bar']

(avec aucune donnée en plus dispo via get_structured_value dans le cas de la source de donnée simple)

  • pour une source de donnée "complexe" [{'id': '1', 'text': 'foo', 'whatever': 'xxxx'}, {'id': '2', 'text': 'bar', 'whatever': 'zzz'}], ça donne
value = 'foo, bar'
value_id = ['1', '2']

mais avec des infos dispos en plus via get_structured_value.

Du coup le patche consiste juste à surcharger get_value_info pour avoir les libellés de dispo via un argument text dans le cas source de donnée complexe et d'aller piocher dans text ou value_id selon le cas.

#9

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

Ma question porte sur :

(il y a cependant à vérifier que la colonne _structured est bien enregistrée pour les sources de données qui contiennent juste id et text et pas d'attributs supplémentaires).

i.e. le cas où il y a une source de données, qui serait [{'id': '1', 'text': 'foo'}, {'id': '2', 'text': 'bar'}].

#10

Mis à jour par Emmanuel Cazenave il y a environ 3 ans

Frédéric Péters a écrit :

Ma question porte sur :

(il y a cependant à vérifier que la colonne _structured est bien enregistrée pour les sources de données qui contiennent juste id et text et pas d'attributs supplémentaires).

La réponse est non, pas de colonne _structured enregistrée dans ce cas, mais dans ce cas toujours la liste des libellés est passée dans value_id (déjà le cas avant ce patch), donc j'ai juste à piocher dedans.

#11

Mis à jour par Emmanuel Cazenave il y a environ 3 ans

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

Oulala grosse confusion, la source de donnée sur laquelle je testais expose les mêmes données dans 'id' et 'text', désolé pour le bruit.

#12

Mis à jour par Emmanuel Cazenave il y a environ 3 ans

Du coup tentative d'avoir à disposition la colonne _structured pour le cas data source "simple" c'est :

-        if not set(structured_options[0].keys()) != set(['id', 'text']):
-            return

J'observe que ça fait échouer des tests qui vérifient l'absence de cette donnée, ça semble facile corriger, mais zéro hauteur de vue sur cette situation, est-ce la voie à suivre ?

Pour le reste du patch ambitions revues à la baisse : afficher sous forme de liste uniquement si on a le _structured à disposition, sinon continuer avec l'affichage actuel (je ne vois pas de chemin pour assurer un affichage liste quelque soit la situation).

#13

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

J'observe que ça fait échouer des tests qui vérifient l'absence de cette donnée, ça semble facile corriger, mais zéro hauteur de vue sur cette situation, est-ce la voie à suivre ?

Je dirais que oui, ça me semble avoir été fait ainsi en pensant uniquement au type "liste" et pour économiser un peu de données. (origine de tout ça dans #7466).

Pour le reste du patch ambitions revues à la baisse : afficher sous forme de liste uniquement si on a le _structured à disposition

C'est-à-dire "pas pour les anciennes demandes", right ?

#15

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

Ok, sans doute unir 0002 & 0003 en un seul commit et ajouter une classes sur le <ul> pour ne pas cibler large.

#16

Mis à jour par Emmanuel Cazenave il y a environ 3 ans

Frédéric Péters a écrit :

et ajouter une classes sur le <ul> pour ne pas cibler large.

J'étais partis là dessus puis j'ai vu que tout ça se passe dans un div.field-type-items, il m'a semblé opportun de s'en servir plutôt que d'introduire une nouvelle classe.

#17

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

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

Ok ainsi.

#18

Mis à jour par Emmanuel Cazenave il y a environ 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit d44e6155ee9ca9323cd070ea25e1636833f31632
Author: Emmanuel Cazenave <ecazenave@entrouvert.com>
Date:   Thu Mar 4 12:40:15 2021 +0100

    fields: display ItemsField using <ul> on summary page if possible (#44123)

commit 149c73db4f3eba4a98ae1527ba5cd0b3308d8bdd
Author: Emmanuel Cazenave <ecazenave@entrouvert.com>
Date:   Wed Mar 3 17:43:02 2021 +0100

    fields: store _structured on ItemsField for every data source (#44123)
#19

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
#20

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

#21

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

  • Lié à Development #50532: Le résumé du formulaire ne permet pas de représenter un champ "liste à choix multiple" ajouté

Formats disponibles : Atom PDF