Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Améliorations du Editeur de Types de Champ #3647

Merged
merged 9 commits into from Apr 3, 2019

Conversation

tchak
Copy link
Member

@tchak tchak commented Mar 20, 2019

Cette PR est une réécriture complète de l'éditeur en React.

La manière dont l'éditeur est implémenté à beaucoup changer au fil de l'exploration. La première idée c'était de simplement générer le form html avec du JS dynamique est de le sauver en totalité. Après avoir essayé cette approche je me suis rendu compte que bien que simple conceptuellement elle introduit beaucoup de "edge cases". J'ai donc créé une simple api JSON pour pouvoir enregistrer les changements champ par champ. J'ai pris la décision d'utiliser Vue à l'origine à fin d'essayer de réutiliser les helps de Rails pour construire le formulaire. Cette réutilisation n'avait plus de sens avec le nouveau mode des sauvegardes champ par champ.

En même temps à la fin du cycle de développement ma frustration avec Vue ne cessait de croitre. Mon verdict en tant que "professionnel du JS" c'est que Vue c'est un plat de spaghetti créé par des personnes qui n'aiment pas le JS :) La goute d'eau qui a fait débordé le vase c'était le plugin de drag&drop qui avait trop de problèmes.

Dès le début du projet, je pensais utiliser React et la seule raison qui m'en a empêché c'était la tentative de réutilisation des templates haml. L'intégration dans Rails de React est bien meilleure que Vue. L'écosystème de React est plus riche. Et qu'on l'aime ou pas, mais pour paraphraser "Nobody got fired for using React" :)

Je crois très sincèrement que les prochaines personnes arrivant sur le projet selon bien contentes d'avoir une techno pour laquelle il est très facile de trouver de la doc, des exemples et un écosystème de qualité.

Dérnir changement majeur dans cette PR c’est l’introduction de la queue des opérations. Ce qui va éviter les bugs avec le mouvement des champs.

@tchak tchak force-pushed the champs-editor-improuvements branch 2 times, most recently from 7ab5169 to 5e75683 Compare March 20, 2019 13:21
@tchak
Copy link
Member Author

tchak commented Mar 20, 2019

  • test new types_de_champ#move api
  • fix css for the footer
  • fix css for arrow buttons

@tchak tchak force-pushed the champs-editor-improuvements branch from 5e75683 to 8a45d3c Compare March 20, 2019 13:30
@kemenaran
Copy link
Contributor

@tchak merci pour la description de la PR, et du contexte qui a mené à ça ❤️

@tchak tchak force-pushed the champs-editor-improuvements branch 2 times, most recently from 799079c to acee932 Compare March 22, 2019 11:20
@tchak tchak marked this pull request as ready for review March 22, 2019 21:20
@tchak
Copy link
Member Author

tchak commented Mar 22, 2019

@kemenaran j'ai mis quelques todo que je veux finir, mais ça devrait être bon pour review

Copy link
Contributor

@kemenaran kemenaran left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'ai regardé ce que ça donnait.

Remarques générales

  • Le glisser-déposer des champs fonctionne bien mieux qu'avant 🙌
  • J'ai l'impression que font-awesome-svg ne package que les SVGs qu'on utilise, et c'est bien cool 🙌

Sur l'usabilité

J'ai bien vu qu'il y avait encore des bricoles d'usabilité que tu voulais arranger. Je liste quand même ce qui m'est venu en tête :

  • Je pense que ça se tiendrait de regrouper le contrôle de drag-drop et les flèches haut/bas au même endroit (par exemple sur la gauche).
  • En cliquant sur une flèche haut ou bas, j'ai du mal à comprendre que le champ a bougé : la transition est instantanée et peu visible. Je pense que ça mériterait un effet (animation ou highlight), et sans doute de décaler le viewport en même temps (pour que le champ déplacé reste au même endroit, et qu'on puisse cliquer plusieurs fois de suite sur la même flèche).
  • Le bouton "Ajouter un champ" n'est pas clair : si on a scrollé en haut, on ne voit pas le champ rajouté en bas. On pourrait scroller en bas – ou mieux, ajouter le champ dans le viewport.

Globalement l'éditeur me semble fonctionner – mais en état actuel de la PR il n'est pas non plus utilisable.

(Plus généralement, j'ai l'impression qu'on a souvent du mal sur DS à arriver au point où une fonctionnalité non seulement existe, mais est réellement utilisable sans gros problèmes d'ergonomie… Ça me questionne un peu sur nos méthodes de développement – mais c'est un autre sujet.)

Sur la technique

Avertissement : je ne suis pas un grand expert de React. Je connais un p'tit peu, mais sans plus.

Le code m'a l'air correct, et ça a l'air de bien fonctionner (mis à part les problèmes d'usabilité mentionnés).

Par ailleurs l'éditeur devient un peu complexe, avec des edge-cases à gérer – et la séparation en composants, même si elle est verbeuse, a l'air de bien rendre compte de ça.

