# 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 `
| `, gere les clics, doubles clics, la selection, l'expansion, et le rendu cellule par cellule. References: - `tryton-sao.js:23219` `Sao.View.Tree.Row` - `tryton-sao.js:23270` `_construct` - `tryton-sao.js:23378` `redraw` - `tryton-sao.js:23528` `toggle_row` - `tryton-sao.js:23536` `expand_row` - `tryton-sao.js:23575` `expand_children` Implication: - remplacer seulement `table` ne 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:24089` `Sao.View.Tree.CharColumn` - `tryton-sao.js:24204` `BooleanColumn` - `tryton-sao.js:24239` `Many2OneColumn` - `tryton-sao.js:24365` `SelectionColumn` - `tryton-sao.js:24630` `BinaryColumn` - `tryton-sao.js:24755` `ButtonColumn` 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:23737` `Sao.View.Tree.RowEditable` - `tryton-sao.js:24834` `Sao.View.EditableTree` Implication: - c'est une excellente nouvelle pour un POC - on peut probablement injecter ces widgets dans des `cellEditor` / `cellRenderer` AG 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:21836` - `tryton-sao.js:23479` - `tryton-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:23122` `save_row` - `tryton-sao.js:23163` `edit_row` - `tryton-sao.js:23893` `key_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:23204` - `tryton-sao.js:24120` - `tryton-sao.js:24681` Risque: - AG Grid prefere un modele de `rowData` deja 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_drop` - `tryton-sao.js:22229` `drag_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:23000` - `tryton-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: 1. `Tree` construit la structure HTML complete 2. `Row` construit la structure HTML de chaque ligne 3. `Column.render()` renvoie des fragments DOM jQuery 4. `EditableTree` suppose une presence directe dans le DOM de la cellule Donc: - brancher AG Grid directement dans `Sao.View.Tree` sans 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 des `cellRenderer` - encapsuler `EditableTree.*` dans des `cellEditor` 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: - `TreeDataAdapter` - `TreeColumnAdapter` - `TreeSelectionAdapter` 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: 1. Ajouter AG Grid Community dans `index.html` 2. Introduire une option de feature flag, par exemple: - `Sao.config.use_ag_grid` 3. Si activée et si la vue est `tree` sans `children_field` et sans `editable`: - construire une vue AG Grid 4. Mapper les colonnes SAO vers `columnDefs` 5. Mapper `screen.group` vers `rowData` 6. Reconnecter: - clic ligne -> `screen.current_record` - double clic -> `screen.row_activate()` - tri -> `screen.order` puis `screen.search_filter(...)` ## Mapping propose ### Colonnes SAO -> AG Grid - `attributes.name` -> `field` - `attributes.string` -> `headerName` - `column.sortable` -> `sortable` - `column.attributes.width` -> `width` - `column.attributes.readonly` -> `editable: false` - `column.render(...)` -> `cellRenderer` ### Lignes SAO -> AG Grid Chaque ligne doit garder: - le `record` Tryton original - un `id` - des valeurs calculees affichables Exemple de forme: ```js { __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. |