[Agent] Extract Rdvs#show as a a separate page + versions history with associations
Created by: adipasquale
cf https://trello.com/c/Of8YVaXo/469-agent-affichage-de-lhistorique-des-modifications-dun-rdv
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.
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 lesvirtual_attributes
de deux versions successives. Je surcharge la classPaperTrailVersion
en gardant la meme signature avec deschanges
. - 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