DataTable Control: Complex Example of Multiple Features

このExampleは、これまでのExampleでやってきた、いくつかの要素を組み合わせた例。

state列でのソーティングは、「DataTable Control: Client-side Sorting」でやったのと同じに、state列でソートした後に同じstate内でarea codeでソートする(このカスタム・ソーターは全く同じもの)。また、画面には行数を決めるリストボックスがある。
編集可のNote列は、ダブルクリックで編集モードとなり、編集終了と同時に色が黄色に光って消えるような細工がしてある。
この部分は、編集が行われた行にたいして、YAHOO.util.ColorAnimを適用することで実装されていて、面白い。

基本的に、新しい要素のないExampleではあるが、Ajaxらしい楽しいサンプルとなっている。
以下にHTMLの全文を示す。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8"> 
<title>Ajax Sample</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/paginator/assets/skins/sam/paginator.css" /> 
<link rel="stylesheet" type="text/css" href="scripts/yui/datatable/assets/skins/sam/datatable.css" /> 
<script type="text/javascript" src="scripts/yui/utilities/utilities.js"></script> 
<script type="text/javascript" src="scripts/yui/paginator/paginator-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;
}

</style>

<script type="text/javascript" src="scripts/yui/datatable/assets/js/data.js"></script> 
<script type="text/javascript"> 
YAHOO.util.Event.addListener(window, "load", function() {
	
	YAHOO.example.MultipleFeatures = function() {
		// 列定義
		
		// カスタムのソーター
		// state > area codeでソーティングする。
		// 「DataTable Control: Client-side Sorting」のサンプルと同じ。
		var sortStates = function(a, b, desc) {
        	// Deal with empty values
        	if(!YAHOO.lang.isValue(a)) {
        		return (!YAHOO.lang.isValue(b)) ? 0 : 1;
        	}else if(!YAHOO.lang.isValue(b)) {
            	return -1;
        	}
 
        	var comp = YAHOO.util.Sort.compare;
        	var compState = comp(a.getData("state"), b.getData("state"), desc);
 
            	return (compState !== 0) ? compState : comp(a.getData("areacode"), b.getData("areacode"), desc);
        };

        // 列定義
        var myColumnDefs = [
                 	{	key:"areacode",
                     	label:"Area Codes",
                     	width:100,
                     	resizeable:true,
                     	sortable:true},
                    {	key:"state",
                        label:"States",
                        width:250,
                        resizeable:true,
                        sortable:true,
                        sortOptions:{sortFunction:sortStates}},
                    {	key:"notes",
                        label:"Notes (編集可)",
                        editor:"textbox",
                        resizeable:true,
                        sortable:true}
        ];

        // DataSourceのインスタンス化
        var myDataSource = new YAHOO.util.DataSource(YAHOO.example.Data.areacodes);
        myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY;
        myDataSource.responseSchema = {
            fields: ["areacode","state"]
        };

        // DataTableのコンフィグ属性
        var myConfigs = {
                sortedBy:{key:"areacode",dir:"asc"},
                paginator: 
                    new YAHOO.widget.Paginator({
                    	rowsPerPage: 25,
                    	template: YAHOO.widget.Paginator.TEMPLATE_ROWS_PER_PAGE,
                    	rowsPerPageOptions: [10,25,50,100],
                    	pageLinks: 5
                	})
        };

        // DataTableのインスタンス化
        var myDataTable = new YAHOO.widget.DataTable("complex", myColumnDefs, myDataSource, myConfigs);
		// クリックでハイライトするようにハンドラを設定
        myDataTable.subscribe("rowClickEvent",
                myDataTable.onEventSelectRow);
		// ダブルクリックでセルのエディターを呼ぶ。
        myDataTable.subscribe("cellDblclickEvent",
                myDataTable.onEventShowCellEditor);
		// カーソル・アウトで編集結果を保存する。
        myDataTable.subscribe("editorBlurEvent", 
                myDataTable.onEventSaveCellEditor);

        // 編集&セーブ後のイベントのハンドラー
        var onCellEdit = function(oArgs) {
            // セーブされたTDエレメントを取得
            var elCell = oArgs.editor.getTdEl();
            // 新旧のデータを取得
            var oOldData = oArgs.oldData;
            var oNewData = oArgs.newData;
 
            // 変更が起こった行(TRエレメント)を取得する。
            var elRow = this.getTrEl(elCell);
            // 変更されるのは1行だから、配列の引数は0
            var origColor = YAHOO.util.Dom.getStyle(elRow.cells[0], "backgroundColor");
            var pulseColor = "#ff0";
 
            // 変更が起こった行をカラー・アニメで光らせる
            var rowColorAnim = new YAHOO.util.ColorAnim(elRow.cells, 
                    {
                	// 黄色から元の色(選択されているので青)に2秒間で変化する。
                    backgroundColor:{to:origColor, from:pulseColor}, 
                    duration:2
                    }
            );

			// バックグラウンドカラーを青から(指定されていない状態に)戻す。
            var onComplete = function() {
                rowColorAnim = null;
                YAHOO.util.Dom.setStyle(elRow.cells, "backgroundColor", "");
            }
            // カラー・アニメの終わりに、色を戻すハンドラ(上)を仕込む。
            rowColorAnim.onComplete.subscribe(onComplete);
            rowColorAnim.animate();
        }
        // 編集&セーブ後のイベントに上の関数を仕込む
        myDataTable.subscribe("editorSaveEvent", onCellEdit);
        
        return {
            oDS: myDataSource,
            oDT: myDataTable
       };
    }();
});
</script>
</head> 
 
<body class=" yui-skin-sam">
<div id="main">
<p>いくつかのオプションを加えたサンプルです。<br/>
編集可能な部分はダブルクリックで変更できます。変更すると色が変わります。</p>
<div id="complex"></div>
</div>
</body> 
</html>