betagouv / complements-alimentaires

MIT License
5 stars 0 forks source link

:spiral_notepad: Notes privées pour instruction et visa #1235

Closed alemangui closed 2 weeks ago

alemangui commented 2 weeks ago

Closes #1217

Contexte

Aujourd'hui on a un seul champ "notes privées" qui est partagé par l'instructrice et la viseuse. Or, avant il y en avait deux : un champ modifiable par l'instructrice et un autre par la viseuse. Cette PR vise à rétablir ce fonctionnement

Scope

:information_source: Rappel technique

Le champ private_notes existait dans le modèle déclaration mais n'étais jamais modifié via l'endpoint REST /declarations/.

Le champ était peuplé lors des changement de state en passant par la state machine, çad des endpoints RPC comme declarations//observe-with-visa/, declarations//refuse-visa/, etc.

Le champ DSFRInput pour les notes privées était donc placé dans l'onglet de la décision et était envoyé comme payload de la requête RPC qui changeait le state de la déclaration :

image

:new: Nouveau champ

Maintenant on a deux champs : private_notes_instruction et private_notes_visa.

Ces deux champs sont affichés en bas de chaque onglet - non seulement ceux de la décision. Lors de la modification de ces champs on envoie une requête PATCH sur l'endpoint REST /declarations/.

Pourquoi deux migrations ?

Afin de ne pas perdre l'info de l'ancien champ private_notes on a du faire une première migration de renommage de champ (vers private_notes_instruction) et une autre d'ajout du nouveau champ - sinon Django pense qu'il s'agit d'une suppression. J'aurais pu merger ces deux migrations mais j'ai préféré être explicite.

:key: Changement de permissions et serialiser

Le fait que maintenant on utilise l'endpoint REST pour modifier les notes privées fait que les instructrices et viseuses ont la permission de modifier une déclaration : donc d'y accéder avec des methods dites non SAFE (PATCH, PUT, etc).

Le serializer dynamiquement fait l'ajout des champs private_notes_instruction et private_notes_visa en dépendant des rôles de la personne qu'y accède de forme à s'assurer que l'instructrice ne peut pas modifier le champ de la viseuse et vice-versa.

:paintbrush: Changement de UI

Désormais les champs sont affichés en bas de chaque onglet et non seulement à la fin.

Le changement déclenche une requête pour sauvegarder le commentaire (avec un debounce pour éviter d'avoir une requête qui sort à chaque caractère tapé).

Démo

Du côté de l'instruction :

https://github.com/user-attachments/assets/9a0ee617-8c72-43c5-a71c-5030a33655cf

Du côté du visa :

https://github.com/user-attachments/assets/c5b4f28b-701a-4088-9d8b-d6f01f2bf4fd

Après cet échange l'instructrice verrait aussi le commentaire de la viseuse :

image

hfroot commented 2 weeks ago

Petit commentaire - le contraste sur les champs disabled est pas fort, alors si les instructrices/viseurs utilisent des écrans un peu vieux ça pourrait être difficile à lire le commentaire. L'alternatif c'est de fournir le texte en p ?

alemangui commented 2 weeks ago

@hfroot vu que c'est le champ DSFR qui fournit ces options je propose deux options :

En tout cas selon moi c'est hors scope de cette PR car seraient affectées toutes les instances du DSFRInput disabled