Impaginare tabelle con i CSS

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

Leave a comment