Pour des besoins de saisie / recherche / modification de données complexes, une datagrid simple et rapide à mettre en place est indispensable. Après quelques recherches, on s'aperçoit rapidement que l'offre des datagrid sur mootools est très réduite. La seul Grid qui sort du lot à mon goût est celle d'omindatas : omnigrid. Cependant malgré la simplicité du concept, on se retrouve très vite limité dans les évolutions et l'ajout de fonctionnalités.

C'est donc de ce constat qu'est née GridSolution, une grille orientée objet de manipulation de données.

Ce script n'en est qu'à ses prémisses mais s'avère assez prometteur.

Les objectifs pour une première version tagguée "stable" sont :

- pouvoir instancier des groupes de colonnes :

  1. var myGroup = new GridSolutionGroup({
  2. label : 'my group',
  3. isResizable : true,
  4. cssClass : 'group'
  5. });

- pouvoir instancier des colonnes :

  1. var myColumn = new GridSolutionColumn({
  2. label : 'id',
  3. model : 't.id', // => alias du modèle de données
  4. cssClass : 'right',
  5. sortable : true, //=> autorise le classement vertical
  6. width : 40
  7. });

- grouper des colonnes :

  1. myGroup.options.columns = [myColumn];

- instancier la grille :

  1. window.addEvent("domready", function(){
  2. var datagrid = new GridSolution($('mygrid'), {
  3. showHeader : true,
  4. resizeColumns : true,
  5. selectRow : true,
  6. sortOn : 'id',
  7. sortBy : 'DESC',
  8. getDataUrl : 'getData.php',
  9. getDataMethod : 'post',
  10. page : 1,
  11. perPageOptions : [10, 15, 20, 50],
  12. perPage : 20,
  13. header : myGroup,
  14. height : 300,
  15. imagesPath : '/grid/sfGridSolutionPlugin/images'
  16. });
  17. });

- filtrer les colonnes par type de données :

  1. var myColumns = new GridSolutionColumn({
  2. label : 'Sended at',
  3. model : 't.charging_at',
  4. filterable : true, // => initialise le filtre
  5. dataType : 'dateTime', // => génère un dateTimePicker
  6. sortable : true,
  7. width : 200,
  8. tip : ''
  9. });

filter.png

- éditer les lignes de façon asynchrone :

  1. myColumn.options.editable = true;
  2. datagrid.options.setDataUrl = 'setData.php';

- affichage des erreurs renvoyées par le serveur :

validator.png

- afficher le détail d'une ligne :

expend.png

- une manipulation des données orientées opérateurs de saisies (100% manipulable sans le pointeur de la souris).

Ce sont les fonctionnalités actuellement présentes sur la version de développement.

Pour le date picker, j'ai choisi datepicker, mais ce choix reste sous réserve pour des questions de compatibilité IE6 (/performances) et d'ergonomie (il n'est pas 100% navigable au clavier).

Je vous laisse faire un tour sur la démo en attendant une version stable et téléchargeable sous license MIT qui devrait voir le jour début septembre après arrêt des nouvelles fonctionnalités, débug, tests et optimisations du code. A noter qu'en parallèle, un plugin pour symfony / doctrine est en cours de réalisation pour permettre des développements rapides d'interfaces complexes.