11 KiB
Analyse de compatibilite SAO / AG Grid
Objectif
Evaluer si la vue tree de SAO peut etre rendue compatible avec une grille open source gratuite, en particulier AG Grid Community, sans React, en JavaScript pur.
Conclusion courte
Oui, c'est faisable, mais pas comme un simple remplacement visuel de <table> par AG Grid.
La vue tree actuelle de SAO embarque a la fois:
- le rendu HTML du tableau
- la logique de selection
- l'expansion arborescente
- l'edition inline
- des widgets de cellule lies aux champs Tryton
- le tri
- les colonnes optionnelles
- les boutons d'action
- le drag-and-drop
- les chargements asynchrones de champs
La bonne approche est donc de creer une couche d'adaptation entre:
- le modele Tryton/SAO existant
- et un moteur de rendu "grid"
Autrement dit: il faut decoupler Sao.View.Tree de son rendu DOM actuel, puis brancher AG Grid comme renderer alternatif.
Ce que fait aujourd'hui la vue tree
1. Parsing XML des colonnes
La vue tree est construite depuis le XML Tryton via Sao.View.TreeXMLViewParser, qui instancie des colonnes specialisees selon attributes.widget.
References:
tryton-sao.js:21678Sao.View.TreeXMLViewParsertryton-sao.js:24807Sao.View.TreeXMLViewParser.WIDGETS
Implication:
- la definition des colonnes est deja structuree
- c'est un bon point d'entree pour produire des
columnDefsAG Grid
2. La vue Tree est tres couplee au DOM table
Sao.View.Tree construit directement:
div.tree-containertablecolgrouptheadtbodytfoot
References:
tryton-sao.js:21755tryton-sao.js:21796tryton-sao.js:21803tryton-sao.js:21810tryton-sao.js:21908
Implication:
- aujourd'hui,
Treen'est pas un controleur de donnees avec un renderer interchangeable - c'est deja le renderer
3. Les lignes encapsulent elles aussi rendu + comportement
Sao.View.Tree.Row construit chaque <tr> et tous les <td>, gere les clics, doubles clics, la selection, l'expansion, et le rendu cellule par cellule.
References:
tryton-sao.js:23219Sao.View.Tree.Rowtryton-sao.js:23270_constructtryton-sao.js:23378redrawtryton-sao.js:23528toggle_rowtryton-sao.js:23536expand_rowtryton-sao.js:23575expand_children
Implication:
- remplacer seulement
tablene suffit pas - il faut aussi contourner ou remplacer
Row
4. Le rendu cellule depend fortement des classes Column
Chaque type de colonne sait:
- charger les donnees au besoin
- formatter la valeur
- masquer selon l'etat du champ
- ouvrir des liens Tryton
- afficher des icones/prefixes/suffixes
- gerer des actions particuliere
References:
tryton-sao.js:24089Sao.View.Tree.CharColumntryton-sao.js:24204BooleanColumntryton-sao.js:24239Many2OneColumntryton-sao.js:24365SelectionColumntryton-sao.js:24630BinaryColumntryton-sao.js:24755ButtonColumn
Implication:
- ces classes sont reutilisables
- mais aujourd'hui elles renvoient surtout du DOM jQuery, pas des objets de configuration AG Grid
5. L'edition inline repose sur les widgets Form existants
L'edition tree editable utilise Sao.View.EditableTree.*, qui reutilise les widgets formulaire SAO dans les cellules.
References:
tryton-sao.js:23737Sao.View.Tree.RowEditabletryton-sao.js:24834Sao.View.EditableTree
Implication:
- c'est une excellente nouvelle pour un POC
- on peut probablement injecter ces widgets dans des
cellEditor/cellRendererAG Grid custom - mais il faudra un pont entre le cycle de vie AG Grid et le cycle de vie jQuery/SAO
Fonctionnalites compatibles assez directement
Faisable avec une couche d'adaptation raisonnable
- affichage tabulaire
- tri simple sur colonne
- affichage/masquage de colonnes
- selection simple ou multiple
- rendu des types de base: texte, nombre, booleen, date, selection
- boutons de ligne
- copier les lignes selectionnees
Pourquoi:
- SAO a deja les meta-donnees de colonnes
- AG Grid sait tres bien rendre et mettre a jour ces cas
Fonctionnalites plus sensibles
1. Arborescence
SAO gere le mode arbre via children_field, expansion paresseuse et chemins de lignes.
References:
tryton-sao.js:21836tryton-sao.js:23479tryton-sao.js:23575
Risque:
- il faut mapper cela soit sur le mode tree data AG Grid, soit sur un flattening manuel
- le comportement exact Tryton devra etre conserve, surtout avec chargement lazy
2. Edition inline riche
Le flux actuel depend de:
- validation Tryton
- focus clavier
- navigation tab/up/down/enter
- creation de nouvelle ligne a la volee
- sauvegarde conditionnelle
References:
tryton-sao.js:23122save_rowtryton-sao.js:23163edit_rowtryton-sao.js:23893key_press
Risque:
- AG Grid a son propre cycle d'edition
- si on force trop AG Grid, on peut casser le comportement SAO historique
3. Chargement asynchrone champ par champ
Le rendu actuel charge les champs a la demande:
record.load(...)- puis rendu de cellule
References:
tryton-sao.js:23204tryton-sao.js:24120tryton-sao.js:24681
Risque:
- AG Grid prefere un modele de
rowDatadeja exploitable - il faudra soit pre-hydrater les lignes, soit supporter des renderers asynchrones
4. Drag-and-drop
Le drag-and-drop actuel est tres metier:
- reordonnancement
- changement de parent
- mise a jour des groupes Tryton
- sequence
References:
tryton-sao.js:22193_add_drag_n_droptryton-sao.js:22229drag_data_received
Risque:
- il vaut mieux le repousser a une phase 2
5. Sommes de colonnes
Les aggregats sont calcules cote SAO avec prise en compte de la selection.
References:
tryton-sao.js:23000tryton-sao.js:22799
Risque:
- simple a refaire
- mais il faut decider si l'on garde le footer SAO ou si l'on utilise un footer AG Grid
Niveau de couplage actuel
Le couplage le plus fort est ici:
Treeconstruit la structure HTML completeRowconstruit la structure HTML de chaque ligneColumn.render()renvoie des fragments DOM jQueryEditableTreesuppose une presence directe dans le DOM de la cellule
Donc:
- brancher AG Grid directement dans
Sao.View.Treesans abstraction serait fragile - mieux vaut introduire une interface de rendu
Architecture recommandee
Option A: remplacement direct de Sao.View.Tree
Creer Sao.View.AGGridTree qui:
- reutilise
TreeXMLViewParser - produit des
columnDefs - produit des
rowData - delegue a AG Grid pour le rendu
- conserve les appels metier SAO sur
screen,record,field
Avantages:
- architecture propre
- bon potentiel a long terme
Inconvenients:
- investissement initial important
- beaucoup de points de compatibilite a reproduire
Verdict:
- meilleur choix si vous voulez un vrai basculement progressif vers une grid moderne
Option B: mode hybride avec adaptateur de cellules
Conserver Sao.View.Tree comme source de verite fonctionnelle, mais:
- remplacer le rendu des lignes par AG Grid
- encapsuler les
Column.render()existants dans descellRenderer - encapsuler
EditableTree.*dans descellEditor
Avantages:
- permet un POC plus vite
- reutilise plus de logique existante
Inconvenients:
- couche d'adaptation plus complexe
- risque de double logique DOM
Verdict:
- meilleur choix pour prouver la faisabilite rapidement
Option C: simple relooking du tableau actuel
Ne pas utiliser AG Grid, seulement moderniser la table SAO actuelle.
Verdict:
- utile pour du cosmetique
- ne repond pas a l'objectif
Recommandation concrete
Je recommande une strategie en 3 phases.
Phase 1: abstraction minimale
Introduire une couche d'adaptation dans SAO:
TreeDataAdapterTreeColumnAdapterTreeSelectionAdapter
But:
- separer les donnees et comportements du rendu HTML actuel
Phase 2: POC AG Grid Community
Cibler uniquement:
- vue tree non hierarchique
- non editable dans un premier temps
- tri
- selection
- affichage/masquage colonnes
- boutons simples
- rendu texte/nombre/date/booleen/selection
Ne pas viser tout de suite:
- tree data
- drag-and-drop
- edition inline riche
- aggregats complexes
Phase 3: extension progressive
Ajouter ensuite:
- edition inline
- tree data
- aggregates
- drag-and-drop
- compatibilite complete des widgets speciaux
POC minimal realiste
Le plus petit POC utile serait:
- Ajouter AG Grid Community dans
index.html - Introduire une option de feature flag, par exemple:
Sao.config.use_ag_grid
- Si activée et si la vue est
treesanschildren_fieldet sanseditable:- construire une vue AG Grid
- Mapper les colonnes SAO vers
columnDefs - Mapper
screen.groupversrowData - Reconnecter:
- clic ligne ->
screen.current_record - double clic ->
screen.row_activate() - tri ->
screen.orderpuisscreen.search_filter(...)
- clic ligne ->
Mapping propose
Colonnes SAO -> AG Grid
attributes.name->fieldattributes.string->headerNamecolumn.sortable->sortablecolumn.attributes.width->widthcolumn.attributes.readonly->editable: falsecolumn.render(...)->cellRenderer
Lignes SAO -> AG Grid
Chaque ligne doit garder:
- le
recordTryton original - un
id - des valeurs calculees affichables
Exemple de forme:
{
__record: record,
__id: record.id,
customer: "...",
amount: "...",
state: "..."
}
Important:
- ne pas perdre la reference vers
record, car toute la logique SAO en depend
Points d'attention AG Grid
D'apres la documentation officielle AG Grid:
- AG Grid Community existe bien en JavaScript pur
- elle peut etre instanciee sans React avec
agGrid.createGrid(...) - elle peut etre chargee par bundle/CDN
Sources:
- https://www.ag-grid.com/javascript-data-grid/getting-started/
- https://www.ag-grid.com/javascript-data-grid/installation/
Inference:
- techniquement, votre environnement SAO charge deja des librairies JS globales via
index.html, donc l'integration sans React est coherent avec l'architecture actuelle
Risques principaux
Risque 1: regressions fonctionnelles
Le danger n'est pas le rendu brut, mais les details de comportement Tryton:
- selection exacte
- edition
- navigation clavier
- chargement lazy
- etats invisibles/readonly
Risque 2: dette de double implementation
Pendant la transition, vous aurez probablement:
- la vue tree legacy
- la vue tree AG Grid
Il faut donc mutualiser au plus vite:
- les colonnes
- l'acces aux valeurs
- la selection
Risque 3: AG Grid Community vs besoins reels
Certaines fonctions avancees existent surtout en Enterprise selon les versions et editions.
A verifier au moment du POC, fonctionnalite par fonctionnalite, sans supposer que tout le comportement tree legacy est couvert nativement.
Estimation honnete
Faisabilite
- POC non editable, liste plate: elevee
- grille utilisable sur plusieurs vues simples: bonne
- compatibilite complete avec toutes les vues tree SAO: moyenne a difficile
Cout relatif
- POC: faible a moyen
- integration propre: moyen
- remplacement complet: eleve
Recommendation finale
Oui, il est pertinent de tenter AG Grid Community en JavaScript pur, mais il faut:
- commencer par les vues tree plates
- introduire un adaptateur plutot qu'un remplacement brutal
- traiter l'edition inline et l'arborescence dans un second temps
Le meilleur prochain pas est de realiser un POC isole sur:
- une vue tree non editable
- sans
children_field - avec 3 a 5 types de colonnes
- selection + tri + double-clic ouverture
Si ce POC marche bien, on pourra ensuite brancher l'edition et les widgets complexes.