Un tempo i siti venivano impaginati tramite le tabelle, oggi le tabelle le impagini dentro ai siti! Mi sono trovato nelle condizioni di dover scrivere un applicazione web che presenta un gran numero di dati, che per loro stessa natura devono essere disposti all'interno di tabelle. Non sono più avvezzo alle tabelle da quando produco siti in XHTML, e mi sono scontrato con tutti i loro limiti e difetti. Ho trovato però un valido alleato: OpenRico. Si tratta di un framework javascript, che tra le altre cose gestisce le tabelle in un modo che un paio di anni fa sarebbe stato considerato fantascienza.
Ma niente è meglio di un esempio:
| id | rag. sociale | tipo lic. | n. lic. | scad. ass. | log id | ultimo agg. | B | L | ultimo int. | data stipula |
|---|---|---|---|---|---|---|---|---|---|---|
| 75164794 | id 460327 | Full | 1 | 2008-08-31 00:00:00 | 21082 | 2008-07-15 09:57:08 | 1 | 2 | 2009-03-09 17:23:30 | |
| 364898682 | id 447571 | Top Class Pack | 1 | 2009-04-30 00:00:00 | 27254 | 2009-04-23 14:41:15 | 0 | 1 | 2009-04-21 11:25:43 | |
| 255706787 | id 201904 | Medium | 1 | 2006-06-30 00:00:00 | 0 | 2 | 2009-04-08 12:36:05 | |||
| 9307861 | id 250671 | Full | 1 | 2010-01-31 00:00:00 | 18917 | 2008-04-16 09:58:16 | 0 | 2 | 2009-04-20 10:53:36 | |
| 106170654 | id 964966 | Full | 1 | 2008-02-15 00:00:00 | 17260 | 2008-02-04 12:48:55 | 0 | 2 | 2008-10-10 15:14:08 | |
| 995513917 | id 309631 | Top Pack | 1 | 2009-04-23 00:00:00 | 0 | 1 | 2009-03-25 17:24:20 | |||
| 845306397 | id 593262 | Medium | 1 | 2007-04-19 00:00:00 | 0 | 2 | 2009-04-22 17:45:27 | |||
| 292266845 | id 218200 | Full | 1 | 2010-01-31 00:00:00 | 19545 | 2008-05-13 15:52:04 | 0 | 2 | 2008-05-13 15:15:23 | |
| 191864013 | id 430542 | 1 | 2007-09-15 00:00:00 | 12225 | 2007-06-11 12:09:03 | 0 | 2 | 2009-01-29 09:47:39 | ||
| 368316650 | id 70129 | Full | 1 | 2008-08-31 00:00:00 | 21620 | 2008-08-14 20:51:55 | 1 | 1 | 2008-07-29 10:40:55 | |
| 364593506 | id 320556 | Medium | 1 | 2006-12-01 00:00:00 | 0 | 2 | 2009-03-25 15:37:16 | |||
| 192413330 | id 459167 | Medium | 1 | 2007-03-15 00:00:00 | 9958 | 2007-03-14 16:23:51 | 1 | 2 | 2009-04-21 16:20:00 | |
| 82244873 | id 607056 | Top Pack | 1 | 2010-01-31 00:00:00 | 25340 | 2009-02-09 17:45:46 | 0 | 2 | 2009-04-09 12:56:50 | |
| 233306884 | id 479065 | Full | 1 | 2007-11-30 00:00:00 | 15259 | 2007-11-05 16:22:47 | 0 | 1 | 2007-11-05 12:52:46 | |
| 563568115 | id 133789 | 1 | 2007-04-30 00:00:00 | 11795 | 2007-05-23 09:46:46 | 0 | 2 | 2008-10-29 17:14:02 | ||
| 459747314 | id 723572 | Full | 1 | 2008-11-30 00:00:00 | 23509 | 2008-11-13 19:06:30 | 0 | 2 | 2008-11-13 17:03:34 | |
| 527313232 | id 244507 | Medium | 1 | 2007-02-28 00:00:00 | 10034 | 2007-03-19 10:22:31 | 1 | 2 | 2009-03-23 17:10:21 | |
| 340484619 | id 286438 | Medium | 5 | 2007-01-31 00:00:00 | 9057 | 2007-02-08 17:57:59 | 0 | 2 | 2009-04-16 10:31:55 | |
| 192230224 | id 782959 | 1 | 2007-06-15 00:00:00 | 13979 | 2007-09-12 17:18:59 | 0 | 2 | 2009-04-17 17:22:14 | ||
| 844268799 | id 761414 | Medium | 1 | 2010-01-31 00:00:00 | 0 | 2 | 2009-04-22 10:10:16 | |||
| 277069092 | id 92895 | Full | 1 | 2010-01-31 00:00:00 | 13357 | 2007-08-01 16:07:31 | 0 | 1 | 2009-03-26 12:31:54 | |
| 439849853 | id 242248 | Medium | 1 | 2007-09-30 00:00:00 | 0 | 2 | 2009-01-29 17:25:09 | |||
| 579833 | id 18066 | Full | 1 | 2007-11-30 00:00:00 | 14971 | 2007-10-23 16:40:05 | 1 | 2 | 2008-02-28 11:57:23 | |
| 95977783 | id 322693 | Full | 1 | 2008-03-30 00:00:00 | 17992 | 2008-03-07 09:33:32 | 0 | 2 | 2006-10-09 16:25:34 | |
| 81512451 | id 902222 | Top Pack | 1 | 2009-04-30 00:00:00 | 27043 | 2009-04-16 15:34:02 | 0 | 1 | 2009-04-01 16:31:55 | |
| 281402588 | id 96496 | 1 | 2007-06-04 00:00:00 | 12434 | 2007-06-18 12:56:52 | 1 | 2 | 2008-08-08 11:22:20 | ||
| 738616944 | id 589111 | Start | 2 | 2006-07-31 00:00:00 | 4874 | 2006-07-26 09:15:05 | 0 | 2 | 2009-04-08 11:09:34 | |
| 964874268 | id 157409 | 1 | 2007-03-30 00:00:00 | 11816 | 2007-05-23 17:00:24 | 0 | 2 | 2009-03-20 10:38:36 | ||
| 690643311 | id 422485 | Medium | 1 | 2008-10-31 00:00:00 | 26357 | 2009-03-20 17:33:09 | 0 | 2 | 2008-10-17 11:58:17 | |
| 615142822 | id 599182 | Full | 1 | 2008-09-15 00:00:00 | 21879 | 2008-09-03 10:23:24 | 0 | 2 | 2009-04-20 12:45:09 | |
| 156341552 | id 246093 | Medium | 1 | 2007-05-16 00:00:00 | 11206 | 2007-04-27 16:04:04 | 0 | 2 | 2009-02-17 16:05:58 | |
| 200958252 | id 15563 | Medium | 1 | 2007-08-10 00:00:00 | 13524 | 2007-08-14 16:21:18 | 0 | 2 | 2009-01-08 08:32:22 | |
| 854461670 | id 403686 | Full | 1 | 2010-01-31 00:00:00 | 16131 | 2007-12-07 17:43:33 | 0 | 2 | 2009-04-23 12:21:27 | |
| 191070556 | id 500305 | Medium | 1 | 2006-11-30 00:00:00 | 7171 | 2006-11-17 11:02:50 | 0 | 2 | 2008-12-19 11:34:49 | |
| 3753662 | id 739014 | Medium | 1 | 2006-09-15 00:00:00 | 5910 | 2006-09-25 18:00:39 | 1 | 2 | 2009-02-25 11:46:33 | |
| 554229736 | id 647156 | Full | 1 | 2010-01-31 00:00:00 | 15900 | 2007-11-29 17:21:53 | 0 | 1 | 2008-06-12 17:13:10 | |
| 322967529 | id 595825 | Medium | 1 | 2010-01-31 00:00:00 | 27230 | 2009-04-23 09:24:18 | 0 | 2 | 2009-03-03 16:13:11 | |
| 759185791 | id 549866 | 1 | 2007-05-31 00:00:00 | 12205 | 2007-06-09 12:51:50 | 0 | 2 | 2008-07-17 09:14:07 | ||
| 30853271 | id 817871 | Medium | 1 | 2008-04-30 00:00:00 | 18968 | 2008-04-17 10:28:25 | 0 | 2 | 2009-04-23 16:10:41 | |
| 774688721 | id 802185 | Medium | 1 | 2010-01-31 00:00:00 | 0 | 2 | 2009-04-17 15:18:35 | |||
| 846160889 | id 748902 | Medium | 1 | 2007-11-30 00:00:00 | 7126 | 2006-11-16 11:57:18 | 0 | 2 | 2009-04-22 15:00:30 | |
| 69488525 | id 497864 | Top Pack | 1 | 2009-03-27 00:00:00 | 26219 | 2009-03-15 15:50:04 | 0 | 1 | 2009-04-20 16:07:29 | |
| 987640381 | id 232666 | 1 | 2007-05-10 00:00:00 | 11568 | 2007-05-14 12:38:33 | 0 | 2 | 2009-04-23 15:30:34 | ||
| 612335205 | id 230652 | Medium | 1 | 2006-09-30 00:00:00 | 5448 | 2006-09-05 17:55:04 | 1 | 2 | 2008-07-22 10:35:27 | |
| 174041748 | id 612915 | Top Class Pack | 1 | 2009-04-23 00:00:00 | 26573 | 2009-03-27 12:16:30 | 0 | 1 | 2009-03-27 12:15:24 | |
| 871978760 | id 94299 | Medium | 5 | 2006-07-15 00:00:00 | 4761 | 2006-07-19 16:38:39 | 0 | 2 | 2007-01-24 12:00:03 | |
| 624114990 | id 733399 | Full | 1 | 2008-09-30 00:00:00 | 21892 | 2008-09-03 11:29:27 | 0 | 2 | 2009-04-23 16:35:21 | |
| 817169190 | id 682556 | Medium | 1 | 2007-07-31 00:00:00 | 13059 | 2007-07-17 14:47:55 | 0 | 2 | 2009-04-10 10:58:43 | |
| 56610107 | id 937867 | 1 | 2007-06-15 00:00:00 | 11833 | 2007-05-24 10:40:57 | 0 | 2 | 2008-12-12 08:47:35 | ||
| 916656495 | id 89172 | Medium | 1 | 2006-12-31 00:00:00 | 6285 | 2006-10-11 11:46:14 | 0 | 2 | 2007-01-25 16:17:41 | |
| 690277100 | id 70068 | Medium | 1 | 2006-07-31 00:00:00 | 0 | 2 | 2009-02-18 15:10:49 | |||
| 139190673 | id 907898 | Top Class Pack | 1 | 2009-03-15 00:00:00 | 25409 | 2009-02-12 09:22:07 | 1 | 1 | 2009-02-17 09:04:29 | |
| 243865967 | id 473755 | Medium | 1 | 2006-12-31 00:00:00 | 8022 | 2006-12-28 12:39:20 | 1 | 2 | 2009-04-10 12:31:49 | |
| 953521729 | id 232483 | Medium | 5 | 2006-09-20 00:00:00 | 5858 | 2006-09-22 15:59:47 | 0 | 2 | 2009-04-08 11:37:59 |
Ce n'è da sbizzarrirsi, una volta caricati i dati della tabella tramite PHP, AJAX, HTML o XML entra in gioco il javascript, che permette un'infinità di giochetti. In questo esempio ho usato l'ordinamento per colonna, i filtri, l'highlight delle righe ed i link condizionali. Oltre naturalmente alla possibilità di ridimensionare al volo le colonne ed al fatto che la tabella occupa una spazio prefissato. Non ultimo l'header resta fisso durante lo scrolling, risultato non banale se mai avete tentato di fare qualcosa di simile!
Il codice usato è relativamente poco, grazie all'ottimo framework OpenRico, che si appoggia su ProtoType. Inizio con l'inizializzazione di ciò che mi serve:
// Carico tutti gli elementi necessari
Rico.loadModule('LiveGrid','LiveGridMenu','gest.css');
// var orderGrid,buffer;
var CustId='1';
var CustIdCol=7;
Qui c'è la parte più succosa: definisco una classe che in seguito assegnerò alla variabile control, all'interno della definizione delle colonne. Questa classe indica a alla LiveGrid che le colonne interessate dovranno avere un determinato colore di sfondo ed un link condizionale, stabilito sulla base del contenuto di una colonna. Le classi predefinite in OpenRico sono disponibili nel file ricoLiveGridControls.js, e sono un ottimo punto di partenza per svilupparne di proprie.
// Creo la Classe - classi preesistenti in ricoLiveGridControls.js
HighlightCellAndLink = Class.create();
// Dichiaro la classe - si tratta di un misto tra due classi esistenti
HighlightCellAndLink.prototype = {
initialize: function(chkcol,chkval,highlightColor,highlightBackground,href,target) {
this._chkcol=chkcol;
this._chkval=chkval;
this._highlightColor=highlightColor;
this._highlightBackground=highlightBackground;
this._href=href;
this._target=target;
this._anchors=[];
},
_create: function(gridCell,windowRow) {
this._anchors[windowRow] = RicoUtil.createFormField(gridCell,'a',null,this.liveGrid.tableId+'_a_'+this.index+'_'+windowRow);
if (this._target) this._anchors[windowRow].target=this._target;
this._clear(gridCell,windowRow);
},
_clear: function(gridCell,windowRow) {
gridCell.style.color='';
gridCell.style.backgroundColor='';
this._anchors[windowRow].href='';
this._anchors[windowRow].innerHTML='';
},
_display: function(v,gridCell,windowRow) {
var gridval=this.liveGrid.buffer.getWindowValue(windowRow,this._chkcol);
var match=(gridval==this._chkval);
gridCell.style.color=match ? this._highlightColor : '';
gridCell.style.backgroundColor=match ? this._highlightBackground : '';
this._anchors[windowRow].innerHTML=this._format(v);
var getWindowValue=this.liveGrid.buffer.getWindowValue.bind(this.liveGrid.buffer);
this._anchors[windowRow].href=this._href.replace(/\{\d+\}/g,
function ($1) {
var colIdx=parseInt($1.substr(1));
return getWindowValue(windowRow,colIdx);
}
);
}
}
Infine dichiaro alcune variabili ed intervengo sul core della LiveGrid: definisco i parametri di ciascuna colonna.
Rico.onLoad( function() {
// Carico i dati della tabella dentro al Rico Buffer javascript
var buffer = new Rico.Buffer.Base($('dataTable').tBodies[0]);
// Preparo le opzioni
var grid_options = {
headingSort: 'hover',
highlightElem: 'cursorRow',
FilterLocation: -1,
visibleRows: 23,
saveColumnInfo: {width:false, filter:false, sort:false},
columnSpecs: [
{
height:50,
width:113,
filterUI:'t^20',
control:new Rico.TableColumn.HighlightCell(CustIdCol,CustId,'black','#FBC880')
}, // id
{
width:185,
filterUI:'t^20',
control:new Rico.TableColumn.HighlightCell(CustIdCol,CustId,'black','#FBC880')
}, // Rag. sociale
{
width:78,
filterUI:'t^20',
control:new Rico.TableColumn.HighlightCell(CustIdCol,CustId,'black','#FBC880')
}, // tipo lic.
{
width:25,
control:new Rico.TableColumn.HighlightCell(CustIdCol,CustId,'black','#FBC880'),
ClassName:'centred'
}, // n. lic.
{
type:'date',
dateFmt:'dd/mm/yyyy',
width:75,
control:new Rico.TableColumn.HighlightCell( CustIdCol,CustId,'black','#FBC880' )
}, // scad. ass.
{
visible:false
}, // log id
{
control:new HighlightCellAndLink(CustIdCol,CustId,'black','#FBC880','/','_blank'),
type:'date',
dateFmt:'dd/mm/yyyy',
width:75
}, // ultimo agg.
{
width:25,
filterUI:'t',
control:new Rico.TableColumn.HighlightCell(CustIdCol,CustId,'black','#FBC880'),
ClassName:'centred'
}, // B
{
width:25,
filterUI:'t',
control:new Rico.TableColumn.HighlightCell(CustIdCol,CustId,'black','#FBC880'),
ClassName:'centred'
}, // L
{
type:'date',
dateFmt:'dd/mm/yyyy',
width:75, control:new Rico.TableColumn.HighlightCell( CustIdCol,CustId,'black','#FBC880' )
}, // ultimo int.
{
type:'date',
dateFmt:'dd/mm/yyyy',
width:75,
control:new Rico.TableColumn.HighlightCell( CustIdCol,CustId,'black','#FBC880' )
}, // data stipula
] };
// Creo un'istanza della LiveGrid
var grid = new Rico.LiveGrid('dataTable', buffer, grid_options);
});
Il codice completo è disponibile visualizzando il sorgente della pagina, dopo una learning curve un pochino ripida vi troverete a lavorare in modo davvero semplice con questo ottimo prodotto.
Happy coding