Skip to content

[Agent] Extract Rdvs#show as a a separate page + versions history with associations

Vincent Agnano requested to merge feature/rdv-show-with-history into master

Created by: adipasquale

cf https://trello.com/c/Of8YVaXo/469-agent-affichage-de-lhistorique-des-modifications-dun-rdv

Screenshot 2020-05-06 at 09 49 02

PR a lire commit par commit :

1. extract RDV show from sidebar to dedicated page

  • Le formulaire du statut devient "normal" avec un bouton submit, plus de magie d'auto-soumission
  • Changement du comportement du calendrier : il se souviendra maintenant de la date de début du calendrier courant. Si on avance de 3 semaines, qu'on change de page puis qu'on revient, on revient maintenant à cette semaine. Cette date est stockée dans le sessionStorage, elle sera oublié lors de la prochaine session de visite de l'agent. Le type de vue du calendrier (jour/mois/semaine) est lui déjà stocké dans le localStorage, jamais nettoyé

2. Store has many associations in rdv versions virtual attributes

Pour historiser les agents et users associés à un RDV il n'y a pas de solution simple. J'ai essayé d'utiliser la gem supplémentaire https://github.com/westonganger/paper_trail-association_tracking mais elle ne répond pas vraiment à ce besoin. Elle permet surtout de faire le lien entre les versions stockées, mais ne facilite pas l'affichage d'un historique unifié au niveau du modèle parent (le Rdv pour nous). Si on l'utilise, il faudrait "merger" les historiques du Rdv, des RdvsUsers et des AgentsRdvs ensemble pour arriver à un historique cohérent.

J'ai adopté une autre solution, un peu plus "custom" mais plus évolutive. J'introduis un champ virtual_attributes de type json dans la table versions. on peut facilement y stocker des metadonnées supplémentaires a chaque creation de version. Pour les rdvs j'y stocke deux sous-champs : user_ids et agent_ids, les tableaux d'IDs. ️ on y stocke des snapshots de ces champs, pas des diffs avec la version précédente. C'est l'approche standard PaperTrail. Le diff est calculé lors de l'affichage des versions, cf commit suivant

Pour une raison inconnue, le touch ne se fait pas bien lorsqu'un objet de la table de jointure RdvUser ou AgentRdv est supprimé. Or ce touch est necessaire pour declencher la creation d'une version dans la table parente (Rdv). J'ai donc rajouté un touch manuel dans le Agents::RdvsController#update mais c'est sous-optimal.

3. Display RDV paper trail versions and virtual attributes

  • Le bloc historique est chargé sur demande en ajax pour garder une page Agents::Rdvs#show rapide.
  • Je stocke le fait que le bloc historique soit déplié dans le anchor de l'url #history, et je l'affiche automatiquement au chargement s'il est présent
  • la partie compliquée est dans le PaperTrailAugmentedVersion ou on calcule les changements 'virtuels' c'est a dire le diff entre les virtual_attributes de deux versions successives. Je surcharge la class PaperTrailVersion en gardant la meme signature avec des changes.
  • Le PaperTrailHelper est un peu compliqué, mais son comportement est en fait relativement simple cf ses tests. Il peut être écrit de manière beaucoup plus courte et condensé, mais la complexité cyclomatique était importante et rubocop le soulevait à juste titre. J'ai utilisé le pattern de spécialisation (je crois) mais si vous avez d'autres sugggestions n'hesitez pas

Merge request reports