En revanche, en lisant le code, l'utilisation de React m'inquiète :

  • On passe de ~400 LOC de Vue à ~1000 LOC de React.

    Et en lisant le code, j'ai souvent une impression de beaucoup de plomberie, ou de "beaucoup de bruit pour pas grand chose". Plein de déclarations, de dispatch, de dynamisme. C'est pas facile à suivre, je trouve.

    Ça fonctionne sans doute si on connait bien React – mais j'ai l'impression qu'il y a des libs certes moins avancées, mais plus directes à comprendre.

  • L'API de React a l'air de changer régulièrement.

    Je m'inquiète de la maintenance, au sens "la lib a été mise à jour, et faut ré-écrire la moitié du composant" (contrairement au sens "on veut rajouter des features").

    Cela dit Vue 3 a l'air de changer d'API aussi. Mais je me demande si ça ne plaide pas pour une bibliothèque de rendu plus minimaliste.

  • L'implémentation actuelle tire aussi Memo et les Reducers, et :

    • Niveau développement je m'y connais trop mal pour être à l'aise avec ça. Par exemple je ne comprends rien au fichier hooks.js.
    • Ça tire une plus grande surface d'API que juste React – donc des cas plus nombreux de "L'API change et il faut ré-écrire".
    • Vu le nombre d'actions qu'on fait, j'ai une impression naïve qu'on pourrait couper dans la plomberie. Que du "Data-Down, Actions-Up" à un seul niveau, sans dispatch dynamique, avec un composant top-level qui envoie des requêtes sur la queue, et basta.

Questions ouvertes

Quand on utilise Rails, on tire plein de magie – mais en échange on a un code ultra-concis.

Ici j'ai l'impression qu'utiliser une bibliothèque riche (React) fait presque plus de code que de tout écrire en vanilla-JS.

  • Est-ce qu'on ne gagnerait pas en simplicité à virer l'utilisation des reducers et compagnie, et à se servir de React juste comme une bibliothèque de rendu ?
  • Est-ce qu'on ne gagnerait pas en maintenabilité à utiliser une bibliothèque de rendu moins blindée de features, plus réduite en périmètre, mais qui évoluerait moins vite (genre preact, ou autre) ?

Vous en pensez quoi ?

app/javascript/packs/application.js Show resolved Hide resolved
babel.config.js Show resolved Hide resolved
.browserslistrc Show resolved Hide resolved
app/javascript/shared/react-ujs.js Show resolved Hide resolved
else
update!(types_de_champ_attributes: attributes)
end
end
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Y'a beaucoup de ifs dans cette méthode. J'ai l'impression que c'est essentiellement lié à :

  • la distinction champs publics / champs privés
  • les champs répétables

Tu crois que ça serait pertinent de faire plutôt deux ou trois endpoints différents ? Du genre :

  • move_type_de_champ
  • move_type_de_champ_private
  • move_type_de_champ_repetition

Ou p-ê en condensant public et private, et en ne gardant qu'une distinction avec les répétition ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oui, je pensais refactored cette méthode en même temps que d'ajouter les tests

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'imagine que c'est ce qu'on peut faire de mieux…

Ça reste la matrice de l'angoisse, et je pense toujours qu'on loupe un truc, mais je ne vois pas comment faire mieux. Ça me va.

@tchak tchak force-pushed the champs-editor-improuvements branch 13 times, most recently from f4c008e to 39189db Compare April 2, 2019 12:51
@tchak tchak force-pushed the champs-editor-improuvements branch from 39189db to eb86e04 Compare April 2, 2019 14:05
@tchak
Copy link
Member Author

tchak commented Apr 2, 2019

up @kemenaran

@tchak tchak force-pushed the champs-editor-improuvements branch from eb86e04 to f3748c9 Compare April 2, 2019 15:32
Copy link
Contributor

@kemenaran kemenaran left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Le scroll à l'ajout d'un nouveau champ est cool ; au moins on voit où on est :)
  • C'est toujours difficile de bouger les champs avec les flèches (vu que le champ bouge instantanément).
  • Dans l'ensemble j'ai l'impression que les champs sont difficiles à distinguer les uns des autres. Mais ça fait sans doute partie d'une passe d'améliorations stylistiques et d'usabilités qu'on peut faire après.

En l'état je suis chaud pour merger cette PR – et continuer sur les améliorations d'usabilité après.

else
update!(types_de_champ_attributes: attributes)
end
end
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'imagine que c'est ce qu'on peut faire de mieux…

Ça reste la matrice de l'angoisse, et je pense toujours qu'on loupe un truc, mais je ne vois pas comment faire mieux. Ça me va.

@tchak tchak force-pushed the champs-editor-improuvements branch from f3748c9 to e2fc9e1 Compare April 3, 2019 12:39
@tchak tchak merged commit 28c4dc8 into demarches-simplifiees:dev Apr 3, 2019
@DS-Cli DS-Cli mentioned this pull request Apr 3, 2019
@tchak tchak deleted the champs-editor-improuvements branch May 14, 2019 14:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants