DataTable Control: Nested Headers

Nested Headerとは、入れ子になった見出しのこと。
こういったデータを扱うことはあまり多くはないが、この例のように、あるデータとサマリーが並んでいるようなケースでは確かに必要なフォーマット。
HTMLでかくと、columnをくっつけるという作業になるので、とかく、tableタグの中がグチャグチャになってしまう。

YUIでは、表見出しをオブジェクト・リテラルで表現するので、tableタグで書くよりもスッキリと書くことができる。この際には、(これまで出てきた)key属性ではなく、label属性を定義するだけでよい。key属性は、これまで通り、一番下位の見出しとして定義する。

以下は、サンプル画面。

YUIのサンプルでは、Year to date(その年の1/1から当日まで)がYTDと表現されているが、略記をやめにした。
また、pageはHTMLのページなので、YAHOO.widget.DataTable.formatLinkをフォーマッターとしてみた。

以下にJavascriptを含むHTMLの全文を示す。
scriptは、module patternで書き直した。

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Ajax_Sampling</TITLE>

<style type="text/css">
body {
	margin:0;
	padding:0;
}
</style>

<link rel="stylesheet" type="text/css" href="scripts/yui/fonts/fonts-min.css" /> 
<link rel="stylesheet" type="text/css" href="scripts/yui/datatable/assets/skins/sam/datatable.css" /> 
<script type="text/javascript" src="scripts/yui/yahoo-dom-event/yahoo-dom-event.js"></script> 
<script type="text/javascript" src="scripts/yui/dragdrop/dragdrop-min.js"></script> 
<script type="text/javascript" src="scripts/yui/element/element-beta-min.js"></script> 
<script type="text/javascript" src="scripts/yui/datasource/datasource-min.js"></script> 
<script type="text/javascript" src="scripts/yui/datatable/datatable-min.js"></script> 

<style type="text/css" id="defaultstyle">
#main {
	margin: 2px;
	padding: 3px;
/*	width: 560px;
	height: auto;
	border:1px dashed #999999;*/
} 
</style>

<!--  データテーブルの読み込み  -->
<!-- 
YAHOO.example.Data = {
    webstats: [
        ["home.html",20,400,44,657],
        ["blog.html",24,377,97,567],
        ["contact.html",32,548,42,543],
        ["about.html",8,465,12,946],
        ["pagenotfound.html",0,0,0,0]
    ]
}
-->
<script type="text/javascript" src="scripts/yui/datatable/assets/js/data.js"></script> 
<script type="text/javascript">
YAHOO.namespace("EGP");

YAHOO.EGP.NestedHeaders = function() {
    var myColumnDefs = [
                        // HP名
                        {key:"page", label:"Page", sortable:true, resizeable:true,formatter:YAHOO.widget.DataTable.formatLink},
                        // 統計数値()は、labelで一つにまとめる。数値なので、ここでフォーマッターはまとめて定義してしまう。
                        {label:"Statistics", formatter:YAHOO.widget.DataTable.formatNumber, 
                            children:[
                            {label:"Visits",
                                children: [
                                    {key:"visitsmonth", label:"This Month",sortable:true, resizeable:true},
                                    {key:"visitsytd", label:"Year To Date", abbr:"Year to Date",sortable:true, resizeable:true}
                                ]
                            },
                            {label:"Views",
                                children: [
                                    {key:"viewsmonth", label:"This Month",sortable:true, resizeable:true},
                                    {key:"viewsytd", label:"Year To Date", abbr:"Year to Date",sortable:true, resizeable:true}
                                ]
                            }
                        ]}
                    ];
             
	var myDataTable;
	var myDataSource;
	
	return{
    	init: function() {
			myDataSource = new YAHOO.util.DataSource(YAHOO.example.Data.webstats);    			
    		// 読み込んだデータソースのタイプ(JavascriptのArray)
    		// 祖先DataSourceBaseのAPIドキュメント(http://developer.yahoo.com/yui/docs/YAHOO.util.DataSourceBase.html)
    		// を参照。
        	myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY;
        	myDataSource.responseSchema = {
            	fields: ["page","visitsmonth","visitsytd","viewsmonth","viewsytd"]
        	};
 
        	myDataTable 
        			= new YAHOO.widget.DataTable("nested", 
                				myColumnDefs, 
                				myDataSource,                					
        						{caption:"Statistics of some pages"});
		},
		// おまじない
        oDS: myDataSource,
        oDT: myDataTable
	};
}();
		
//DOMが完全にloadされたら、サンプルを初期化する。
YAHOO.util.Event.onDOMReady(
		//DomReadyイベントで発火するハンドラ
		YAHOO.EGP.NestedHeaders.init,
		//ハンドラに渡すオブジェクト(関数)
		YAHOO.EGP.NestedHeaders,
		//ハンドラは、上記のオブジェクトのスコープをもつ。   
		true
);
</script>
</HEAD>

<BODY class="yui-skin-sam">
<div id="main">
<p>
Nestしたテーブルヘッダーのサンプルです。
</p>
<div id="nested"></div> 
</div>
</BODY>
</HTML>