Skip to content

Mécanisme de lien vers le dossier suivant

Pierre de La Morinerie edited this page Sep 5, 2018 · 2 revisions

ETQ Instructeur, il est pénible actuellement de devoir retourner sur la liste des dossiers, trouver la bonne page de la liste et cliquer sur le dossier, et recommencer à chaque fois.

Exemples à trouver

Solution envisagée

Meilleure solution (selon MMA)

Sur la liste des dossiers, liens vers les dossiers contiennent en paramètre le contexte de la liste (nom de l'onglet + page). Ces paramètres sont conservés entre les différents onglets du dossier en repassant dans les helpers de lien ces paramètres.

Au final, si ces paramètres sont présents, un bouton supplémentaire 'retour à la liste' est affiché pour retourner au bon endroit dans la liste.

Avantages

  • Contexte clair associé à chaque page
  • Absence de comportement magique / absence d'effet de bord

Inconvénients

  • Il faut propager les params sur tous les liens et bouton d'action
  • L'instructeur doit repasser par la liste pour aller au dossier suivant, mais il peut le faire quand meme si on veut, donc ça va

Meilleure solution (selon SLE)

  1. Les liens de la liste triée filtrée des dossiers, sont de la forme procedures/x/dossiers/12[/messagerie|/annotations-privees|...]?search={ filter: [{ table: t, column: c, value: v }], order:{ table: t, column: c, order: o }}

  2. Le serveur serialize cette recherche dans la page html pour stockage en session storage (pour que ce contexte ne soit pas partagé entre les onglets)

sessionStorage.setItem('search_context', JSON.stringify({ search: { filter: [...], order: {...} }, current_id: 12));

  1. coté client, si la clé search_context existe en sessionStorage, les boutons dossier précédent et dossier suivant sont ajoutés dynamiquement dans la page ainsi que le contexte de recherche. Le lien du bouton suivant sera

/procedures/x/dossiers/12/next?search={ filter: [...], order: {...} }

  1. coté controller, pseudo code pour trouver le dossier suivant
current_id = 12
searched_ids = procedure.dossiers.where(...).order(...) # [1, 2, 4, 15, 26]
ordered_ids = procedure.dossiers.order(...) # [1, 3, 12, 13, 15, 26]
bigger_than_current_ids = ordered_ids.slice((ordered_ids.index(current_id) + 1)..-1) # [13, 15, 26]
next_id = (bigger & search_ids)[0] # [15, 26][0] TODO: next == nil

le serveur retourne le dossier next_id et sérialise dans la page le nouveau contexte de recherche.

Avantages

  • Possibilité d'aller directement au dossier suivant/précédent depuis le dossier en cours
  • L'ordre des dossiers suivants et précédents est calculé selon l'ordre de la recherche
  • Les dossiers affichés appartiennent toujours au résultat de la recherche
  • Le contexte de recherche est uniquement sauvegardé dans l'onglet en cours, ce qui permet d'avoir plusieurs contextes de recherche différents dans différents onglets

Inconvénients

  • problème potentiel au niveau de la taille des urls transmettant le contexte de recherche ... possibilité de transmettre uniquement un id de contexte qui aura été préalablement sauvegardé en base mais qui rend l'url moins compréhensible
Clone this wiki locally