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

[SYNTHESE][FRONTEND] Evolution / amélioration du routing frontend pour l'information d'une observation #3155

Open
andriacap opened this issue Aug 19, 2024 · 6 comments
Labels

Comments

@andriacap
Copy link
Contributor

Version
Version de GN depuis que la modale "Information sur l'observation" existe.

Description de l'état actuel
Le fonctionnement actuel est l'ouverture d'une modale "Information sur l'observation" lorsqu'on clique sur l'icone "i" dans le tableau des observations du module synthese . Le chemin associé reste "https://demo.geonature.fr/geonature/#/synthese" .

Discussion
Dans le cadre d'évolution / amélioration de l'utilisation des informations liées à une observation (notamment dans le cadre du projet initié avec l'ARB IDF) , est ce qu'il serait envisageable d'associer les informations d'une observation à une route définie coté frontend .
Implémentation d'une nouvelle route ici :

const routes: Routes = [
{ path: '', component: SyntheseComponent },
{ path: 'occurrence/:id_synthese', component: SyntheseComponent, pathMatch: 'full' },
{ path: 'taxon/:cd_nom', component: TaxonSheetComponent },

Comment reproduire

Images concernant le parcours utilisateurs depuis le module de synthese pour afficher la modale

image

image

@andriacap andriacap added the bug label Aug 19, 2024
@camillemonchicourt
Copy link
Member

C'est pas ce qu'on a déjà avec les permaliens vers les fiches détail d'une observation ?
Exemple : https://demo.geonature.fr/geonature/#/synthese/occurrence/9934

@andriacap
Copy link
Contributor Author

andriacap commented Aug 20, 2024

Yes effectivement , à l'initialisation du composant Synthese.component.ts il y a une vérification de la route appelée pour savoir s'il y a un id_synthese de renseigner et si c'est le cas alors la modale est ouverte.

Du coup , l'idée est de réfléchir à ajouter des enfants à cette route de type :tab (ou les définir explicitement) pour pouvoir gérer des événements clients qui souhaiteraient atterir directement sur l'onglet souhaité.

Soit ça :

{
    path: 'occurrence/:id_synthese',
    component: SyntheseComponent,
    children: [
      {
        path: 'details',
        component: SyntheseComponent, 
        data: { tabIndex: 0 }
      },
      {
        path: 'metadata',
        component: SyntheseComponent,
        data: { tabIndex: 1 }
      },
      {
        path: 'taxonomie',
        component: SyntheseComponent,
        data: { tabIndex: 2 }
      },
      ......
    ]
  }

Ou alors du type :

 {
    path: 'occurrence/:id_synthese',
    component: SyntheseComponent,
    children: [
      {
        path: ':tab', // Chemin dynamique pour l'onglet
        component: SyntheseComponent,
      }
    ]
  }

et gérer le valeur de :tab directement au sein du composant SyntheseComponent en ajoutant la logique à la méthode openModal

openInfoModal(idSynthese) {
  const modalRef = this._ngModal.open(SyntheseInfoObsComponent, {
    size: 'lg',
    windowClass: 'large-modal',
  });
  modalRef.componentInstance.idSynthese = idSynthese;
  modalRef.componentInstance.header = true;
  modalRef.componentInstance.useFrom = 'synthese';

  // Extraire l'onglet à partir du paramètre de route
  const tab = this.route.snapshot.firstChild?.paramMap.get('tab');

  // On converti le nom de l'onglet en index ou on le passe directement s'il est numérique
  let tabIndex;
  switch (tab) {
    case 'details':
      tabIndex = 0;
      break;
    case 'metadata':
      tabIndex = 1;
      break;
    case 'taxonomie':
      tabIndex = 2;
      break;
    default:
      tabIndex = 0; // Par défaut, ouvrir le premier onglet si le paramètre est invalide
  }
  modalRef.componentInstance.activeTabIndex = tabIndex;
}

@TheoLechemia
Copy link
Member

Salut,

ça me va.
Juste voir si ce n'est pas possible d'avoir des label de "tab" plutôt que des index (plus robuste dans le temps et plus parlant au niveau de l'url)

@andriacap
Copy link
Contributor Author

andriacap commented Aug 26, 2024

Salut,

Du coup est ce qu'on s'appuierait sur un truc du genre (source: https://stackoverflow.com/questions/70690991/angular-mat-tabs-set-default-active-tab-based-on-label-get-label-index/76567715#76567715)

goToTabByLabel(label: string) {
  if (this.tabsgroup) {
    const tabs = (this.tabsgroup?._tabs as any)._results,
          match = tabs?.find(x => x.textLabel?.toUpperCase() === label.toUpperCase());

    if (match) {
      this.tabsgroup.selectedIndex = match.position;
    }
  }
}

Et ajouter un attribut à chaque onglet où on précise urlRoute pour associer chaque tab à des champs plus appropriés pour avoir des url associées ? Et comme ça on est pas dépendant de l'ordre des onglets

@TheoLechemia
Copy link
Member

Salut,

J’éviterais (quand c'est possible) d'utiliser les propriété privé des objets.
Est-ce qu'avec un petit tableau de nos "tabs" on pourrait pas s'en sortir :

public tabs = ["tab1", "tab2", "tab3"] -> qu'on utilise pour générer le HTML.

et le goToTabByLabel() utilise ce tabs plutot que (this.tabsgroup?._tabs as any)._results

@edelclaux
Copy link
Contributor

Salut,

J’éviterais (quand c'est possible) d'utiliser les propriété privé des objets. Est-ce qu'avec un petit tableau de nos "tabs" on pourrait pas s'en sortir :

public tabs = ["tab1", "tab2", "tab3"] -> qu'on utilise pour générer le HTML.

et le goToTabByLabel() utilise ce tabs plutot que (this.tabsgroup?._tabs as any)._results

La correspondance label <--> index peut-être faite en se basant sur la position dans le tableau. Mais côté html, comment tu fais pour respecter l'ordre du tableau ? Je suis pas convaincu par les différentes solutions que je vois

  • l'appel à la rigueur des devs, c'est risqué :D
  • un for + switch, c'est pas joli joli.
  • un truc avec des ng-container et ng-template, ça me parait délicat. Il y a des liens mat-tab, etc. qui vont en pâtir sûrement.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants