Development #22031
Modifier le retour geojson pour être clair sur le côté échappé (ou pas) des valeurs
0%
Description
Aujourd'hui parce que le geojson a juste été prévu pour être consommé par w.c.s., il contient les valeurs pré-échappées pour insertion dans de l'html; ce n'est typiquement pas ce qu'on rencontrerait ailleurs, où c'est du côté du javascript consommant la donnée qu'il y aurait à se soucier de ça. Je suggérerais du coup de faire pareil ici, ne pas échapper côté json.
Mais il reste les valeurs des champs, on veut parfois que ça soit de l'html quand même (pour que sur un champ de type fichier ce soit un lien cliquable); plutôt qu'aujourd'hui la liste displayed_fields [(libellé, valeur), ...], je suggère de faire displayed_fields [{'label': 'libellé', 'html_value': '<x>valeur formatée html</x>'}, ...].
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Frédéric Péters il y a environ 6 ans
- Lié à Development #21034: cartes: option pour afficher les propriétés du geojson lors du clic sur le marqueur. ajouté
Mis à jour par Josué Kouka il y a presque 6 ans
- Statut changé de Nouveau à En cours
- Assigné à mis à Josué Kouka
Mis à jour par Josué Kouka il y a presque 6 ans
- Fichier 0001-api-change-geojson-display-fields-format-22031.patch 0001-api-change-geojson-display-fields-format-22031.patch ajouté
- Patch proposed changé de Non à Oui
Mis à jour par Frédéric Péters il y a presque 6 ans
formdata.data = {'0': 'FOO BAR', '1': upload}
Faut faire un test avec {'0': '<font color="red">FOO BAR</font>'}. Et tant qu'à faire, user.name = '<font color="red">Jean Darmette</font>'.
Et pour la forme du js, cf mon commentaire 34 dans #21034.
Mis à jour par Josué Kouka il y a presque 6 ans
- Fichier 0001-api-change-geojson-display-fields-format-22031.patch 0001-api-change-geojson-display-fields-format-22031.patch ajouté
Ok, avec les commentaires pris en compte.
Mis à jour par Frédéric Péters il y a presque 6 ans
assert field['html_value'] == username
Ça ne devrait pas marcher, ça devrait échouer sur username = '<font color="red">Jean Darmette</font>'
.
Tu n'as visiblement pas encore compris le fond du problème; ici w.c.s. doit poser dans html_value du code qui va pouvoir être inséré en tant qu'HTML.
Mis à jour par Josué Kouka il y a presque 6 ans
Frédéric Péters a écrit :
assert field['html_value'] == username
Ça ne devrait pas marcher, ça devrait échouer sur
username = '<font color="red">Jean Darmette</font>'
.Tu n'as visiblement pas encore compris le fond du problème; ici w.c.s. doit poser dans html_value du code qui va pouvoir être inséré en tant qu'HTML.
Ok possible. Dans ce cas il faudrait m'expliquer pour que je comprenne.
Est ce que formdata.get_field_view_value
n'est pas censé me renvoyer la valeur html
d'un champ quand un max_length
est passé ?
Mis à jour par Frédéric Péters il y a presque 6 ans
Tu testes que assert field['html_value'] username
D'une lecture du test, sauf erreur, ça fait '<font color="red">Jean Darmette</font>' '<font color="red">Jean Darmette</font>'
.
Mais les propriétés html_value, il faut dedans du contenu pour lequel le client (javascript) soit sûr que le contenu est de l'HTML bien contrôlé, pas le '<script>alert("hello");</script>" posé comme prénom pour rigoler.
(je crains que tu ne comprennes toujours pas mais ça fait quatre mois que je n'arrive visiblement pas à expliquer).
Mis à jour par Frédéric Péters il y a presque 6 ans
Espoir du matin.
Pour reprendre dans l'autre sens, l'affichage par le client (javascript) des propriétés doit se faire en utilisant .text(la valeur de la propriété). Pour permettre de l'affichage plus évolué, w.c.s. décide dans ce ticket d'également fournir avec les champs une seconde valeur, que w.c.s. garantit comme pouvant être passée sans risque à .html(...).
"Sans risque" ça veut dire que M. <script>alert('hello');</script>, quand son nom est affiché, ne lève pas une alerte javascript.
Plutôt que fournir displayed_fields comme étant [(libellé, valeur), ...], ce ticket demande ainsi pour displayed_fields la structure suivante :
{ "label": "le libellé du champ", "value": "la valeur du champ exploitable via .text(...)", "html_value"; "la valeur du champ exploitable via .html(...)" }
Avec les exemples tout à fait nécessaires,
{ "label": "nom", "value": "<script>alert('hello');</li>', "html_value": "<script>alert('hello');<lt;/script>" }
et
{ "label": "fichier", "value": "plop.pdf", "html_value": "<a href=...>plop.pdf</a>" }
Mis à jour par Josué Kouka il y a presque 6 ans
- Fichier 0001-api-change-geojson-display-fields-format-22031.patch 0001-api-change-geojson-display-fields-format-22031.patch ajouté
Ok. Un patch qui essaie de répondre au besoin.
Mis à jour par Frédéric Péters il y a presque 6 ans
Ça approche mais non sur if field.type == 'file':
, les spécificités doivent au maximum être gérées au niveau des classes des champs, il ne doit pas y avoir de condition sur le type de champ.
'label': field.label,
et $f_label = $('<span class="field-label">').html(field.label);
, tu considères le libellé comme de l'HTML safe, ce n'est pas ce qu'on fait ailleurs. (essaie d'ajouter un champ <i>toto</i>, tu verras les balises apparaitre, pas le texte en italique.
wcs/qommon/static/js/qommon.map.js
parfois tu termines les lignes par des point-virgules, parfois pas. Et on positionne le else sur la même ligne que les accolades.
Mis à jour par Josué Kouka il y a presque 6 ans
- Fichier 0001-api-change-geojson-display-fields-format-22031.patch 0001-api-change-geojson-display-fields-format-22031.patch ajouté
Ok. J'ai supprimé le spécifique et rajouté des ;
là ou il en fallait.
Mis à jour par Frédéric Péters il y a presque 6 ans
La partie js m'a l'air bien compliquée (genre devoir réfléchir à ce qui peut bien se trouver dans $popup_field0.outerHTML).
Je proposerais plutôt :
var $popup_field = $('<p class="popup-field"><span class="field-label"></span><span class="field-value"></span></p>'); $popup_field.find('field-label').text(field.label); if (field.html_value) { $popup_field.find('field-value').html(field.html_value); else { $popup_field.find('field-value').text(field.value); } popup += $popup_field.html();
Mis à jour par Josué Kouka il y a presque 6 ans
- Fichier 0001-api-change-geojson-display-fields-format-22031.patch 0001-api-change-geojson-display-fields-format-22031.patch ajouté
C'est modifié.
Mis à jour par Frédéric Péters il y a presque 6 ans
Ce dernier js me semble avoir été copié/collé sans tester. (il faut un <div> autour du contenu de $popup_field, pour que le .html() en prennent aussi le <p>).
var $popup_field = $('<div><p class="popup-field"><span class="field-label"></span><span class="field-value"></span></p></div>');
(à ne pas copier/coller sans tester)
Mis à jour par Josué Kouka il y a presque 6 ans
- Fichier 0001-api-change-geojson-display-fields-format-22031.patch 0001-api-change-geojson-display-fields-format-22031.patch ajouté
Frédéric Péters a écrit :
Ce dernier js me semble avoir été copié/collé sans tester. (il faut un <div> autour du contenu de $popup_field, pour que le .html() en prennent aussi le <p>).
[...]
(à ne pas copier/coller sans tester)
J'avais testé. Je n'aurai pas eu de rendu sinon. Parce que un $popup_field.find('field-label')
ça ne trouve aucun element (pas le bon selecteur).
J'ai rajouté une div (il n'y en avait pas avant).
Mis à jour par Frédéric Péters il y a presque 6 ans
- Fichier Screenshot-2018-6-7 Backoffice de Auquo - Formulaire - Collecte Propreté.png Screenshot-2018-6-7 Backoffice de Auquo - Formulaire - Collecte Propreté.png ajouté
Mais je ne comprends plus, tu testes quoi/comment pour ne pas voir (pièce jointe) ?
Mis à jour par Josué Kouka il y a presque 6 ans
- Fichier wcs_geojson.png wcs_geojson.png ajouté
Frédéric Péters a écrit :
Mais je ne comprends plus, tu testes quoi/comment pour ne pas voir (pièce jointe) ?
Mon rendu non plus n'est pas super. J'arrive à avoir quelque chose de potable en rajoutant une margin
à div.leaflet-popup-content span.field-value
(pense pas que ce soit la solution).
Mis à jour par Frédéric Péters il y a presque 6 ans
- Patch proposed changé de Oui à Non
Ok j'imagine que tu n'oses pas proposer ça.
Mis à jour par Josué Kouka il y a presque 6 ans
- Fichier 0001-api-change-geojson-display-fields-format-22031.patch 0001-api-change-geojson-display-fields-format-22031.patch ajouté
- Patch proposed changé de Non à Oui
Frédéric Péters a écrit :
Ok j'imagine que tu n'oses pas proposer ça.
Avec la margin
.
Mis à jour par Serghei Mihai il y a presque 6 ans
- Fichier fsb-geojson.png fsb-geojson.png ajouté
Je débarque peut-être comme un cheveux sur la soupe, mais pourquoi le libellé et la valeur sont sur la même ligne alors qu'elles devraient être une sous l'autre?
Sur la recette de Fontenay ça rend comme il faut: https://demarches-fsb.test.au-quotidien.com/backoffice/management/signalement-sur-l-espace-public-v2-pour-stats/map?order_by=-receipt_time&q=&filter=all&filter-status=on&id=on&time=on&last_update_time=on&user-label=on&12=on&14=on&bo4=on&bo5=on&bo6=on&status=on (capture jointe)
Je trouve étrange la fabrication d'un objet:
var $popup_field = $('<div><p class="popup-field"><span class="field-label"></span><span class="field-value"></span></p></div>');
pour ensuite chercher dédans l'element pour placer le libellé et puis la valeur. Et ensuite le reconvertir en chaîne. Alors qu'on peut concatener les chaînes, genre:
var $popup_field = '<div><p class="popup-field"><span class="field-label">' + field.label + '</span>';
Mis à jour par Frédéric Péters il y a presque 6 ans
pour ensuite chercher dédans l'element pour placer le libellé et puis la valeur. Et ensuite le reconvertir en chaîne. Alors qu'on peut concatener les chaînes, genre:
Nope, ton code va afficher une popup et vider ton compte en banque.
Mis à jour par Frédéric Péters il y a presque 6 ans
Si tu veux appliquer le patch en local et regarder ce que ça donne chez toi, super. Et Josué si tu peux attacher une capture montrant ce que ça donne chez toi, super aussi.
Mis à jour par Josué Kouka il y a presque 6 ans
- Fichier wcs_marker_popup.mp4 wcs_marker_popup.mp4 ajouté
- Fichier 0001-api-change-geojson-display-fields-format-22031.patch 0001-api-change-geojson-display-fields-format-22031.patch ajouté
Patch avec l'install publik-devinst.
Mis à jour par Frédéric Péters il y a presque 6 ans
- Statut changé de En cours à Résolu (à déployer)
Poussé ça histoire de ne pas bloquer ensuite pour Combo.
commit 5f3bdfe1b38ad6c1d4e3df6226d5612652dd0d0a Author: Josue Kouka <jkouka@entrouvert.com> Date: Mon Jun 4 17:17:51 2018 +0200 api: change geojson display fields format (#22031)
Mis à jour par Frédéric Péters il y a plus de 5 ans
- Statut changé de Résolu (à déployer) à Fermé
api: change geojson display fields format (#22031)