Development #43971
évaluation des éléments de WidgetList
0%
Description
Aujourd'hui le champ a un <input type=hidden> added_elements qui reprend le nombre d'éléments aujoutés, c'est natif quixote et ça se trouve géré dans notre js,
/* increase hidden $added_elements value */ var hidden = $($(this).parents('div').parents('div')[0]).prevAll( 'input[type=hidden]')[0]; $(hidden).attr('value', parseInt($(hidden).attr('value'))+1);
mais à approcher de situations plus complexes (blocs de champs répétables), je modifie cela pour dégager le added_elements et faire en sorte que la liste des éléments soit déterminée automatiquement (selon ce qui a été soumis).
En faisant ça j'introduis un petit changement fonctionnel, le champ ajoutait toujours une ligne vide, je retire ça parce que je préfère (par exemple visiter une action de workflow d'envoi d'email, en destinataires, s'il y en a un seul ça n'affiche plus que celui-ci, il faut cliquer sur ajouter si on veut en ajouter un, versus avant où un emplacement vide pour un second destinataire aurait déjà été présent).
Aussi je glisse dans le commit un nouveau paramètre max_items, pour permettre de ne plus afficher le bouton d'ajout à partir d'un certain moment.
Fichiers
Révisions associées
Historique
Mis à jour par Frédéric Péters il y a presque 4 ans
- Fichier 0001-form-revamp-widget-list-to-compute-list-of-children-.patch 0001-form-revamp-widget-list-to-compute-list-of-children-.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
(ça vient après quelques autres tickets, cf la branche)
Mis à jour par Thomas Noël il y a presque 4 ans
Au moment de l'ajout des éléments dans le init on fait simplement :
known_prefixes = {x.split('$', 2)[1] for x in get_request().form.keys() if x.startswith(prefix)} for i in range(len(known_prefixes) - len(self.element_names)): self.add_element()
et je pense qu'il faudrait limiter à max_items s'il est défini. Sinon j'ai l'impression qu'on fait trop confiance aux données reçues pour calculer le nombre d'éléments à afficher/prendre en compte.
Dans le même ordre d'idée, en cas de max_items, je limiterais les add_element possibles dans le set_value.
(En vrai je suis un peu surpris que max_items soit si peu utilisé en limitation, mais sans doute que ça suffit)
Mis à jour par Frédéric Péters il y a presque 4 ans
- Fichier 0001-form-revamp-widget-list-to-compute-list-of-children-.patch 0001-form-revamp-widget-list-to-compute-list-of-children-.patch ajouté
En effet, comme il n'y avait pas encore de quoi tester tout ça était très théorique. (puis j'ai oublié dans les blocs de champs de terminer ça).
Voici le patch qui évalue max_items (mais il faudra attendre les blocs de champs pour avoir un test qui passe par là, je vais l'écrire).
Mis à jour par Frédéric Péters il y a presque 4 ans
La branche wip/8265-blocks avec un test passant sur ce code a été poussée, extrait :
# fill items resp.form['f1$element0$f123'] = 'foo' resp.form['f1$element0$f234'] = 'bar' resp.form['f1$element1$f123'] = 'foo1' resp.form['f1$element1$f234'] = 'bar1' resp.form['f1$element2$f123'] = 'foo2' resp.form['f1$element2$f234'] = 'bar2' # (modify formdef to only allow 2) formdef.fields[1].max_items = 2 formdef.store() # submit form resp = resp.form.submit('submit') assert 'Too many elements (maximum: 2)' in resp
Mis à jour par Thomas Noël il y a presque 4 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Frédéric Péters il y a presque 4 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 54647a16f2acaf9077891b09cf4605917632b1b0 Author: Frédéric Péters <fpeters@entrouvert.com> Date: Mon Jun 1 22:19:14 2020 +0200 form: revamp widget list to compute list of children (#43971) (and bonus: new max_items options)
Mis à jour par Frédéric Péters il y a presque 4 ans
- Statut changé de Résolu (à déployer) à Solution déployée
form: revamp widget list to compute list of children (#43971)
(and bonus: new max_items options)