Development #15532
popup avec les infos de la demande sur clic d'une point sur une carte des demandes géolocalisées
0%
Description
Les clics sur les epingles ouvriraient des popups dans lesquelles on affiche les mêmes champs que dans le parametrage des colonnes (à voir).Les epingles pourraient avoir les couleurs des statuts afin que les agents puissent distinguer les zones ou ils doivent agir.
Le numéro de la demande serait un lien vers le traitement de la demande.
Fichiers
Demandes liées
Révisions associées
tests: update form fields localy for geojson tests (#15532)
Historique
Mis à jour par Frédéric Péters il y a environ 7 ans
Attention à ne pas trop en faire par ticket; popup et couleur des épingles, ça devrait être deux sujets différents.
Mis à jour par Serghei Mihai il y a environ 7 ans
- Fichier 0001-backoffice-display-form-s-selected-fields-on-maps-15.patch 0001-backoffice-display-form-s-selected-fields-on-maps-15.patch ajouté
- Fichier signalements_popups.png signalements_popups.png ajouté
- Assigné à mis à Serghei Mihai
- Patch proposed changé de Non à Oui
Premiere version de patch avec le résultat en capture.
Je rajoute des tests.
Mis à jour par Frédéric Péters il y a environ 7 ans
- Lié à Development #15533: Sur le rendu carte des demandes géolocalisées attribuer aux epingles les couleurs des status ajouté
Mis à jour par Frédéric Péters il y a environ 7 ans
Quid de la carte globale ?
Il était aussi question de pouvoir cliquer pour aller sur la demande. (« Le numéro de la demande serait un lien vers le traitement de la demande »).
Attention à ne pas afficher n'importe quoi, formdata.get_field_value(field.label)
sur un fichier ça va te donner un <PicklableUpload> qui ne va pas vraiment vouloir être sérialisé. Pour avoir de l'HTML affichable il y a get_view_value() (et get_view_short_value) (à noter que ça demande une substitution particulière pour les champs de type fichier). Ça évitera aussi l'injection HTML actuellement possible.
Dans la série de champs affichés il y a des "FakeField", ces champs sont toujours repris à null et du coup jamais affichés; ça demande sans doute un peu de refactoring dans w.c.s., j'ai créé #15842.
Comme ça devient une donnée de paramétage de l'affichage de la carte, la zone "Paramétrage des colonnes" présente dans la barre latérale du listing, elle devrait se trouver aussi sur la vue carte (avec un autre nom, sans doute). Particulièrement important parce qu'actuellement, sur une modification de filtre, les champs seront réinitialisés.
(styler la croix de fermeture pour a minima dégager la bordure de soulignement)
Mis à jour par Frédéric Péters il y a environ 7 ans
- Lié à Development #15842: factorisation FakeField ajouté
Mis à jour par Serghei Mihai il y a environ 7 ans
- Fichier 0001-backoffice-display-form-s-selected-fields-on-maps-15.patch 0001-backoffice-display-form-s-selected-fields-on-maps-15.patch ajouté
- Fichier public-map-1492004611659.png public-map-1492004611659.png ajouté
Pour la carte globale je garde le clic sur le marker qui envoie vers la demande.
Sur la carte d'un formulaire je renomme le bouton en "Markers Settings" (nom trouvé en concertation avec Brice), je suis preneur d'un autre.
Patch dependant du #15842 pour la récuperation des valeurs des champs.
Mis à jour par Frédéric Péters il y a environ 7 ans
Pour la carte globale je garde le clic sur le marker qui envoie vers la demande.
C'est dommage d'avoir un comportement différent; j'aurais plutôt quand même vu une popup avec dedans le nom du formdef, le numéro du formdata, le statut.
popup += '<p>' + value[0] + '<strong>' + value[1] + '</strong></p>'
Au niveau de l'HTML de la popup, ça serait bien de pouvoir viser le libellé du champ (perso ça me serait allé de mettre les deux dans des span, plutôt qu'imposer un strong ici).
- $(document).trigger('backoffice-filter-change', $('form#listing-settings').serialize()); + var params = window.location.href.slice(window.location.href.indexOf('?') + 1); + $(document).trigger('backoffice-filter-change', $('form#listing-settings').serialize());
Ce bout ne me semble pas des plus pertinents.
Malgré #15842 ça ne marche toujours pas du tout avec les champs de type fichier (par exemple). (astuce pour s'en rendre compte : tester); dans l'ordre :
- parce que sans le max_length la valeur ne sera pas une chaine,
- parce qu'ensuite encore ça sera un htmltext, pas sérialisable en json.
- parce que derrière, comme je le notais, il reste que "ça demande une substitution particulière pour les champs de type fichier"
- parce qu'au final, à côté des champs de type fichier, ça laisse l'injection HTML possible pour les autres. (tester avec une chaine contenant <i>HELLO</i> par exemple)
Sur le rendu, au final, afficher juste le numéro comme étant un lien c'est pas terrible je trouve, mettre en bas de popup un lien "ouvrir" ?
Mis à jour par Frédéric Péters il y a environ 7 ans
+ Lors de l'autorefresh la popup ouverte ne l'est plus; désactiver l'autorefresh quand une popup est ouverte ?
Mis à jour par Frédéric Péters il y a environ 7 ans
- Sujet changé de amélioration du rendu sur une carte des demandes géolocalisées à popup avec les infos de la demande sur clic d'une point sur une carte des demandes géolocalisées
Mis à jour par Serghei Mihai il y a environ 7 ans
- Fichier 0001-backoffice-display-form-s-selected-fields-on-maps-15.patch 0001-backoffice-display-form-s-selected-fields-on-maps-15.patch ajouté
- Fichier Screenshot_2017-04-13_17-42-10.png Screenshot_2017-04-13_17-42-10.png ajouté
Url de téléchargement des fichiers envoyée dans un paramètre de la réponse json.
En bas de la popup il me parait plus cohérent de mettre "Voir".
Autorefresh desactivé quand la popup ouverte.
Mis à jour par Frédéric Péters il y a environ 7 ans
Url de téléchargement des fichiers envoyée dans un paramètre de la réponse json.
Il y a encore incompréhension, ce qu'il faut, c'est l'équivalent de :
r += field_value.replace(str('[download]'), str('%sdownload' % link)) # de forms/backoffice.py ou elem = elem.replace('[download]', filled.get_url(backoffice=True)) # de backoffice/management.py
limit=None, order_by=None, columns_settings=True, columns_settings_label=None):
C'est dommage de se trouver ainsi avec columns_settings et columns_settings_label, plutôt garder uniquement ce dernier et signifier que None fait que le bouton n'est pas présent.
parce qu'au final, à côté des champs de type fichier, ça laisse l'injection HTML possible pour les autres. (tester avec une chaine contenant <i>HELLO</i> par exemple)
Cette injection HTML est toujours possible.
perso ça me serait allé de mettre les deux dans des span, plutôt qu'imposer un strong ici
Bien sûr des <span> avec des classes, pour pouvoir les différencier; pareil pour la vue globale, ok pour des <p> mais faut leur mettre une classe.
+ } else { + var popup = '<p>' + feature.properties.name + '</p>'; + popup += '<p>' + feature.properties.status_name + '</p>'; + } + popup += '<p><a href="' + feature.properties.url + '">' + feature.properties.view_label + '</span></p>'; + layer.bindPopup(popup); },
Indentation ratée.
Mis à jour par Serghei Mihai il y a environ 7 ans
Mis à jour par Frédéric Péters il y a environ 7 ans
Autorefresh desactivé quand la popup ouverte.
Les événements dans tous les sens ça n'est pas nécessairement facile à suivre, ici j'imaginais simplement que dans qommon.map.js, à la réception de l'événement backoffice-filter-change, on regarde si c'est du rafraichissment automatique, et si c'est le cas et qu'il y a une popup ouverte, on zappe. Pas du tout jouer avec popupopen/popupclose, simplement si $('.leaflet-popup').length, on zappe.
Bien sûr des <span> avec des classes, pour pouvoir les différencier; pareil pour la vue globale, ok pour des <p> mais faut leur mettre une classe.
Ok mais ce n'était pas gratuit, c'étati pour éviter des sélecteurs comme :
div.leaflet-popup-content p span:nth-child(2) { div.leaflet-popup-content p:last-child {
qui sont bien trop fragiles.
if field.type == 'file': value = field.get_view_value(value) value = value.replace('[download]', formdata_backoffice_url)
Non et toujours non, le travail de refactorisation fait, il doit permettre d'éviter de traiter différement les champs.
→ ça doit pouvoir ressembler à ceci :
for field in fields: - value = formdata.get_field_view_value(field) - if field.type == 'file': - value = field.get_view_value(value) - value = value.replace('[download]', formdata_backoffice_url) - else: - value = htmlescape(value) - display_fields.append((field.label, str(value))) + value = formdata.get_field_view_value(field, max_length=60) + value = value.replace('[download]', formdata_backoffice_url) + display_fields.append((field.label, str(htmlescape(value))))
columns_settings_label= _('Columns Settings'))
Espace qui n'a rien à faire là.
Aussi, ça n'a pas trop de sens d'inclure les champs de type "carte" dans les champs qu'on peut afficher, "if field.type == 'map': continue" dans la boucle plus haut ça le fait, ne pas permettre de le sélectionner comme champ dans le paramétrage, uniquement pour la vue carte, c'est peut-être galère, on pourrait peut-être juste se dire que les cartes n'ont rien à faire dans les listings, jamais (sauf qu'alors on pourrait les perdre pour la sortie csv aussi). (bref sans doute compliqué de faire plus fin que juste sauter le champ).
Mis à jour par Serghei Mihai il y a environ 7 ans
Mis à jour par Frédéric Péters il y a environ 7 ans
}); } else { var popup = '<p class="popup_field">' + feature.properties.name + '</p>';
Je sais qu'on n'a pas de bonne règle uniformément appliquée concernant l'indentation du js, mais a minima, à deux lignes d'écart, ne pas utiliser deux espace d'un côté et quatre de l'autre.
Moins grave que sur des données de l'usager mais quand même, du markup dans le libellé d'un champ ne se trouve pas encodé. (créer un libellé <font color="red">plop</font> pour le constater)
if field.type == 'map': continue
C'est dommage de ne pas avoir de test pour passer sur ce qui est presque la seule condition du patch.
Mis à jour par Serghei Mihai il y a environ 7 ans
Mis à jour par Frédéric Péters il y a environ 7 ans
On approche; un dernier truc d'uniformité par rapport au reste, on a majoritairement tendance à utiliser des tirets dans les classes CSS.
Mis à jour par Frédéric Péters il y a environ 7 ans
Et à nouveau, dans la carte globale, avoir des classes permettant de différencier le titre du statut.
Mis à jour par Serghei Mihai il y a environ 7 ans
Mis à jour par Frédéric Péters il y a environ 7 ans
Le markup dans un nom de formulaire n'est pas encodé; et l'idée étant apparemment que c'est mon job de les lister tous, le markup dans les noms de statut non plus. (sur la carte globale)
Mis à jour par Serghei Mihai il y a environ 7 ans
Mis à jour par Frédéric Péters il y a environ 7 ans
$(document).trigger('backoffice-filter-change', $('form#listing-settings').serialize()); $(document).trigger('backoffice-filter-change', $('form#listing-settings').serialize());
Espace gratuit.
Mis à jour par Serghei Mihai il y a environ 7 ans
Mis à jour par Frédéric Péters il y a environ 7 ans
if (field[1]) { popup += '<p class="popup-field"><span class="field-label">' + field[0] + '</span>'; popup += '<span class="field-value">' + field[1] + '</span></p>'; }
Dernier truc repéré j'aurais préféré la condition gérée au niveau du python, ce qui permet des tests; mais oublions ce dernier détail; ack.
Mis à jour par Serghei Mihai il y a environ 7 ans
- Statut changé de En cours à Résolu (à déployer)
Je fais dans un autre ticket.
commit 6965577da8f27fb32c8f0f41da03d31ba5098a49 Author: Serghei Mihai <smihai@entrouvert.com> Date: Tue Apr 11 17:28:27 2017 +0200 backoffice: display form's selected fields on maps (#15532)
Mis à jour par Serghei Mihai il y a presque 7 ans
- Statut changé de Résolu (à déployer) à Solution déployée
backoffice: display form's selected fields on maps (#15532)