DataTable Row Expansion was developed by Eric Gelinas. This was originally a concept for Yahoo! APT by Ryan Leffel with designs by Edward Zee.
Sample Code for this Example
Custom CSS for this example:
DataTable RowExpansion extension code:
';
new_row.appendChild( new_column );
var liner_element = new_row.firstChild.firstChild;
if( YAHOO.lang.isString( template ) ){
liner_element.innerHTML = YAHOO.lang.substitute(
template,
expanded_data
);
} else if( YAHOO.lang.isFunction( template ) ) {
template( {
row_element : new_row,
liner_element : liner_element,
data : row_data,
state : state
} );
} else {
return false;
}
//Insert new row
newRow = Dom.insertAfter( new_row, row );
if (newRow.innerHTML.length) {
this._setRecordState( record_id, 'expanded', true );
if( !restore ){
this.a_rowExpansions.push(
this.getRecord(record_id).getId()
);
}
Dom.removeClass( row, CLASS_COLLAPSED );
Dom.addClass( row, CLASS_EXPANDED );
//Fire custom event
this.fireEvent( "rowExpandEvent",
{ record_id : row_data.getId() } );
return true;
} else {
return false;
}
}
},
/**
* Sets the expansion state of a row to collapsed
* @method collapseRow
* @param {Mixed} record_id Record / Row / or Index id
* @return {Boolean} successful
* @type mixed
**/
collapseRow : function( record_id ){
var row_data = this.getRecord( record_id ),
row = Dom.get( row_data.getId() ),
state = row_data.getData( STRING_STATENAME );
if( state && state.expanded ){
var next_sibling = Dom.getNextSibling( row ),
hash_index = indexOf(this.a_rowExpansions, record_id);
if( Dom.hasClass( next_sibling, CLASS_EXPANSION ) ) {
next_sibling.parentNode.removeChild( next_sibling );
this.a_rowExpansions.splice( hash_index, 1 );
this._setRecordState( record_id, 'expanded', false );
Dom.addClass( row, CLASS_COLLAPSED );
Dom.removeClass( row, CLASS_EXPANDED );
//Fire custom event
this.fireEvent("rowCollapseEvent",
{record_id:row_data.getId()});
return true;
} else {
return false;
}
}
},
/**
* Collapses all expanded rows. This should be called before any
* action where the row expansion markup would interfere with
* normal DataTable markup handling. This method does not remove
* events attached during implementation. All event handlers should
* be removed separately.
* @method collapseAllRows
* @type mixed
**/
collapseAllRows : function(){
var rows = this.a_rowExpansions;
for( var i = 0, l = rows.length; l > i; i++ ){
//Always pass 0 since collapseRow
//removes item from the a_rowExpansions array
this.collapseRow( rows[ 0 ] );
}
a_rowExpansions = [];
},
/**
* Restores rows which have an expanded state but no markup. This
* is to be called to restore row expansions after the DataTable
* renders or the collapseAllRows is called.
* @method collapseAllRows
* @type mixed
**/
restoreExpandedRows : function(){
var expanded_rows = this.a_rowExpansions;
if( !expanded_rows.length ){
return;
}
if( this.a_rowExpansions.length ){
for( var i = 0, l = expanded_rows.length; l > i; i++ ){
this.expandRow( expanded_rows[ i ] , true );
}
}
},
/**
* Abstract method which restores row expansion for subscribing to
* the DataTable postRenderEvent.
* @method onEventRestoreRowExpansion
* @param {Object} oArgs context of a subscribed event
* @type mixed
**/
onEventRestoreRowExpansion : function( oArgs ){
this.restoreExpandedRows();
},
/**
* Abstract method which toggles row expansion for subscribing to
* the DataTable postRenderEvent.
* @method onEventToggleRowExpansion
* @param {Object} oArgs context of a subscribed event
* @type mixed
**/
onEventToggleRowExpansion : function( oArgs ){
if(YAHOO.util.Dom.hasClass(oArgs.target,
'yui-dt-expandablerow-trigger')){
this.toggleRowExpansion( oArgs.target );
}
}
}, true //This boolean needed to override members of the original object
);
})();
JavaScript to run this example:
Configuration for This Example
You can load the necessary JavaScript and CSS for this example from Yahoo's servers. Click here to load the YUI Dependency Configurator with all of this example's dependencies preconfigured.