# Quick List Object View

Module Dolibarr — ouvre la fiche d'un objet **dans une boîte de dialogue**, depuis sa
liste, sans quitter la page ni perdre les filtres en cours.

## Pourquoi

Consulter une fiche depuis une liste filtrée coûte deux navigations : on ouvre, on
revient, et selon les cas on retrouve la liste dans son état ou pas. Une icône posée
à côté de la référence ouvre la fiche par-dessus la liste. On ferme, la liste est
toujours là, filtres intacts.

## Ce qu'il remplace

Un patch du cœur Dolibarr appliqué sur trois fichiers
(`compta/facture/list.php`, `comm/propal/list.php`, `ticket/list.php`), à
réappliquer à chaque montée de version — et dont les trois copies avaient divergé,
l'une d'elles ayant perdu son `DOL_URL_ROOT`.

**Aucun fichier du cœur n'est modifié.**

## Comment ça marche

Dolibarr appelle un hook à l'intérieur de `getNomUrl()`, la méthode qui fabrique le
lien d'un objet. Ce hook **ajoute** au lien existant quand il renvoie `0` — il ne le
remplace que s'il renvoie davantage.

Le module s'y branche et y ajoute son icône. Le placement est donc décidé par PHP, au
moment où la page est construite :

- rien n'est ajouté au tableau, aucune colonne, aucun décalage possible ;
- pas de sélecteur CSS à faire correspondre, donc rien qui casse quand le cœur ajoute
  une icône à la cellule de référence ;
- rien ne bouge après l'affichage, donc pas de scintillement.

Le JavaScript ne sert plus qu'à ouvrir la boîte de dialogue.

Ce hook est présent, et en mode « ajout », dans **les 28 classes d'objets** couvertes.

## Objets couverts

28 listes, activables **une par une** depuis la configuration :

facture client, proposition, commande client, contrat, intervention, expédition,
demande de prix fournisseur, commande fournisseur, facture fournisseur, tiers,
contact, produit/service, projet, tâche, ticket, adhérent, note de frais, congé,
événement agenda, nomenclature, ordre de fabrication, immobilisation, base de
connaissance, utilisateur, entrepôt, lot/série, poste à pourvoir, évaluation.

Un objet dont le module Dolibarr est désactivé est affiché comme tel, sans
interrupteur : sa liste n'est de toute façon pas atteignable.

## Configuration

Accueil → Configuration → Modules → Quick List Object View → ⚙

| Constante | Rôle | Défaut |
|---|---|---|
| `QUICKLISTOBJECTVIEW_<OBJET>` | active la liste concernée | `1` pour INVOICE, PROPAL, TICKET |
| `QUICKLISTOBJECTVIEW_EVERYWHERE` | affiche aussi l'icône hors des listes | `0` |
| `QUICKLISTOBJECTVIEW_PICTO` | picto de l'icône | `fa-eye` |

`getNomUrl()` s'exécute **partout** où un objet est affiché en lien : fiches, blocs
d'objets liés, résultats de recherche. Par défaut l'icône est donc restreinte à la
page de liste de l'objet ; `EVERYWHERE` lève cette restriction.

À la première activation, les trois listes que couvrait le patch du cœur sont
activées d'office, pour que le remplacement soit invisible côté utilisateurs.

## Notes techniques

- **Chargement du script.** Le fichier est livré par `module_parts['js']` et écrit en
  DOM natif, sans jQuery au chargement : Dolibarr injecte les js de module **avant**
  jQuery, et un `jQuery(...)` de premier niveau y lève une erreur qui fait abandonner
  le fichier entier — icônes dessinées, plus rien qui réponde au clic.
- **Repli.** jQuery UI est vérifié au moment d'ouvrir le dialogue. S'il est absent, la
  fiche s'ouvre normalement.
- **Modificateurs.** `Ctrl`/`Cmd`/`Maj`/`Alt`+clic et le clic du milieu sont laissés
  au navigateur : ouvrir dans un nouvel onglet continue de fonctionner.
- **Export CSV.** L'icône est omise quand `exportlistincsv` est présent, sinon elle
  finirait dans le fichier exporté.
- **Contextes de hook.** Déclarés à `'all'`, comme le documente le descripteur du
  cœur. Nommer les contextes à la main est un piège : plusieurs pages passent à
  `initHooks()` un nom différent de leur `$contextpage`, et un contexte qui ne
  correspond à aucune page est indistinguable d'une page que personne n'ouvre.
- **Table des objets.** Les noms d'`element`, la présence du hook et son comportement
  d'ajout ont été relevés dans les sources Dolibarr pour les 28 classes, et vérifiés
  identiques en v23 et v24.

## Compatibilité

| | |
|---|---|
| Dolibarr | 18.0 et supérieur — déployé en 18.0.4 et 23.0.1, sources vérifiées en 24.0 |
| PHP | 7.1 minimum — validé en 7.4 et 8.1 |
| Fichiers du cœur modifiés | aucun |
| Tables créées | aucune |

## Historique

- **3.0.0** — l'icône est posée côté serveur par le hook `getNomUrl`. Plus de colonne
  ajoutée, plus de déplacement en JavaScript, plus de nettoyage. Option de
  restriction aux pages de liste.
- **2.0.0** — suppression de la colonne, clic intercepté sur le lien existant.
- **1.0.0** — colonne ajoutée en fin de ligne puis déplacée par script.

## Licence

GPL v3 ou supérieure.
